From b5ce93a4d298a9e10da3ea86e44d4f01daab0bea Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 14:45:27 +0300 Subject: [PATCH 001/152] initial accessory & bridge implementations. added uuid project to contrib/. --- contrib/DaanV2.UUID.Net-master/.gitattributes | 63 +++ contrib/DaanV2.UUID.Net-master/.gitignore | 265 ++++++++++ .../DaanV2.UUID.Net - Standard 2.0.csproj | 20 + .../DaanV2.UUID.Net Core.csproj | 69 +++ .../Classes/UUID/UUID - Get.cs | 57 +++ .../Classes/UUID/UUID - Initialize.cs | 40 ++ .../Classes/UUID/UUID - Nill.cs | 28 ++ .../Classes/UUID/UUID - Operator.cs | 108 ++++ .../Classes/UUID/UUID - Overrides.cs | 67 +++ .../Classes/UUID/UUID - Properties.cs | 25 + .../Classes/UUID/UUID - Variables.cs | 23 + .../DaanV2.UUID.Net Source.projitems | 55 ++ .../DaanV2.UUID.Net Source.shproj | 13 + .../Generator Base - IUUIDGenerator.cs | 43 ++ .../Generator Info - Initialize.cs | 38 ++ .../Generator Info - Properties.cs | 36 ++ .../Generator Info - Variables.cs | 35 ++ .../Converter/Converter - Initialize.cs | 33 ++ .../Converter/Converter - Load.cs | 25 + .../Converter/Converter - To Byte Array.cs | 50 ++ .../Converter/Converter - To Char Array.cs | 66 +++ .../Converter/Converter - Variables.cs | 26 + .../Generator Variant 1 - GeneratorBase.cs | 145 ++++++ .../Generator Variant 1 - Initialize.cs | 26 + .../Generator Variant 1 - Properties.cs | 23 + .../Generator Variant 1 - Variable.cs | 23 + .../Random Generator Base - GeneratorBase.cs | 32 ++ .../Random Generator Base - Initialize.cs | 38 ++ .../Random Generator Base - Properties.cs | 23 + .../Random Generator Base - Variables.cs | 23 + .../Generator Variant 1 - Initialize.cs | 33 ++ ...nerator Variant 1 - RandomGeneratorBase.cs | 77 +++ .../Generator Variant 2 - Initialize.cs | 33 ++ ...nerator Variant 2 - RandomGeneratorBase.cs | 77 +++ .../Generator Variant 1 - GeneratorBase.cs | 145 ++++++ .../Generator Variant 1 - Initialize.cs | 26 + .../Generator Variant 1 - Properties.cs | 23 + .../Generator Variant 1 - Variables.cs | 23 + .../IUUID Generator/IUUID Generator.cs | 45 ++ .../UUID Factory/UUID Factory - Context.cs | 44 ++ .../UUID Factory - Create Generator.cs | 34 ++ .../UUID Factory - Create UUID.cs | 39 ++ .../UUID Factory/UUID Factory - Get.cs | 86 ++++ .../UUID Factory/UUID Factory - Initialize.cs | 28 ++ .../UUID Factory/UUID Factory - Load.cs | 82 +++ .../UUID Factory/UUID Factory - Variables.cs | 23 + .../UUID Validator - Initialize.cs | 25 + .../UUID Validator - Validate.cs | 86 ++++ .../DaanV2.UUID.Net.sln | 120 +++++ .../DaanV2.UUID.Net/DaanV2.UUID.Net.csproj | 119 +++++ .../Properties/AssemblyInfo.cs | 35 ++ .../Debugger.Net Core/Benchmark.cs | 85 ++++ .../Classes/Logger/Logger - Function.cs | 37 ++ .../Classes/Logger/Logger - Initialize.cs | 19 + .../Classes/Logger/Logger - Variables.cs | 8 + .../Debugger.Net Core.csproj | 12 + .../Debugger.Net Core/Program.cs | 33 ++ .../Documentation/Data/Data-x64.csv | 401 +++++++++++++++ .../Documentation/Data/Data-x86.csv | 401 +++++++++++++++ .../Documentation/Data/Data.xlsx | Bin 0 -> 115428 bytes .../Documentation/Data/Graph.png | Bin 0 -> 49250 bytes .../Documentation/Performance.md | 53 ++ contrib/DaanV2.UUID.Net-master/LICENSE.txt | 15 + .../Nuget/DaanV2.UUID.Net.nuspec | 36 ++ .../DaanV2.UUID.Net-master/Nuget/build.bat | 2 + .../Nuget/images/icon.png | Bin 0 -> 16529 bytes .../Overview - Messy.dgml | 458 +++++++++++++++++ contrib/DaanV2.UUID.Net-master/Overview.dgml | 470 ++++++++++++++++++ contrib/DaanV2.UUID.Net-master/README.md | 59 +++ .../UUID.code-workspace | 7 + .../Classes/GeneratorTests/GeneratorTests.cs | 33 ++ .../Unit Test/Classes/NillTest/NillTest.cs | 13 + .../VersionTests/VersionTests - Casting.cs | 41 ++ .../VersionTests/VersionTests - Generic.cs | 66 +++ .../Unit Test/Properties/AssemblyInfo.cs | 19 + .../Unit Test/Unit Test.csproj | 117 +++++ .../Unit Test/packages.config | 5 + smarty.sln | 42 +- src/core/Accessory/Accessory.cs | 28 ++ src/core/Accessory/AccessoryCategory.cs | 45 ++ src/core/Accessory/IAccessory.cs | 18 + src/core/Accessory/IAccessoryBase.cs | 29 ++ src/core/Bridge/Bridge.cs | 38 ++ src/core/Bridge/IBridge.cs | 18 + src/core/Class1.cs | 8 - src/core/smarty.core.csproj | 6 + 86 files changed, 5334 insertions(+), 9 deletions(-) create mode 100644 contrib/DaanV2.UUID.Net-master/.gitattributes create mode 100644 contrib/DaanV2.UUID.Net-master/.gitignore create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj create mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj create mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv create mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv create mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx create mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Graph.png create mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Performance.md create mode 100644 contrib/DaanV2.UUID.Net-master/LICENSE.txt create mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec create mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/build.bat create mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png create mode 100644 contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml create mode 100644 contrib/DaanV2.UUID.Net-master/Overview.dgml create mode 100644 contrib/DaanV2.UUID.Net-master/README.md create mode 100644 contrib/DaanV2.UUID.Net-master/UUID.code-workspace create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj create mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/packages.config create mode 100644 src/core/Accessory/Accessory.cs create mode 100644 src/core/Accessory/AccessoryCategory.cs create mode 100644 src/core/Accessory/IAccessory.cs create mode 100644 src/core/Accessory/IAccessoryBase.cs create mode 100644 src/core/Bridge/Bridge.cs create mode 100644 src/core/Bridge/IBridge.cs delete mode 100644 src/core/Class1.cs diff --git a/contrib/DaanV2.UUID.Net-master/.gitattributes b/contrib/DaanV2.UUID.Net-master/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/contrib/DaanV2.UUID.Net-master/.gitignore b/contrib/DaanV2.UUID.Net-master/.gitignore new file mode 100644 index 0000000..8fba2ef --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/.gitignore @@ -0,0 +1,265 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +Nuget/runtimes +Nuget/lib +nuget.exe + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj new file mode 100644 index 0000000..d43b8ee --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0 + DaanV2.UUID + DaanV2.UUID.Net + AnyCPU;x64;x86 + + + + + + + + + + + + + diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj new file mode 100644 index 0000000..940efbe --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj @@ -0,0 +1,69 @@ + + + + netcoreapp3.1 + DaanV2.UUID + AnyCPU;x64;x86 + false + Daan Verstraten + Daan Verstraten + UUID.Net + UUID.Net + Provides a base class that can handle UUIDs as an object but also the generators to generate any version. + Daan Verstraten 2019 + LICENSE.txt + https://github.com/DaanV2/DaanV2.UUID.Net + https://github.com/DaanV2/DaanV2.UUID.Net.git + git + UUID;UUID3;UUID4;UUID5 + DaanV2.UUID.Net + + + + TRACE;NETCORE + none + false + + + + TRACE;NETCORE + none + false + + + + TRACE;NETCORE + none + false + + + + TRACE;NETCORE + + + + TRACE;NETCORE + + + + TRACE;NETCORE + + + + + True + + + + + + + + + + + + + + + diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs new file mode 100644 index 0000000..4f2e39f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs @@ -0,0 +1,57 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public partial class UUID { + /// Returns the version of this UUID + /// The version number that is stored within the UUID + public Int32 GetVersion() { + Char C = this._Chars[14]; + + if (C >= '0' && C <= '9') { + return C - '0'; + } + + if (C >= 'a' && C <= 'f') { + return C - 'a' + 10; + } + + return -1; + } + + /// Returns the variant of this UUID + /// The variant number that is stored within the UUID + public Int32 GetVariant() { + Char C = this._Chars[19]; + + if (C >= '0' && C < '8') { + return 0; + } + else if (C >= '8' && C <= 'b') { + return 1; + } + else if (C == 'c' || C == 'd') { + return 2; + } + else if (C == 'e' || C == 'f') { + return 3; + } + + return -1; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs new file mode 100644 index 0000000..a1a95b9 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs @@ -0,0 +1,40 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Runtime.Serialization; + +namespace DaanV2.UUID { + /// The class that holds the information of a string + [Serializable, DataContract] + public partial class UUID { + /// Creates a new instance of + public UUID() { + this._Chars = new Char[36]; + } + + /// Creates a new instance of + /// The char values of the + public UUID(Char[] Values) { + this._Chars = Values; + } + + /// Creates a new instance of + /// The string representation of the + public UUID(String Text) { + this._Chars = Text.ToCharArray(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs new file mode 100644 index 0000000..ff0dc41 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs @@ -0,0 +1,28 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public partial class UUID { + /// Returns a 'nill' or empty UUID + public static readonly UUID Nill = new UUID(new Char[] { + '0', '0', '0', '0', '0', '0', '0', '0', '-', + '0', '0', '0', '0', '-', + '0', '0', '0', '0', '-', + '0', '0', '0', '0', '-', + '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' }); + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs new file mode 100644 index 0000000..7f68c64 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs @@ -0,0 +1,108 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public partial class UUID { + + /// Compare two if they are equal to each other + /// The first + /// the second to compare to the first + /// Returns true if two UUID are equal + public static Boolean operator ==(UUID left, UUID right) { + if (Object.ReferenceEquals(left, right)) { + return true; + } + + Boolean Bl = left is Object; + Boolean Br = right is Object; + + if (Bl == Br) { + if (left._Chars.Length != right._Chars.Length) { + return false; + } + + if (Bl) { + for (Int32 I = 0; I < left._Chars.Length; I++) { + if (left._Chars[I] != right._Chars[I]) { + return false; + } + } + + return true; + } + } + + return false; + } + + /// Compare two if they are not equal to each other + /// The first + /// the second to compare to the first + /// Returns true if two UUID are not equal + public static Boolean operator !=(UUID left, UUID right) { + if (Object.ReferenceEquals(left, right)) { + return false; + } + + Boolean Bl = left is Object; + Boolean Br = right is Object; + + if (Bl == Br) { + if (left._Chars.Length != right._Chars.Length) { + return true; + } + + if (Bl) { + for (Int32 I = 0; I < left._Chars.Length; I++) { + if (left._Chars[I] != right._Chars[I]) { + return true; + } + } + + return false; + } + } + + return true; + } + + + /// Auto converts the to a + /// The to convert to + public static implicit operator String(UUID value) { + return value.ToString(); + } + + /// Auto converts the to a + /// The to convert to + public static implicit operator Char[](UUID value) { + return value._Chars; + } + + /// Auto converts the to a + /// The to convert to + public static implicit operator UUID(String value) { + return new UUID(value); + } + + /// Auto converts the to a + /// The to convert to + public static implicit operator UUID(Char[] Values) { + return new UUID(Values); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs new file mode 100644 index 0000000..706287d --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs @@ -0,0 +1,67 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Collections.Generic; + +namespace DaanV2.UUID { + public partial class UUID : IEquatable { + + /// Returns the representation of the UUID + /// Returns a that represents the UUID + public override String ToString() { + return new String(this._Chars); + } + + /// Checks if the given obj is equal to this object + /// The object to compare to + /// Returns if true is the obj is the same as this object + public override Boolean Equals(Object obj) { + if (Object.ReferenceEquals(this, obj)) { + return true; + } + + if (obj is null) { + return false; + } + else if (obj is UUID Same) { + return this._Chars == Same._Chars; + } + else if (obj is Char[] Values) { + return this == Values; + } + + return this._Chars.Equals(obj); + } + + /// Checks if the given is equal to this object + /// The to compare to + /// Returns if true is the obj is the same as this object + public Boolean Equals(UUID other) { + if (other is null) { + return false; + } + + return this == other; + } + + /// Generates the hashcode for this + /// A hashcode for this + public override Int32 GetHashCode() { + return -14269637 + EqualityComparer.Default.GetHashCode(this._Chars); + } + + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs new file mode 100644 index 0000000..0198caa --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs @@ -0,0 +1,25 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Runtime.Serialization; + +namespace DaanV2.UUID { + public partial class UUID { + /// Gets or sets the chars of this + [DataMember] + public Char[] Chars { get => this._Chars; set => this._Chars = value; } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs new file mode 100644 index 0000000..1f52903 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public partial class UUID { + /// Gets or sets the chars of this + private protected Char[] _Chars; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems new file mode 100644 index 0000000..b5c71a6 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems @@ -0,0 +1,55 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 72de337f-6f32-4e42-9ca3-3f4759275e1e + + + DaanV2.UUID + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj new file mode 100644 index 0000000..0b5273c --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj @@ -0,0 +1,13 @@ + + + + 72de337f-6f32-4e42-9ca3-3f4759275e1e + 14.0 + + + + + + + + diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs new file mode 100644 index 0000000..a6fd870 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs @@ -0,0 +1,43 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public abstract partial class GeneratorBase : IUUIDGenerator { + /// Gets the version of the generator + public abstract Int32 Version { get; } + + /// Gets the variant of the generator + public abstract Int32 Variant { get; } + + /// Gets if this generator need context to generate a UUID + public abstract Boolean NeedContext { get; } + + /// Gets the type needed for the context to generate a UUID + public abstract Type ContextType { get; } + + /// Returns a new + /// The context needed to generate this UUID + /// Returns a new + public abstract UUID Generate(Object Context = default); + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + public abstract UUID[] Generate(Int32 Count, Object[] Context = null); + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs new file mode 100644 index 0000000..6e96a2d --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs @@ -0,0 +1,38 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + +namespace DaanV2.UUID.Generators { + /// The class that holds the information of a generator + public partial class GeneratorInfo { + /// Creates a new instance of + public GeneratorInfo() { + this.ContextType = null; + this.NeedContext = false; + this.Variant = 1; + this.Version = 1; + } + + /// Creates a new instance of + /// The generator to copy the info from + public GeneratorInfo(IUUIDGenerator generator) { + this.ContextType = generator.ContextType; + this.NeedContext = generator.NeedContext; + this.Variant = generator.Variant; + this.Version = generator.Version; + this.GeneratorType = generator.GetType(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs new file mode 100644 index 0000000..3fdaac1 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs @@ -0,0 +1,36 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public partial class GeneratorInfo { + + /// Gets or sets the version of the UUID generator + public Int32 Version { get => this._Version; set => this._Version = value; } + + /// Gets or sets the variant of the UUID generator + public Int32 Variant { get => this._Variant; set => this._Variant = value; } + + /// Gets or sets if this needs context to generate s + public Boolean NeedContext { get => this._NeedContext; set => this._NeedContext = value; } + + /// Gets or sets what type this needs to generate a + public Type ContextType { get => this._ContextType; set => this._ContextType = value; } + + /// Gets or sets the type of generator to be used + public Type GeneratorType { get => this._GeneratorType; set => this._GeneratorType = value; } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs new file mode 100644 index 0000000..3910c08 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs @@ -0,0 +1,35 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public partial class GeneratorInfo { + /// The version of the UUID generator + private Int32 _Version; + + /// The variant of the UUID generator + private Int32 _Variant; + + /// Marks if this needs context to generate s + private Boolean _NeedContext; + + /// The type that this needs to generate a + private Type _ContextType; + + /// The type of generator to be used + private Type _GeneratorType; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs new file mode 100644 index 0000000..7bb171f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs @@ -0,0 +1,33 @@ +/* ISC License + + Copyright(c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + /// The class responsible for converting data + public static partial class Converter { + /// Creates a new instance of + static Converter() { + Converter._ToChars = new Char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + Converter._ToByte = new Byte[103, 103]; + + for (Int32 I = 0; I < Converter._ToChars.Length; I++) { + for (Int32 J = 0; J < Converter._ToChars.Length; J++) { + Converter._ToByte[Converter._ToChars[I], Converter._ToChars[J]] = (Byte)((I << 4) | J); + } + } + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs new file mode 100644 index 0000000..f53a37a --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs @@ -0,0 +1,25 @@ +/* ISC License + + Copyright(c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Threading; + +namespace DaanV2.UUID.Generators { + public static partial class Converter { + /// Loads and construct this if it is needed + public static void Load() { + Thread.Sleep(1); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs new file mode 100644 index 0000000..9a315c9 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs @@ -0,0 +1,50 @@ +/* ISC License + + Copyright(c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public static partial class Converter { + /// Converts a to a using hexadecimal + /// The array to convert to , array needs to be 35 items + /// Converts a to a using hexadecimal + public static Byte[] ToBytes(Char[] Chars) { + Byte[,] T = Converter._ToByte; + + return new Byte[] { + T[Chars[0], Chars[1]], + T[Chars[2], Chars[3]], + T[Chars[4], Chars[5]], + T[Chars[6], Chars[7]], + + T[Chars[9], Chars[10]], + T[Chars[11], Chars[12]], + + T[Chars[14], Chars[15]], + T[Chars[16], Chars[17]], + + T[Chars[19], Chars[20]], + T[Chars[21], Chars[22]], + + T[Chars[24], Chars[25]], + T[Chars[26], Chars[27]], + T[Chars[28], Chars[29]], + T[Chars[30], Chars[31]], + T[Chars[32], Chars[33]], + T[Chars[34], Chars[35]] + }; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs new file mode 100644 index 0000000..a788513 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs @@ -0,0 +1,66 @@ +/* ISC License + + Copyright(c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public static partial class Converter { + /// Converts a to using hexidecimal. Size needs to be atleast 16 + /// The that need to be converted to . The size needs to be atleast 16 items + /// Converts a to using hexidecimal. Size needs to be atleast 16 + public static Char[] ToCharArray(Byte[] Bytes) { + Char[] T = Converter._ToChars; + + return new Char[]{ + T[Bytes[0] >> 4], + T[Bytes[0] & 0b0000_1111], + T[Bytes[1] >> 4], + T[Bytes[1] & 0b0000_1111], + T[Bytes[2] >> 4], + T[Bytes[2] & 0b0000_1111], + T[Bytes[3] >> 4], + T[Bytes[3] & 0b0000_1111], + '-', + T[Bytes[4] >> 4], + T[Bytes[4] & 0b0000_1111], + T[Bytes[5] >> 4], + T[Bytes[5] & 0b0000_1111], + '-', + T[Bytes[6] >> 4], + T[Bytes[6] & 0b0000_1111], + T[Bytes[7] >> 4], + T[Bytes[7] & 0b0000_1111], + '-', + T[Bytes[8] >> 4], + T[Bytes[8] & 0b0000_1111], + T[Bytes[9] >> 4], + T[Bytes[9] & 0b0000_1111], + '-', + T[Bytes[10] >> 4], + T[Bytes[10] & 0b0000_1111], + T[Bytes[11] >> 4], + T[Bytes[11] & 0b0000_1111], + T[Bytes[12] >> 4], + T[Bytes[12] & 0b0000_1111], + T[Bytes[13] >> 4], + T[Bytes[13] & 0b0000_1111], + T[Bytes[14] >> 4], + T[Bytes[14] & 0b0000_1111], + T[Bytes[15] >> 4], + T[Bytes[15] & 0b0000_1111], + }; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs new file mode 100644 index 0000000..633d0dc --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs @@ -0,0 +1,26 @@ +/* ISC License + + Copyright(c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators { + public static partial class Converter { + /// An that can be used to convert to using hexidecimal + private static Char[] _ToChars; + + /// An that can be used to convert to using hexidecimal + private static Byte[,] _ToByte; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs new file mode 100644 index 0000000..78999e3 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs @@ -0,0 +1,145 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Text; + +namespace DaanV2.UUID.Generators.Version3 { + public partial class GeneratorVariant1 : GeneratorBase { + /// Gets the version of this + public override Int32 Version => 3; + + /// Gets the variant of this + public override Int32 Variant => 1; + + /// Gets if this Generator needs context to generate a + public override Boolean NeedContext => true; + + /// Gets what type this needs to generate a + public override Type ContextType { get => typeof(String); } + + /// Returns a new + /// The context needed to generate this UUID + /// Returns a new + public override UUID Generate(Object Context = null) { + String Value; + + if (Context == null) { + Value = DateTime.Now.ToString(); + } + else if (Context is String T) { + Value = T; + } + else { + Value = Context.ToString(); + } + + //Compute hash + Byte[] Bytes = this._Hasher.ComputeHash(Encoding.Default.GetBytes(Value)); + + if (Bytes.Length < 16) { + Array.Resize(ref Bytes, 16); + } + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0011_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Generate a with the specified context + /// The text to use to create the + /// The encoding to use for converting to bytes + /// Generate a with the specified context + public UUID Generate(Object Context, Encoding encoding) { + String Value; + + if (Context == null) { + Value = DateTime.Now.ToString(); + } + else if (Context is String T) { + Value = T; + } + else { + Value = Context.ToString(); + } + + //Compute hash + Byte[] Bytes = this._Hasher.ComputeHash(encoding.GetBytes(Value)); + + if (Bytes.Length < 16) { + Array.Resize(ref Bytes, 16); + } + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0011_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + public override UUID[] Generate(Int32 Count, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Out[I] = this.Generate(Out[Index++]); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// The encoding to use for converting to bytes + /// Returns a new collection of + public UUID[] Generate(Int32 Count, Encoding encoding, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Out[I] = this.Generate(Out[Index++], encoding); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + } +} \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs new file mode 100644 index 0000000..a567922 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -0,0 +1,26 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version3 { + /// The UUID Generator Version 3, Variant 1 + public partial class GeneratorVariant1 { + /// Creates a new instance of + public GeneratorVariant1() : base() { + this.Hasher = MD5.Create(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs new file mode 100644 index 0000000..632a4cd --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version3 { + public partial class GeneratorVariant1 { + /// The hasher used to generate the UUID + public MD5 Hasher { get => this._Hasher; set => this._Hasher = value; } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs new file mode 100644 index 0000000..25efa06 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version3 { + public partial class GeneratorVariant1 { + /// The hasher used to generate UUID + private MD5 _Hasher; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs new file mode 100644 index 0000000..14c77e0 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs @@ -0,0 +1,32 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + public abstract partial class RandomGeneratorBase : GeneratorBase { + /// Gets the version of the generator + public abstract override Int32 Version { get; } + + /// Gets the variant of the generator + public abstract override Int32 Variant { get; } + + /// Gets if this needs context to generate s + public override Boolean NeedContext => false; + + /// Gets what type this needs to generate a + public override Type ContextType => typeof(Int32); + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs new file mode 100644 index 0000000..a39c5a2 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs @@ -0,0 +1,38 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + /// An abstract class that has a built in random generator + public abstract partial class RandomGeneratorBase { + /// Creates a new instance of + public RandomGeneratorBase() : base() { + this._NumberGenerator = new Random(); + } + + /// Creates a new instance of + /// The seed used for the random generator + public RandomGeneratorBase(Int32 Seed) : base() { + this._NumberGenerator = new Random(Seed); + } + + /// Creates a new instance of + /// + public RandomGeneratorBase(Random NumberGenerator) : base() { + this._NumberGenerator = NumberGenerator; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs new file mode 100644 index 0000000..ae1f534 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + public abstract partial class RandomGeneratorBase { + /// Gets or sets the random number generator used for generating + public Random NumberGenerator { get => this._NumberGenerator; set => this._NumberGenerator = value; } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs new file mode 100644 index 0000000..a9d20f7 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + public abstract partial class RandomGeneratorBase { + /// The number generator used for generating the + private protected Random _NumberGenerator; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs new file mode 100644 index 0000000..cff54fd --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -0,0 +1,33 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + /// The UUID generator version 4, variant 1 + public partial class GeneratorVariant1 { + + /// Creates a new instance of + public GeneratorVariant1() : base() { } + + /// Creates a new instance of + /// + public GeneratorVariant1(Int32 Seed) : base(Seed) { } + + /// Creates a new instance of + /// + public GeneratorVariant1(Random NumberGenerator) : base(NumberGenerator) { } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs new file mode 100644 index 0000000..cc1639f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs @@ -0,0 +1,77 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + public partial class GeneratorVariant1 : RandomGeneratorBase { + /// Gets the version of the UUID generator + public override Int32 Version => 4; + + /// Gets the variant of the UUID generator + public override Int32 Variant => 1; + + /// Generates a specified by this version and variant format + /// The context needed to generate this UUID can be null + /// A new generated + public override UUID Generate(Object Context = null) { + if (Context is Int32 Value) { + this.NumberGenerator = new Random(Value); + } + + Byte[] Bytes = new Byte[16]; + this._NumberGenerator.NextBytes(Bytes); + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0100_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + public override UUID[] Generate(Int32 Count, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Byte[] Bytes = new Byte[16]; + this._NumberGenerator.NextBytes(Bytes); + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0100_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + Out[I] = new UUID(Converter.ToCharArray(Bytes)); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs new file mode 100644 index 0000000..a5fb593 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs @@ -0,0 +1,33 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + /// The UUID generator Version 4, Variant 2 + public partial class GeneratorVariant2 { + + /// Creates a new instance of + public GeneratorVariant2() : base() { } + + /// Creates a new instance of + /// The seed used in the randomiser + public GeneratorVariant2(Int32 Seed) : base(Seed) { } + + /// Creates a new instance of + /// The random number randomiser + public GeneratorVariant2(Random NumberGenerator) : base(NumberGenerator) { } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs new file mode 100644 index 0000000..5f5ab4f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs @@ -0,0 +1,77 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID.Generators.Version4 { + public partial class GeneratorVariant2 : RandomGeneratorBase { + /// Gets the version of the UUID generator + public override Int32 Version => 4; + + /// Gets the variant of the UUID generator + public override Int32 Variant => 2; + + /// Generates a specified by this version and variant format + /// The context needed to generate this UUID can be null + /// A new generated + public override UUID Generate(Object Context = null) { + if (Context is Int32 Value) { + this.NumberGenerator = new Random(Value); + } + + Byte[] Bytes = new Byte[16]; + this._NumberGenerator.NextBytes(Bytes); + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0100_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0001_1111) | 0b1100_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + public override UUID[] Generate(Int32 Count, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Byte[] Bytes = new Byte[16]; + this._NumberGenerator.NextBytes(Bytes); + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0100_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0001_1111) | 0b1100_0000); + + Out[I] = new UUID(Converter.ToCharArray(Bytes)); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs new file mode 100644 index 0000000..fa9dde9 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs @@ -0,0 +1,145 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Text; + +namespace DaanV2.UUID.Generators.Version5 { + public partial class GeneratorVariant1 : GeneratorBase { + /// Gets the version of the UUID generator + public override Int32 Version => 5; + + /// Gets the variant of the UUID generator + public override Int32 Variant => 1; + + /// Gets if this Generator needs context to generate a + public override Boolean NeedContext => true; + + /// Gets what type this needs to generate a + public override Type ContextType { get => typeof(String); } + + /// Returns a new + /// The context needed to generate this UUID + /// Returns a new + public override UUID Generate(Object Context = null) { + String Value; + + if (Context == null) { + Value = DateTime.Now.ToString(); + } + else if (Context is String T) { + Value = T; + } + else { + Value = Context.ToString(); + } + + //Compute hash + Byte[] Bytes = this._Hasher.ComputeHash(Encoding.Default.GetBytes(Value)); + + if (Bytes.Length < 16) { + Array.Resize(ref Bytes, 16); + } + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0101_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Generate a with the specified context + /// The text to use to create the + /// The encoding to use for converting to bytes + /// Generate a with the specified context + public UUID Generate(Object Context, Encoding encoding) { + String Value; + + if (Context == null) { + Value = DateTime.Now.ToString(); + } + else if (Context is String T) { + Value = T; + } + else { + Value = Context.ToString(); + } + + //Compute hash + Byte[] Bytes = this._Hasher.ComputeHash(encoding.GetBytes(Value)); + + if (Bytes.Length < 16) { + Array.Resize(ref Bytes, 16); + } + + //set version and variant + Bytes[6] = (Byte)((Bytes[6] & 0b0000_1111) | 0b0101_0000); + Bytes[8] = (Byte)((Bytes[8] & 0b0011_1111) | 0b1000_0000); + + return new UUID(Converter.ToCharArray(Bytes)); + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + public override UUID[] Generate(Int32 Count, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Out[I] = this.Generate(Out[Index++]); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// The encoding to use for converting to bytes + /// Returns a new collection of + public UUID[] Generate(Int32 Count, Encoding encoding, Object[] Context = null) { + UUID[] Out = new UUID[Count]; + Int32 Index = 0; + Int32 Max; + + if (Context == null || Context.Length == 0) { + Context = new Object[1]; + } + Max = Context.Length - 1; + + for (Int32 I = 0; I < Count; I++) { + Out[I] = this.Generate(Out[Index++], encoding); + + if (Index > Max) { + Index = 0; + } + } + + return Out; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs new file mode 100644 index 0000000..271436f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -0,0 +1,26 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version5 { + /// The UUID Generator Version 5, Variant 1 + public partial class GeneratorVariant1 { + /// Creates a new instance of + public GeneratorVariant1() { + this._Hasher = SHA1.Create(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs new file mode 100644 index 0000000..4bba064 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version5 { + public partial class GeneratorVariant1 { + /// Gets or sets the hasher used to generate UUID + public SHA1 Hasher { get => this._Hasher; set => this._Hasher = value; } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs new file mode 100644 index 0000000..0bf1677 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System.Security.Cryptography; + +namespace DaanV2.UUID.Generators.Version5 { + public partial class GeneratorVariant1 { + /// The hasher used to generate UUID + private SHA1 _Hasher; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs new file mode 100644 index 0000000..36e0f79 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs @@ -0,0 +1,45 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + /// The interface responsible for determing how a generator should behave + public interface IUUIDGenerator { + + /// Gets the version of the UUID generator + Int32 Version { get; } + + /// Gets the variant of the UUID generator + Int32 Variant { get; } + + /// Gets if this needs context to generate s + Boolean NeedContext { get; } + + /// Gets what type this needs to generate a + Type ContextType { get; } + + /// Returns a new + /// The context needed to generate this UUID + /// Returns a new + UUID Generate(Object Context = default); + + /// Returns a new collection of + /// The amount of UUID to generate + /// The context needed to generate this UUIDs + /// Returns a new collection of + UUID[] Generate(Int32 Count, Object[] Context = default); + } +} \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs new file mode 100644 index 0000000..aaa05e9 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs @@ -0,0 +1,44 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using DaanV2.UUID.Generators; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + + /// Returns the type needed for the generator needs + /// The version of the generator to use + /// The variant of the generator to use + /// Marks if there should be multiple items or single + /// Returns the type needed for the generator needs + public static Type GetContext(Int32 Version, Int32 Variant, Boolean ForMultipleUUIDGeneration = false) { + GeneratorInfo Info = UUIDFactory.GetInfo(Version, Variant); + + return ForMultipleUUIDGeneration ? + Info.ContextType.MakeArrayType() : + Info.ContextType; + } + + /// Returns if the specified generator needs context + /// The version of the generator to use + /// The variant of the generator to use + /// Returns if the specified generator needs context + public static Boolean? NeedContext(Int32 Version, Int32 Variant) { + GeneratorInfo Info = UUIDFactory.GetInfo(Version, Variant); + return Info.NeedContext; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs new file mode 100644 index 0000000..d4e906c --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs @@ -0,0 +1,34 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + /// Creates the specified generator or returns null + /// The version of the generator to create + /// The variant of the generator to create + /// Creates the specified generator or returns null + public static IUUIDGenerator CreateGenerator(Int32 Version, Int32 Variant) { + if (UUIDFactory._Generators.Length <= Version || //No room for version + UUIDFactory._Generators[Version].Length <= Variant || //No room for variant + UUIDFactory._Generators[Version][Variant] == null) { //No type has been filled + throw new ArgumentException($"No such generator with: {Version}.{Variant}"); + } + + return (IUUIDGenerator)Activator.CreateInstance(UUIDFactory._Generators[Version][Variant].GeneratorType); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs new file mode 100644 index 0000000..c89cb11 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs @@ -0,0 +1,39 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + /// Generate a using the specified version and variant + /// The version of the generator + /// The variant of the generator + /// Generate a using the specified version and variant and specified amount + public static UUID CreateUUID(Int32 Version, Int32 Variant, Object Context = default) { + IUUIDGenerator generator = UUIDFactory.CreateGenerator(Version, Variant); + return generator.Generate(Context); + } + + /// Generate a using the specified version and variant and specified amount + /// The amount of UUID to generate + /// The version of the generator + /// The variant of the generator + /// Generate a using the specified version and variant and specified amount + public static UUID[] CreateUUIDs(Int32 Amount, Int32 Version, Int32 Variant, Object[] Context = default) { + IUUIDGenerator generator = UUIDFactory.CreateGenerator(Version, Variant); + return generator.Generate(Amount, Context); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs new file mode 100644 index 0000000..7a5b193 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs @@ -0,0 +1,86 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using DaanV2.UUID.Generators; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + /// Returns an array of available version of generators + /// An array of contaning version numbering + public static Int32[] GetAvailableVersion() { + Int32 Length = UUIDFactory._Generators.Length; + Int32[] Out = new Int32[Length]; + Int32 Index = 0; + + for (Int32 Version = 0; Version < Length; Version++) { + if (UUIDFactory._Generators[Version] != null) { + Out[Index++] = Version; + } + } + + if (Index != Out.Length) { + Array.Resize(ref Out, Index); + } + + return Out; + } + + /// Returns an array of available variants of generators for a specified version + /// The version to check which variants are aviable + /// An array of contaning variant numbering + public static Int32[] GetAvailableVariants(Int32 Version) { + if (UUIDFactory._Generators.Length <= Version) { + throw new ArgumentException($"No such generator with: {Version}"); + } + + GeneratorInfo[] Generators = UUIDFactory._Generators[Version]; + + if (Generators == null || Generators.Length == 0) { + throw new ArgumentException($"No such generator with: {Version}"); + } + + Int32 Length = Generators.Length; + Int32[] Out = new Int32[Length]; + Int32 Index = 0; + + for (Int32 Variant = 0; Variant < Length; Variant++) { + if (Generators[Variant] != null) { + Out[Index++] = Variant; + } + } + + if (Index != Out.Length) { + Array.Resize(ref Out, Index); + } + + return Out; + } + + /// Returns a about the specified generator + /// The version of the generator + /// The variant of the generator + /// Returns a about the specified generator + public static GeneratorInfo GetInfo(Int32 Version, Int32 Variant) { + if (UUIDFactory._Generators.Length <= Version || //No room for version + UUIDFactory._Generators[Version].Length <= Variant || //No room for variant + UUIDFactory._Generators[Version][Variant] == null) { //No type has been filled + throw new ArgumentException($"No such generator with: {Version}.{Variant}"); + } + + return UUIDFactory._Generators[Version][Variant]; + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs new file mode 100644 index 0000000..2236f35 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs @@ -0,0 +1,28 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + +using DaanV2.UUID.Generators; + +namespace DaanV2.UUID { + /// the static class that handles the generations of UUIDs or generators through version numbering + public static partial class UUIDFactory { + /// Creates a new instance of + static UUIDFactory() { + UUIDFactory._Generators = new GeneratorInfo[5][]; + UUIDFactory.Load(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs new file mode 100644 index 0000000..348dc05 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs @@ -0,0 +1,82 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Reflection; +using DaanV2.UUID.Generators; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + /// Loads all s + public static void Load() { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + Int32 Count = assemblies.Length; + + for (Int32 I = 0; I < Count; I++) { + Load(assemblies[I]); + } + } + + /// Loads all s + public static void Load(Assembly asm) { + Type[] types = asm.GetTypes(); + Int32 Count = types.Length; + Type[] Interfaces; + Int32 JCount; + Type Current; + + for (Int32 I = 0; I < Count; I++) { + Current = types[I]; + + if (Current.IsAbstract) { + continue; + } + + Interfaces = Current.GetInterfaces(); + JCount = Interfaces.Length; + + for (Int32 J = 0; J < JCount; J++) { + if (Interfaces[J] == typeof(IUUIDGenerator)) { + IUUIDGenerator Generator = (IUUIDGenerator)Activator.CreateInstance(Current); + Add(Generator); + + break; + } + } + } + } + + /// + /// + public static void Add(IUUIDGenerator Generator) { + Int32 Variant = Generator.Variant; + Int32 Version = Generator.Version; + + if (UUIDFactory._Generators.Length <= Version) { + Array.Resize(ref UUIDFactory._Generators, Version + 1); + } + + if (UUIDFactory._Generators[Version] == null) { + UUIDFactory._Generators[Version] = new GeneratorInfo[Variant + 1]; + } + + if (UUIDFactory._Generators[Version].Length <= Variant) { + Array.Resize(ref UUIDFactory._Generators[Version], Variant + 1); + } + + UUIDFactory._Generators[Version][Variant] = new GeneratorInfo(Generator); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs new file mode 100644 index 0000000..fd8f6ba --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs @@ -0,0 +1,23 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using DaanV2.UUID.Generators; + +namespace DaanV2.UUID { + public static partial class UUIDFactory { + /// The Generators + private static GeneratorInfo[][] _Generators; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs new file mode 100644 index 0000000..846dc6f --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs @@ -0,0 +1,25 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + +namespace DaanV2.UUID { + /// The static class that is responisble for validating UUIDs + public static partial class UUIDValidator { + /// Creates a new instance of + static UUIDValidator() { + + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs new file mode 100644 index 0000000..8125cfd --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs @@ -0,0 +1,86 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace DaanV2.UUID { + public static partial class UUIDValidator { + /// Validates the , Checks if it is properly formatted, right version and variant + /// The to check + /// A that marks if the output was valid or not + public static Boolean IsValidUUID(UUID Value) { + if (Value == UUID.Nill) { + return true; + } + + Char[] Values = Value.Chars; + Char C; + + if (Values.Length != 36) { + return false; + } + + for (Int32 I = 0; I < 36; I++) { + C = Values[I]; + if (!(Char.IsLetterOrDigit(C) || C == '-')) { + return false; + } + } + + if (!(Values[8] == '-' && Values[13] == '-' && Values[18] == '-' && Values[23] == '-')) { + return false; + } + + Int32 Version = Value.GetVersion(); + Int32 Variant = Value.GetVariant(); + + return Version > 0 && Version < 6 && Variant > -1 && Variant < 4; + } + + /// Validates the , Checks if it is properly formatted, right version and variant. throws exeception when an error is encountered + /// The to check + public static void Validate(UUID Value) { + if (Value == UUID.Nill) { + return; + } + + Char[] Values = Value.Chars; + Char C; + + if (Values.Length != 36) { + throw new Exception($"UUID has wrong length: {Values.Length}, should be 36."); + } + + for (Int32 I = 0; I < 36; I++) { + C = Values[I]; + if (!(Char.IsLetterOrDigit(C) || C == '-')) { + throw new Exception($"UUID has invalid character at: {I}: '{C}'."); + } + } + + Int32 Version = Value.GetVersion(); + Int32 Variant = Value.GetVariant(); + + if (Version > 0 && Version < 6) { + if (!(Variant > -1 && Variant < 4)) { + throw new Exception($"UUID has invalid variant: {Variant}, expected one of these values: 0, 1, 2, 3"); + } + } + else { + throw new Exception($"UUID has invalid version: {Version}, expected one of these values: 1, 2, 3, 4, 5"); + } + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln new file mode 100644 index 0000000..c71b993 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln @@ -0,0 +1,120 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29411.108 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{11DEC96A-31A7-414B-9858-86815C90CF13}" + ProjectSection(SolutionItems) = preProject + LICENSE.txt = LICENSE.txt + Overview - Messy.dgml = Overview - Messy.dgml + Overview.dgml = Overview.dgml + Performance.md = Performance.md + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{898452FA-EE0A-48F2-A101-055E150A8D03}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Debugger.Net Core", "Debugger.Net Core\Debugger.Net Core.csproj", "{248BA48A-4504-4CB3-97CA-918D0B250310}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "DaanV2.UUID.Net Source", "DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.shproj", "{72DE337F-6F32-4E42-9CA3-3F4759275E1E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaanV2.UUID.Net Core", "DaanV2.UUID.Net Core\DaanV2.UUID.Net Core.csproj", "{DF1C4870-9749-451B-8888-1F9D57FB0CBD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DaanV2.UUID.Net", "DaanV2.UUID.Net\DaanV2.UUID.Net.csproj", "{C419E0C7-2D37-433E-AD0D-44A319047DDF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unit Test", "Unit Test\Unit Test.csproj", "{9B94E9B5-D328-47EC-A487-8BF61E969EF6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D323591A-620B-4526-9524-759A264CC403}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DaanV2.UUID.Net - Standard 2.0", "DaanV2.UUID.Net - Standard 2.0\DaanV2.UUID.Net - Standard 2.0.csproj", "{1EE541B7-156C-4F01-AD1E-C23184E8245E}" +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{72de337f-6f32-4e42-9ca3-3f4759275e1e}*SharedItemsImports = 13 + DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{c419e0c7-2d37-433e-ad0d-44a319047ddf}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|Any CPU.Build.0 = Debug|Any CPU + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x64.ActiveCfg = Debug|x64 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x64.Build.0 = Debug|x64 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x86.ActiveCfg = Debug|x86 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x86.Build.0 = Debug|x86 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|Any CPU.ActiveCfg = Release|Any CPU + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|Any CPU.Build.0 = Release|Any CPU + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x64.ActiveCfg = Release|x64 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x64.Build.0 = Release|x64 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x86.ActiveCfg = Release|x86 + {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x86.Build.0 = Release|x86 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x64.ActiveCfg = Debug|x64 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x64.Build.0 = Debug|x64 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x86.ActiveCfg = Debug|x86 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x86.Build.0 = Debug|x86 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|Any CPU.Build.0 = Release|Any CPU + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x64.ActiveCfg = Release|x64 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x64.Build.0 = Release|x64 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x86.ActiveCfg = Release|x86 + {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x86.Build.0 = Release|x86 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x64.ActiveCfg = Debug|x64 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x64.Build.0 = Debug|x64 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x86.ActiveCfg = Debug|x86 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x86.Build.0 = Debug|x86 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|Any CPU.Build.0 = Release|Any CPU + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x64.ActiveCfg = Release|x64 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x64.Build.0 = Release|x64 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x86.ActiveCfg = Release|x86 + {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x86.Build.0 = Release|x86 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x64.ActiveCfg = Debug|x64 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x64.Build.0 = Debug|x64 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x86.ActiveCfg = Debug|x86 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x86.Build.0 = Debug|x86 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|Any CPU.Build.0 = Release|Any CPU + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x64.ActiveCfg = Release|x64 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x64.Build.0 = Release|x64 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x86.ActiveCfg = Release|x86 + {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x86.Build.0 = Release|x86 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x64.ActiveCfg = Debug|x64 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x64.Build.0 = Debug|x64 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x86.ActiveCfg = Debug|x86 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x86.Build.0 = Debug|x86 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|Any CPU.Build.0 = Release|Any CPU + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x64.ActiveCfg = Release|x64 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x64.Build.0 = Release|x64 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x86.ActiveCfg = Release|x86 + {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {248BA48A-4504-4CB3-97CA-918D0B250310} = {898452FA-EE0A-48F2-A101-055E150A8D03} + {72DE337F-6F32-4E42-9CA3-3F4759275E1E} = {898452FA-EE0A-48F2-A101-055E150A8D03} + {DF1C4870-9749-451B-8888-1F9D57FB0CBD} = {898452FA-EE0A-48F2-A101-055E150A8D03} + {C419E0C7-2D37-433E-AD0D-44A319047DDF} = {898452FA-EE0A-48F2-A101-055E150A8D03} + {9B94E9B5-D328-47EC-A487-8BF61E969EF6} = {D323591A-620B-4526-9524-759A264CC403} + {1EE541B7-156C-4F01-AD1E-C23184E8245E} = {898452FA-EE0A-48F2-A101-055E150A8D03} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A1F15161-4DBA-4D04-9D21-9E7834457610} + EndGlobalSection +EndGlobal diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj new file mode 100644 index 0000000..d8185e5 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj @@ -0,0 +1,119 @@ + + + + + Debug + AnyCPU + {C419E0C7-2D37-433E-AD0D-44A319047DDF} + Library + Properties + DaanV2.UUID + DaanV2.UUID.Net + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + none + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + none + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\x86\Release\ + TRACE + true + none + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + + + + if $(ConfigurationName) == Release ( + if not exist "$(SolutionDir)Releases\" mkdir "$(SolutionDir)Releases\" + if not exist "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" mkdir "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" + copy "$(TargetDir)*" "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" +) + +set Framework=net48 +if '$(ConfigurationName)' == 'Release' ( + if '$(PlatformName)' == 'AnyCPU' ( + mkdir "$(SolutionDir)Nuget\lib\%25Framework%25\" + copy "$(TargetDir)*" "$(SolutionDir)Nuget\lib\%25Framework%25\" + ) ELSE ( + mkdir "$(SolutionDir)Nuget\runtimes\win10-$(PlatformName)\lib\%25Framework%25\" + copy "$(TargetDir)*" "$(SolutionDir)Nuget\runtimes\win10-$(PlatformName)\lib\%25Framework%25\" + ) +) + + + rd /s /q "$(TargetDir)" +if not exist "$(TargetDir)" mkdir "$(TargetDir)" +if $(ConfigurationName) == Release ( + rd /s /q "$(SolutionDir)Releases\$(ProjectName)-$(PlatformName)\" + if exist "$(SolutionDir)LICENSE.txt" copy "$(SolutionDir)LICENSE.txt" "$(TargetDir)LICENSE.txt" + if exist "$(SolutionDir)README.md" copy "$(SolutionDir)README.md" "$(TargetDir)README.md" + if exist "$(SolutionDir)Include\" copy "$(SolutionDir)Include\" "$(TargetDir)" + if exist "$(ProjectDir)Include\" copy "$(ProjectDir)Include\" "$(TargetDir)" +) + + \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1c2b430 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DaanV2.UUID.Net")] +[assembly: AssemblyDescription("Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4 and 5.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DaanV2.UUID.Net")] +[assembly: AssemblyCopyright("Copyright © Daan Verstraten 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c419e0c7-2d37-433e-ad0d-44a319047ddf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.1.0")] +[assembly: AssemblyFileVersion("1.0.1.0")] diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs new file mode 100644 index 0000000..03848db --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs @@ -0,0 +1,85 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; +using System.Diagnostics; +using DaanV2.UUID; + +namespace Debugger.Net_Core { + /// A class that bench marks all the generators + public partial class Benchmark { + /// Tests the version inside the on amount + /// The version of the generator to test + /// The variant of the generator to test + /// The amount of tests conducted + /// The amount of items per test to generate + public static void Test(Int32 Version, Int32 Variant, Logger dataRecorder, Int32 TestCount = 100, Int32 Count = 1000000) { + Stopwatch stopwatch = new Stopwatch(); + Int64 PreviousMS = 0; + Int64 PreviousTicks = 0; + + + for (Int32 I = 0; I < TestCount; I++) { + stopwatch.Start(); + //Create Alot of UUIDs + UUID[] Temp = UUIDFactory.CreateUUIDs(Count, Version, Variant); + + stopwatch.Stop(); + + //Dispose + Temp = null; + dataRecorder.Add(Version, Variant, stopwatch.ElapsedMilliseconds - PreviousMS, stopwatch.ElapsedTicks - PreviousTicks, Count); + PreviousMS = stopwatch.ElapsedMilliseconds; + PreviousTicks = stopwatch.ElapsedTicks; + GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, true); + Console.Title = $"V{Version}.{Variant}\t-\t{I}/{TestCount}"; + } + + dataRecorder.Flush(); + Benchmark.Output(stopwatch, Version, Variant, TestCount, Count); + } + + /// Tests all possible generators and variants inside this library + public static void TestAll(String Folder) { + Int32[] Versions = UUIDFactory.GetAvailableVersion(); + + String Platform = IntPtr.Size == 4 ? "x86" : "x64"; + Logger dataRecorder = new Logger(Folder + $"Data-{Platform}.csv"); + + for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { + Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); + + for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { + Test(Versions[VersionIndex], Variants[VariantIndex], dataRecorder); + } + } + + dataRecorder.Done(); + } + + /// Outputs the test result of a test onto the console + /// The stopwatch that has recorded the timing + /// The amount of tests conducted + /// The amount of items used per tests + public static void Output(Stopwatch sw, Int32 Version, Int32 Variant, Int32 TestCount, Int32 ItemCount = -1) { + Double MSPerTest = sw.ElapsedMilliseconds / (Double)TestCount; + Double TicksPerTest = sw.ElapsedTicks / (Double)TestCount; + Double MSPerTestPerItem = MSPerTest / ItemCount; + Double TicksPerTestPerItem = TicksPerTest / ItemCount; + + Console.WriteLine($"|{Version:G2} |{Variant:G2} |{MSPerTest:G2} |{TicksPerTest:G2} |{MSPerTestPerItem:G2} |{TicksPerTestPerItem:G2} |"); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs new file mode 100644 index 0000000..ac1f525 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs @@ -0,0 +1,37 @@ +using System; +using System.Diagnostics; +using DaanV2.UUID; + +namespace Debugger.Net_Core { + public partial class Logger { + /// + /// + /// + /// + /// + /// + /// + public void Add(Int32 Version, Int32 Variant, Int64 Millisseconds, Int64 Ticks, Int32 ItemCount) { + this._Writer.WriteLine($"{Version}|{Variant}|{Millisseconds}|{Ticks}|{ItemCount}"); + } + + /// + /// + /// + /// + /// + /// + public void Add(IUUIDGenerator Generator, Stopwatch sw, Int32 ItemCount) { + this.Add(Generator.Version, Generator.Variant, sw.ElapsedMilliseconds, sw.ElapsedTicks, ItemCount); + } + + public void Done() { + this._Writer.Flush(); + this._Writer.Close(); + } + + public void Flush() { + this._Writer.Flush(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs new file mode 100644 index 0000000..0f4cff8 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs @@ -0,0 +1,19 @@ +using System; +using System.IO; + +namespace Debugger.Net_Core { + ///DOLATER add description for class: Logger + public partial class Logger { + /// Creates a new instance of + public Logger(String Filepath) { + this._Writer = new StreamWriter(Filepath, false); + this._Writer.WriteLine("Version|Variant|Milliseconds|Ticks|ItemCount"); + } + + /// + ~Logger() { + this._Writer.Flush(); + this._Writer.Close(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs new file mode 100644 index 0000000..f8c378a --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs @@ -0,0 +1,8 @@ +using System.IO; + +namespace Debugger.Net_Core { + public partial class Logger { + /// + private StreamWriter _Writer; + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj new file mode 100644 index 0000000..20692dd --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp3.0 + Debugger.Net_Core + AnyCPU;x64;x86 + + + + + diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs new file mode 100644 index 0000000..40632cd --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs @@ -0,0 +1,33 @@ +/*ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ +using System; + +namespace Debugger.Net_Core { + internal class Program { + private static String _Folder = AppDomain.CurrentDomain.BaseDirectory; + + private static void Main(String[] args) { + if (!_Folder.EndsWith("\\")) { + _Folder += "\\"; + } + + Benchmark.TestAll(_Folder); + + Console.WriteLine("Done"); + Console.ReadLine(); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv new file mode 100644 index 0000000..66201a8 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv @@ -0,0 +1,401 @@ +Version|Variant|Milliseconds|Ticks|ItemCount +3|1|972|9729994|1000000 +3|1|997|9962707|1000000 +3|1|809|8088348|1000000 +3|1|945|9453207|1000000 +3|1|790|7904149|1000000 +3|1|951|9504784|1000000 +3|1|851|8516288|1000000 +3|1|969|9683684|1000000 +3|1|899|8988836|1000000 +3|1|970|9706743|1000000 +3|1|911|9106555|1000000 +3|1|979|9784706|1000000 +3|1|930|9306945|1000000 +3|1|976|9755178|1000000 +3|1|900|9006955|1000000 +3|1|1045|10449591|1000000 +3|1|1026|10251681|1000000 +3|1|974|9742712|1000000 +3|1|917|9171229|1000000 +3|1|1001|10009384|1000000 +3|1|911|9114430|1000000 +3|1|982|9814484|1000000 +3|1|898|8983345|1000000 +3|1|974|9743419|1000000 +3|1|924|9238430|1000000 +3|1|981|9804244|1000000 +3|1|898|8987352|1000000 +3|1|992|9920588|1000000 +3|1|942|9410120|1000000 +3|1|993|9938542|1000000 +3|1|919|9190353|1000000 +3|1|987|9866377|1000000 +3|1|930|9302129|1000000 +3|1|963|9631009|1000000 +3|1|905|9048294|1000000 +3|1|909|9087240|1000000 +3|1|787|7869615|1000000 +3|1|851|8513293|1000000 +3|1|789|7889173|1000000 +3|1|850|8501445|1000000 +3|1|828|8280087|1000000 +3|1|930|9295004|1000000 +3|1|852|8520853|1000000 +3|1|948|9483229|1000000 +3|1|852|8516103|1000000 +3|1|1018|10183932|1000000 +3|1|869|8691865|1000000 +3|1|860|8595725|1000000 +3|1|793|7928279|1000000 +3|1|858|8581694|1000000 +3|1|858|8585415|1000000 +3|1|1031|10304741|1000000 +3|1|986|9861706|1000000 +3|1|973|9729376|1000000 +3|1|920|9199603|1000000 +3|1|1057|10568590|1000000 +3|1|1080|10802615|1000000 +3|1|1025|10253514|1000000 +3|1|992|9911381|1000000 +3|1|1050|10506716|1000000 +3|1|951|9510232|1000000 +3|1|1021|10210978|1000000 +3|1|920|9193728|1000000 +3|1|1015|10152138|1000000 +3|1|967|9673604|1000000 +3|1|1050|10494338|1000000 +3|1|959|9587029|1000000 +3|1|1021|10215701|1000000 +3|1|945|9449413|1000000 +3|1|945|9449721|1000000 +3|1|795|7947455|1000000 +3|1|890|8899893|1000000 +3|1|844|8445315|1000000 +3|1|891|8903766|1000000 +3|1|917|9178504|1000000 +3|1|906|9059814|1000000 +3|1|798|7972638|1000000 +3|1|845|8451708|1000000 +3|1|788|7878431|1000000 +3|1|846|8467569|1000000 +3|1|786|7851717|1000000 +3|1|845|8457112|1000000 +3|1|790|7898620|1000000 +3|1|905|9047875|1000000 +3|1|908|9076984|1000000 +3|1|1360|13602071|1000000 +3|1|911|9113616|1000000 +3|1|980|9798557|1000000 +3|1|920|9198881|1000000 +3|1|966|9663308|1000000 +3|1|908|9079845|1000000 +3|1|1009|10089359|1000000 +3|1|923|9226517|1000000 +3|1|978|9776452|1000000 +3|1|915|9153633|1000000 +3|1|858|8576093|1000000 +3|1|815|8150439|1000000 +3|1|852|8519143|1000000 +3|1|784|7841402|1000000 +3|1|853|8530946|1000000 +4|1|483|4835531|1000000 +4|1|531|5306884|1000000 +4|1|490|4902179|1000000 +4|1|540|5396387|1000000 +4|1|490|4906409|1000000 +4|1|523|5228443|1000000 +4|1|487|4871142|1000000 +4|1|530|5300458|1000000 +4|1|529|5287021|1000000 +4|1|554|5542524|1000000 +4|1|484|4836087|1000000 +4|1|508|5080324|1000000 +4|1|480|4798597|1000000 +4|1|515|5153183|1000000 +4|1|489|4891993|1000000 +4|1|505|5044195|1000000 +4|1|500|5005189|1000000 +4|1|561|5603503|1000000 +4|1|546|5461488|1000000 +4|1|559|5595668|1000000 +4|1|538|5382356|1000000 +4|1|555|5546908|1000000 +4|1|551|5512089|1000000 +4|1|559|5582190|1000000 +4|1|551|5519124|1000000 +4|1|558|5575370|1000000 +4|1|543|5425974|1000000 +4|1|573|5730146|1000000 +4|1|542|5422328|1000000 +4|1|563|5627104|1000000 +4|1|541|5415422|1000000 +4|1|564|5642688|1000000 +4|1|538|5377115|1000000 +4|1|565|5651540|1000000 +4|1|539|5387318|1000000 +4|1|572|5718458|1000000 +4|1|541|5413817|1000000 +4|1|571|5704227|1000000 +4|1|536|5361061|1000000 +4|1|563|5635074|1000000 +4|1|539|5384644|1000000 +4|1|558|5584605|1000000 +4|1|540|5396464|1000000 +4|1|559|5593043|1000000 +4|1|534|5333963|1000000 +4|1|557|5577697|1000000 +4|1|538|5379234|1000000 +4|1|507|5071794|1000000 +4|1|491|4902940|1000000 +4|1|505|5052265|1000000 +4|1|497|4970806|1000000 +4|1|510|5101874|1000000 +4|1|504|5042470|1000000 +4|1|513|5126066|1000000 +4|1|536|5356427|1000000 +4|1|550|5498589|1000000 +4|1|504|5039890|1000000 +4|1|514|5143374|1000000 +4|1|487|4876102|1000000 +4|1|508|5074465|1000000 +4|1|491|4914693|1000000 +4|1|513|5130506|1000000 +4|1|492|4916211|1000000 +4|1|516|5160615|1000000 +4|1|483|4833194|1000000 +4|1|510|5091100|1000000 +4|1|488|4880596|1000000 +4|1|510|5106769|1000000 +4|1|482|4813416|1000000 +4|1|509|5097465|1000000 +4|1|485|4847649|1000000 +4|1|513|5124393|1000000 +4|1|525|5254807|1000000 +4|1|583|5825052|1000000 +4|1|574|5743914|1000000 +4|1|544|5444434|1000000 +4|1|541|5401538|1000000 +4|1|550|5504208|1000000 +4|1|627|6271674|1000000 +4|1|633|6324211|1000000 +4|1|531|5317509|1000000 +4|1|561|5604158|1000000 +4|1|491|4911207|1000000 +4|1|553|5530928|1000000 +4|1|499|4987019|1000000 +4|1|545|5448543|1000000 +4|1|596|5966522|1000000 +4|1|624|6236801|1000000 +4|1|660|6603834|1000000 +4|1|627|6266103|1000000 +4|1|533|5328909|1000000 +4|1|584|5845200|1000000 +4|1|525|5251847|1000000 +4|1|533|5327989|1000000 +4|1|481|4808144|1000000 +4|1|523|5225583|1000000 +4|1|469|4697758|1000000 +4|1|588|5875590|1000000 +4|1|503|5033889|1000000 +4|1|519|5191239|1000000 +4|2|515|5156935|1000000 +4|2|566|5659265|1000000 +4|2|520|5203539|1000000 +4|2|498|4980121|1000000 +4|2|481|4807668|1000000 +4|2|514|5140875|1000000 +4|2|480|4795324|1000000 +4|2|498|4983284|1000000 +4|2|491|4905563|1000000 +4|2|528|5278922|1000000 +4|2|496|4967465|1000000 +4|2|539|5389765|1000000 +4|2|490|4896876|1000000 +4|2|516|5158542|1000000 +4|2|561|5611559|1000000 +4|2|502|5023623|1000000 +4|2|479|4787247|1000000 +4|2|504|5040088|1000000 +4|2|477|4767852|1000000 +4|2|516|5155945|1000000 +4|2|492|4925260|1000000 +4|2|519|5187261|1000000 +4|2|552|5519359|1000000 +4|2|502|5020664|1000000 +4|2|494|4941461|1000000 +4|2|500|5004103|1000000 +4|2|477|4769491|1000000 +4|2|504|5034255|1000000 +4|2|485|4849182|1000000 +4|2|510|5104296|1000000 +4|2|506|5054447|1000000 +4|2|507|5076615|1000000 +4|2|476|4761847|1000000 +4|2|505|5045889|1000000 +4|2|475|4748321|1000000 +4|2|505|5052335|1000000 +4|2|490|4899885|1000000 +4|2|512|5124288|1000000 +4|2|493|4924711|1000000 +4|2|501|5006964|1000000 +4|2|489|4889083|1000000 +4|2|525|5252320|1000000 +4|2|474|4741192|1000000 +4|2|493|4928720|1000000 +4|2|482|4819461|1000000 +4|2|502|5024128|1000000 +4|2|484|4842306|1000000 +4|2|493|4921860|1000000 +4|2|475|4756575|1000000 +4|2|500|4997301|1000000 +4|2|515|5151007|1000000 +4|2|587|5864991|1000000 +4|2|517|5177546|1000000 +4|2|504|5036418|1000000 +4|2|483|4827039|1000000 +4|2|500|5008534|1000000 +4|2|486|4856242|1000000 +4|2|510|5102544|1000000 +4|2|498|4973887|1000000 +4|2|512|5123517|1000000 +4|2|504|5035533|1000000 +4|2|510|5105602|1000000 +4|2|504|5038067|1000000 +4|2|498|4984788|1000000 +4|2|490|4899796|1000000 +4|2|500|4996361|1000000 +4|2|505|5051642|1000000 +4|2|515|5147071|1000000 +4|2|541|5414960|1000000 +4|2|519|5183183|1000000 +4|2|484|4838753|1000000 +4|2|504|5044951|1000000 +4|2|511|5107806|1000000 +4|2|520|5201064|1000000 +4|2|494|4940912|1000000 +4|2|495|4949355|1000000 +4|2|500|4998528|1000000 +4|2|514|5144916|1000000 +4|2|490|4898725|1000000 +4|2|502|5020220|1000000 +4|2|505|5045230|1000000 +4|2|508|5081754|1000000 +4|2|480|4796760|1000000 +4|2|488|4883577|1000000 +4|2|508|5082045|1000000 +4|2|501|5009923|1000000 +4|2|490|4897567|1000000 +4|2|523|5227151|1000000 +4|2|483|4832563|1000000 +4|2|512|5115868|1000000 +4|2|505|5055350|1000000 +4|2|509|5086258|1000000 +4|2|475|4748505|1000000 +4|2|744|7448062|1000000 +4|2|487|4868121|1000000 +4|2|523|5231351|1000000 +4|2|525|5251037|1000000 +4|2|517|5165433|1000000 +4|2|476|4758016|1000000 +4|2|537|5370557|1000000 +5|1|870|8703205|1000000 +5|1|829|8295593|1000000 +5|1|845|8444012|1000000 +5|1|891|8916214|1000000 +5|1|1165|11647834|1000000 +5|1|1021|10210256|1000000 +5|1|958|9575625|1000000 +5|1|951|9511772|1000000 +5|1|902|9022252|1000000 +5|1|915|9149388|1000000 +5|1|874|8736285|1000000 +5|1|891|8908042|1000000 +5|1|919|9190553|1000000 +5|1|934|9346489|1000000 +5|1|863|8625503|1000000 +5|1|944|9441811|1000000 +5|1|804|8037824|1000000 +5|1|1115|11151823|1000000 +5|1|1262|12621406|1000000 +5|1|929|9288229|1000000 +5|1|781|7807092|1000000 +5|1|839|8390698|1000000 +5|1|836|8358503|1000000 +5|1|938|9381348|1000000 +5|1|800|8005972|1000000 +5|1|878|8781028|1000000 +5|1|805|8042157|1000000 +5|1|874|8746871|1000000 +5|1|834|8340769|1000000 +5|1|957|9567008|1000000 +5|1|1007|10068500|1000000 +5|1|876|8765447|1000000 +5|1|800|7995427|1000000 +5|1|894|8942675|1000000 +5|1|776|7756646|1000000 +5|1|898|8976171|1000000 +5|1|780|7801446|1000000 +5|1|859|8597681|1000000 +5|1|793|7929718|1000000 +5|1|973|9729965|1000000 +5|1|828|8278043|1000000 +5|1|896|8958811|1000000 +5|1|842|8419836|1000000 +5|1|900|8999093|1000000 +5|1|868|8683337|1000000 +5|1|927|9270043|1000000 +5|1|855|8546766|1000000 +5|1|995|9947363|1000000 +5|1|931|9317315|1000000 +5|1|974|9737587|1000000 +5|1|868|8679289|1000000 +5|1|993|9925689|1000000 +5|1|881|8814523|1000000 +5|1|899|8986936|1000000 +5|1|825|8249745|1000000 +5|1|1017|10168802|1000000 +5|1|857|8574630|1000000 +5|1|966|9662828|1000000 +5|1|843|8423362|1000000 +5|1|1348|13485863|1000000 +5|1|1014|10131278|1000000 +5|1|910|9108060|1000000 +5|1|870|8696195|1000000 +5|1|1004|10038147|1000000 +5|1|838|8381722|1000000 +5|1|943|9435498|1000000 +5|1|932|9319286|1000000 +5|1|897|8970383|1000000 +5|1|807|8065512|1000000 +5|1|1277|12772153|1000000 +5|1|1122|11214054|1000000 +5|1|1003|10034306|1000000 +5|1|995|9948299|1000000 +5|1|925|9247187|1000000 +5|1|858|8586313|1000000 +5|1|983|9827453|1000000 +5|1|825|8252433|1000000 +5|1|929|9292372|1000000 +5|1|785|7848971|1000000 +5|1|860|8598279|1000000 +5|1|800|7993300|1000000 +5|1|843|8434166|1000000 +5|1|771|7712424|1000000 +5|1|909|9090436|1000000 +5|1|859|8585875|1000000 +5|1|930|9304338|1000000 +5|1|873|8727873|1000000 +5|1|930|9296881|1000000 +5|1|803|8032559|1000000 +5|1|933|9326784|1000000 +5|1|970|9699083|1000000 +5|1|1176|11764044|1000000 +5|1|846|8456880|1000000 +5|1|1004|10044266|1000000 +5|1|811|8110867|1000000 +5|1|872|8715358|1000000 +5|1|804|8043067|1000000 +5|1|860|8595535|1000000 +5|1|813|8133154|1000000 +5|1|869|8687330|1000000 diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv new file mode 100644 index 0000000..8cc91ca --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv @@ -0,0 +1,401 @@ +Version|Variant|Milliseconds|Ticks|ItemCount +3|1|1322|13229258|1000000 +3|1|1098|10979043|1000000 +3|1|866|8652941|1000000 +3|1|1092|10927575|1000000 +3|1|1136|11356440|1000000 +3|1|1156|11559534|1000000 +3|1|821|8212499|1000000 +3|1|926|9254134|1000000 +3|1|866|8662076|1000000 +3|1|894|8942806|1000000 +3|1|874|8734407|1000000 +3|1|843|8431769|1000000 +3|1|923|9233484|1000000 +3|1|837|8367977|1000000 +3|1|863|8628137|1000000 +3|1|837|8373452|1000000 +3|1|878|8774932|1000000 +3|1|832|8319989|1000000 +3|1|917|9170300|1000000 +3|1|878|8781368|1000000 +3|1|898|8980954|1000000 +3|1|847|8467667|1000000 +3|1|879|8798801|1000000 +3|1|841|8405782|1000000 +3|1|866|8661907|1000000 +3|1|1003|10025078|1000000 +3|1|841|8416504|1000000 +3|1|918|9180246|1000000 +3|1|843|8429581|1000000 +3|1|888|8881046|1000000 +3|1|870|8697643|1000000 +3|1|871|8705027|1000000 +3|1|826|8266466|1000000 +3|1|884|8831486|1000000 +3|1|816|8161718|1000000 +3|1|873|8730430|1000000 +3|1|847|8468454|1000000 +3|1|860|8605890|1000000 +3|1|878|8782500|1000000 +3|1|832|8316753|1000000 +3|1|865|8646997|1000000 +3|1|827|8268377|1000000 +3|1|882|8822722|1000000 +3|1|829|8287959|1000000 +3|1|902|9025742|1000000 +3|1|828|8276383|1000000 +3|1|897|8974989|1000000 +3|1|849|8486946|1000000 +3|1|892|8915728|1000000 +3|1|833|8337177|1000000 +3|1|987|9863283|1000000 +3|1|877|8767949|1000000 +3|1|905|9059579|1000000 +3|1|935|9349863|1000000 +3|1|883|8827813|1000000 +3|1|1094|10941752|1000000 +3|1|1013|10126353|1000000 +3|1|926|9261465|1000000 +3|1|849|8483558|1000000 +3|1|926|9260553|1000000 +3|1|881|8812004|1000000 +3|1|925|9255630|1000000 +3|1|895|8941686|1000000 +3|1|936|9364427|1000000 +3|1|836|8363489|1000000 +3|1|975|9751065|1000000 +3|1|877|8769985|1000000 +3|1|877|8766292|1000000 +3|1|901|9011836|1000000 +3|1|938|9376285|1000000 +3|1|915|9150575|1000000 +3|1|865|8653240|1000000 +3|1|917|9163523|1000000 +3|1|878|8781668|1000000 +3|1|1059|10595013|1000000 +3|1|1016|10159611|1000000 +3|1|943|9427546|1000000 +3|1|858|8584786|1000000 +3|1|865|8642225|1000000 +3|1|846|8460988|1000000 +3|1|856|8562996|1000000 +3|1|880|8797002|1000000 +3|1|821|8214208|1000000 +3|1|870|8694310|1000000 +3|1|828|8278414|1000000 +3|1|967|9674935|1000000 +3|1|964|9644143|1000000 +3|1|893|8925184|1000000 +3|1|822|8219131|1000000 +3|1|867|8669376|1000000 +3|1|823|8235633|1000000 +3|1|943|9421817|1000000 +3|1|858|8587036|1000000 +3|1|855|8547880|1000000 +3|1|945|9452449|1000000 +3|1|886|8856854|1000000 +3|1|923|9232883|1000000 +3|1|849|8487037|1000000 +3|1|936|9358396|1000000 +3|1|1043|10431491|1000000 +4|1|521|5218188|1000000 +4|1|516|5158510|1000000 +4|1|485|4846013|1000000 +4|1|515|5156427|1000000 +4|1|481|4804498|1000000 +4|1|516|5156948|1000000 +4|1|462|4629295|1000000 +4|1|502|5013110|1000000 +4|1|467|4671025|1000000 +4|1|505|5053299|1000000 +4|1|489|4891932|1000000 +4|1|510|5097664|1000000 +4|1|476|4753940|1000000 +4|1|508|5087941|1000000 +4|1|466|4656704|1000000 +4|1|508|5082452|1000000 +4|1|471|4710115|1000000 +4|1|509|5085329|1000000 +4|1|475|4755036|1000000 +4|1|522|5214048|1000000 +4|1|490|4903762|1000000 +4|1|530|5299205|1000000 +4|1|529|5285807|1000000 +4|1|595|5955185|1000000 +4|1|481|4804189|1000000 +4|1|581|5811381|1000000 +4|1|633|6334647|1000000 +4|1|591|5905282|1000000 +4|1|510|5103406|1000000 +4|1|517|5168725|1000000 +4|1|457|4574683|1000000 +4|1|515|5148525|1000000 +4|1|462|4621447|1000000 +4|1|502|5018372|1000000 +4|1|465|4652774|1000000 +4|1|495|4949022|1000000 +4|1|454|4536522|1000000 +4|1|497|4972755|1000000 +4|1|461|4603930|1000000 +4|1|497|4971083|1000000 +4|1|473|4734200|1000000 +4|1|530|5298091|1000000 +4|1|481|4812658|1000000 +4|1|497|4963351|1000000 +4|1|460|4601814|1000000 +4|1|501|5013371|1000000 +4|1|458|4576667|1000000 +4|1|501|5008568|1000000 +4|1|478|4780537|1000000 +4|1|508|5078397|1000000 +4|1|463|4630714|1000000 +4|1|497|4971791|1000000 +4|1|469|4690578|1000000 +4|1|492|4917963|1000000 +4|1|458|4587500|1000000 +4|1|528|5279887|1000000 +4|1|465|4642761|1000000 +4|1|503|5031706|1000000 +4|1|487|4872536|1000000 +4|1|517|5167085|1000000 +4|1|483|4836420|1000000 +4|1|503|5026729|1000000 +4|1|475|4746988|1000000 +4|1|503|5032560|1000000 +4|1|464|4634861|1000000 +4|1|507|5075472|1000000 +4|1|477|4768355|1000000 +4|1|512|5123320|1000000 +4|1|462|4615231|1000000 +4|1|505|5047623|1000000 +4|1|488|4885136|1000000 +4|1|502|5015020|1000000 +4|1|456|4566806|1000000 +4|1|506|5059428|1000000 +4|1|457|4570223|1000000 +4|1|514|5140422|1000000 +4|1|481|4810363|1000000 +4|1|550|5493294|1000000 +4|1|493|4938137|1000000 +4|1|507|5068797|1000000 +4|1|461|4605888|1000000 +4|1|512|5125107|1000000 +4|1|453|4521376|1000000 +4|1|536|5365260|1000000 +4|1|463|4626069|1000000 +4|1|517|5169587|1000000 +4|1|455|4553999|1000000 +4|1|527|5264352|1000000 +4|1|461|4613287|1000000 +4|1|553|5527992|1000000 +4|1|471|4709739|1000000 +4|1|514|5147753|1000000 +4|1|468|4673714|1000000 +4|1|499|4994982|1000000 +4|1|455|4544809|1000000 +4|1|512|5125932|1000000 +4|1|464|4640468|1000000 +4|1|507|5066717|1000000 +4|1|460|4598297|1000000 +4|1|502|5016350|1000000 +4|2|467|4675704|1000000 +4|2|507|5067748|1000000 +4|2|460|4599969|1000000 +4|2|505|5055030|1000000 +4|2|476|4752490|1000000 +4|2|505|5055965|1000000 +4|2|474|4735667|1000000 +4|2|503|5036788|1000000 +4|2|473|4726632|1000000 +4|2|510|5096441|1000000 +4|2|462|4627063|1000000 +4|2|506|5057115|1000000 +4|2|481|4804219|1000000 +4|2|506|5066829|1000000 +4|2|462|4613225|1000000 +4|2|513|5132972|1000000 +4|2|497|4967029|1000000 +4|2|499|4993614|1000000 +4|2|464|4643181|1000000 +4|2|504|5034926|1000000 +4|2|466|4662483|1000000 +4|2|505|5051321|1000000 +4|2|468|4675880|1000000 +4|2|507|5067997|1000000 +4|2|465|4659063|1000000 +4|2|505|5042914|1000000 +4|2|465|4648789|1000000 +4|2|512|5120830|1000000 +4|2|511|5115836|1000000 +4|2|583|5831906|1000000 +4|2|504|5034127|1000000 +4|2|517|5167282|1000000 +4|2|464|4640354|1000000 +4|2|545|5452304|1000000 +4|2|494|4942480|1000000 +4|2|533|5333811|1000000 +4|2|468|4676830|1000000 +4|2|506|5057162|1000000 +4|2|479|4789279|1000000 +4|2|518|5176956|1000000 +4|2|467|4673138|1000000 +4|2|523|5230750|1000000 +4|2|481|4806917|1000000 +4|2|515|5155908|1000000 +4|2|478|4773300|1000000 +4|2|512|5124691|1000000 +4|2|465|4652381|1000000 +4|2|513|5123986|1000000 +4|2|483|4831030|1000000 +4|2|515|5155913|1000000 +4|2|477|4762032|1000000 +4|2|516|5159749|1000000 +4|2|460|4602368|1000000 +4|2|507|5077278|1000000 +4|2|478|4775101|1000000 +4|2|511|5112009|1000000 +4|2|470|4701318|1000000 +4|2|521|5211893|1000000 +4|2|513|5129971|1000000 +4|2|527|5267399|1000000 +4|2|477|4772224|1000000 +4|2|509|5081238|1000000 +4|2|468|4686371|1000000 +4|2|506|5058789|1000000 +4|2|475|4752828|1000000 +4|2|506|5056419|1000000 +4|2|473|4726518|1000000 +4|2|516|5165411|1000000 +4|2|489|4891580|1000000 +4|2|516|5157791|1000000 +4|2|464|4637127|1000000 +4|2|506|5062248|1000000 +4|2|457|4567244|1000000 +4|2|516|5165428|1000000 +4|2|460|4592291|1000000 +4|2|520|5207665|1000000 +4|2|497|4963294|1000000 +4|2|529|5289937|1000000 +4|2|496|4967667|1000000 +4|2|566|5659985|1000000 +4|2|495|4948860|1000000 +4|2|517|5165739|1000000 +4|2|462|4624687|1000000 +4|2|509|5081876|1000000 +4|2|466|4664723|1000000 +4|2|510|5100132|1000000 +4|2|478|4780998|1000000 +4|2|532|5317222|1000000 +4|2|457|4568510|1000000 +4|2|501|5009054|1000000 +4|2|457|4575318|1000000 +4|2|510|5098275|1000000 +4|2|471|4713693|1000000 +4|2|520|5195624|1000000 +4|2|477|4772549|1000000 +4|2|508|5078598|1000000 +4|2|467|4667053|1000000 +4|2|512|5124828|1000000 +4|2|476|4759400|1000000 +4|2|507|5063549|1000000 +5|1|928|9282494|1000000 +5|1|969|9689715|1000000 +5|1|888|8879241|1000000 +5|1|944|9442322|1000000 +5|1|912|9123536|1000000 +5|1|1163|11624500|1000000 +5|1|1011|10116416|1000000 +5|1|1013|10123347|1000000 +5|1|1059|10597627|1000000 +5|1|968|9679468|1000000 +5|1|964|9636152|1000000 +5|1|1071|10711401|1000000 +5|1|880|8801006|1000000 +5|1|952|9515903|1000000 +5|1|894|8943786|1000000 +5|1|986|9860998|1000000 +5|1|1024|10239285|1000000 +5|1|1000|9999357|1000000 +5|1|921|9208665|1000000 +5|1|976|9756615|1000000 +5|1|1073|10732471|1000000 +5|1|959|9594141|1000000 +5|1|926|9251620|1000000 +5|1|946|9463539|1000000 +5|1|910|9105093|1000000 +5|1|995|9950793|1000000 +5|1|1070|10698720|1000000 +5|1|1004|10033036|1000000 +5|1|1028|10286016|1000000 +5|1|974|9737518|1000000 +5|1|879|8790374|1000000 +5|1|921|9213868|1000000 +5|1|902|9018512|1000000 +5|1|942|9416892|1000000 +5|1|894|8936499|1000000 +5|1|967|9674103|1000000 +5|1|916|9161499|1000000 +5|1|952|9514603|1000000 +5|1|898|8983671|1000000 +5|1|928|9279915|1000000 +5|1|882|8818612|1000000 +5|1|963|9629740|1000000 +5|1|880|8801669|1000000 +5|1|998|9980920|1000000 +5|1|945|9454051|1000000 +5|1|1035|10349925|1000000 +5|1|897|8960897|1000000 +5|1|928|9280812|1000000 +5|1|905|9055383|1000000 +5|1|950|9493343|1000000 +5|1|907|9074808|1000000 +5|1|955|9547697|1000000 +5|1|954|9544908|1000000 +5|1|975|9751194|1000000 +5|1|937|9364555|1000000 +5|1|1044|10441659|1000000 +5|1|928|9275709|1000000 +5|1|930|9306847|1000000 +5|1|883|8824859|1000000 +5|1|935|9357168|1000000 +5|1|868|8676843|1000000 +5|1|923|9232610|1000000 +5|1|920|9199618|1000000 +5|1|948|9477288|1000000 +5|1|915|9151384|1000000 +5|1|939|9382998|1000000 +5|1|877|8770472|1000000 +5|1|943|9436157|1000000 +5|1|913|9124004|1000000 +5|1|944|9442777|1000000 +5|1|923|9232767|1000000 +5|1|967|9672167|1000000 +5|1|917|9169196|1000000 +5|1|1013|10131141|1000000 +5|1|995|9942936|1000000 +5|1|1066|10659196|1000000 +5|1|936|9363548|1000000 +5|1|955|9548006|1000000 +5|1|895|8949452|1000000 +5|1|946|9462609|1000000 +5|1|914|9136059|1000000 +5|1|922|9222865|1000000 +5|1|887|8870598|1000000 +5|1|924|9245239|1000000 +5|1|883|8822878|1000000 +5|1|951|9514644|1000000 +5|1|927|9272521|1000000 +5|1|942|9410642|1000000 +5|1|889|8894084|1000000 +5|1|950|9496213|1000000 +5|1|900|9001600|1000000 +5|1|940|9404610|1000000 +5|1|894|8935771|1000000 +5|1|925|9256862|1000000 +5|1|875|8744179|1000000 +5|1|919|9193606|1000000 +5|1|1230|12300197|1000000 +5|1|1044|10434687|1000000 +5|1|908|9088032|1000000 +5|1|940|9395282|1000000 diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c468257006e3fb2b578dacdc23c24be42891561e GIT binary patch literal 115428 zcmeFYbzdCMwl9pk6Wk@iCAeE~5?q2yAh_$`?(PuW9fG_25C|STxV!spetSQkyU%mZ zJ2-d#sQym(s#R61mR8Rw%0a`tgMfoTfPjFYfY`E4y`6-FfVcy`VnZN6X@9b{aWb)S z(pLr9nKe{wTt7Ad`4$Q?Ilic52sy26 zs++H%=h$K8+hK<^j(4s3QLAYb+A}A&;(hzp30{W?*;ljua*cr5;L6ly_Mrlbren%x zvR2qt_@KI?mpTJ$kl$u-KTe45Z#aZu= zD8*Q{!o`1{OBL(gmvLtiiY0&iv+tWdd`EWw5f4zj&V zhyi?h8hg27eq+WVNT-4Sb(s`T^ z^D8!4_S%S49tm{2z=VQKE`c;eQ4%Dv2LbLB#kRb-VwXxmorx1POAEXwwY>s+w;cNo z7j1#mUQEXm`lN=E!1lYdU*LPk8VbTtZRKdJi>c+SkP@wm`C@$)k>6xRiph6~Pq3~A z7^`=oG-kt4V@oE|()gg2$sVB#^(5_8uLo6Yn|$;{MzVD`=%wEDNoR7(P?XJD6BGvM|53 z|IY*bFE;!CSb9bL7ll4nl;Bh8r;y>>*_BufF*#RJ={5>gZ(o^Z^oFQ>YNC}c8e$Ap z!T@L~pAPS*(WMoEsDojOn+=YN2&{MfRE@5c!6^^+&hYdf9FisNE7tolU1qOmZ_=b> zL9{L%G4$olCAo4VYgCfc=i)yxCYUt{5wQ!2gK-7Z{ImwYXs#OFRYA^*sT@}Z*EDhG z93)Kq@R?68+D8=*<^6m#m4-9yXk@xjO2YYPQJgi{7l`I5zvZEC`gqj{D6=*$RTffJ%sCi zKT#jIvRc$vkd2x$ZLBW96;G4UY`4uaxbJyBv*>ik{_D%;6WF0saIDC2zW)oKOhk3L zAwchu1v`eeF6yy`_%V$Jku8Ep5B-W z&)xC|4KnStaQXGpl5N+GZD}hs!pm_iyYOJA4N}e%jpEfm9$8)*AnU~CL9opE>aVuq zofYxuyejj1)7Il=VY+xvT)YuOE{5g$`^NK^{dbxTUOeN=ffdi(_utZX!oYq%u&Sz0 zOa+bxxFgD&@#mB8jhj|ab+e1RCM+~SHy&(G&N{CLA4a?~Xy%8^mH0JRb#6D^ZYGaB z@9Y-WTBO4di$R^~t0$9`o!%cWH|AB^`~2wB97smu6H*!7#ZHR5uX`cXX|JFibsjOVef+$9SoKo%OC9rU3D|CnR+7p!?yA9` zdSH)IqTf$W?;g1Hgu6De9-cgJeX_H=+<&D^bUC%%^3QkSO*FA&*=leK;p|K$j>pHL z7c*QARN4-ByQiWI+3OuGS4QJ(I&sK8`Q>-sUa`F{EUvK$-u88xx8J?KR{yNg3m8oA z{K-nYkgU^<$Frx>8o*`#6OL8RzY-KgVJ9r!{>EMj5_V-v30Cb&$j zyY$zOtSew@bN2@AcLq@xwBeIZ)*P4H-XTAuZZ?0csAE;5@qt_s_d3cM7HZF78~H)Nz>=cQzH9 zcv#X}zX37Z(l%Q!FI%~JDRYm*Ll1@-;JSP0q0uTNyTq@*#-9sZ)2dG^oV*en+4a}b z6v+yYm*-ve-k!HqpSF8?ap=!tljf}O4O`l!j$g_v8M#)P z;i#}xno)ggI52D{Z`4HFCBmjf+9g0L00R9RWdtky@Ww3s()SQLRb=EP4h$)jS6}+| zbfT$Rkk}lbRB2HaCC04P?B9sinlM-@kqf7Ua1;V799_!qH~+d;*k1b9{0Aam1@65yz%c)TJVVL#=+xI6 zxach9a|3lt>m^zD3PLSmuz&xRv4jbb4{w%ag_O`Ra>rJ58c@0Zkh3TI*%m6iYWV6u zpc|c*z&ipb*IvMmYM-vbgTD=O}% zR-Wlkxc*R3B11F(MOq14q3VY$#jn5i%34(T%b1}w0U1Ghh3wx@K9&OG2VWG~2ea?b z7k^oaBb5Eoe>JGMC|-1H%l386Fl;|6w?6E1%%#LJ3m@GSVNXs1Wff**VLLGUZ*;Z? zggtL+BSj+tYwx7|{{!c;DR*$0?@$jXWt4uB{wL^D`mFTPGay|VtB;$94k{F;fc#{6FhxJ4cv3=!YorhE7{ z-MRd@JfpY4=71>}zD*(czW}%54cCH=`!ClbtCd%RrNBryfCwgQ01^BHM1TQsfB`1| z3&8AWaB)08>I(dYTlvmB$zW0z)0G*3KihD+dS>&ID3v-S7$geZBhvc!Lm1K6RR?6-?3s)h@fLTDTCRv3OsXoW3}dXP;zX zfBQCmbatz(2!jN)eZ8_OhSa}7jTnOjzh_QT-cG)<2T4;^_-slaYD2HSkTvN}K6*(kxBTza4&3gNShV@Z z)D8{Y!jJ<>)tR}tb{k{!~NHuVwWe{l^#Fr%-r1QRUM2PcL zT}{9H%@8j_)Ib?mH%TAQN>oT0S35};PfnCX8TWINHXeg0h%&Bbk|uuKDPNu%%Vi*& z)t@cSX^~i$67!GJ`*?YWd>Lve{%~=uZ~0QxY+M%NCIm#Vlwm))J@caa{}2hyOBx-O z3E9DSP=w7+l3;0)Y`+0w01QwdR!tINtrIr90YU&2z5xQP_0}o$TrquVO6Qp%ab+oO z03^Nv4QYQ%)gbX^NfiLRdjkppm6d-7|6~FYkw~a$mUpubd_RU%k49=f?&zSxp!S2to)1NFZPRS6%m?S?m8-<3R$aJOJ(g?oWH-gauIJ44wvb z1WbC_$J^)aj=6Z<71mf^8EdZX#!ggqaOl|RN%E#OVSj#{U|;r%zAgyr`x2f zh9X14b(>tY#`j_8;%VIMC@G_o$w*NgdTeIK9agV_|7g!*U6AIy{HuM^=wGfscv7V22;83x?H|X``{$_tg zSV+L(lwu&VAEbr_cSSuTS0UZp#ZoRsQBZ{YSx%L*~!;zs0R9vHu0xtYj+Vl z#rE34+lzM&$t>qwK33OFVjo_2*SpS}qS3=VlF)(Y>sR$?DPCHK zKD+c}8(rsp+vcPx&g>jl^iL6YK1WMS)wVu&Czr)Oo!z4jAI=}Oo8&|0{|>%NoGa|_ zybvVhMzXNh2zxhs-X5T*j`8O{Z%Y%6*KsgK@fEU-R~Uxi|U4?31DQ>Nep1aItzCXj`P=`qUP-dc$cK|Jq^EVP7QtrP?R_ zb4ZHt^7!Wo|Lh8swvo-zj8e8fv(hovR^1!1G<(mbA`pXmf?eLIQ+)zkz)MZi>v`Xe z(}IHgkA~H~+n3)LYy9?eRyCe7Mqm#eO=LB7e5NEE$=jAcA8gD$36r)FY04O->Jl4- ze_fhe+h}QCc_`s_>SyrCtl#UO8*7gDldU#Yt7;n7tE%Jc-WvII6`q4qk;~hV|J_e0 z6ZMeI%w+OZLi5CfMqXKcHBVu*x96t0R=uo(Rg0b>@dZNONvuz+5xg@rbOkA_|~Q9!1Kx8w?j@h|(XbT&@emR!h!b@R)NjXZrNu zwOE%7xv?e4@XCt`((8LVLuy|pc~OX znU%Pm@q%VL4a?^9r0A||uo0XTK@i;3p_)3jc7qzCcmrzxmeO4kawJcGWiMejoYqysVfx0X{w(RR7NbXy5QHEFX zwUxPiUb{fu-`(wn?G5zhp%lZydRC9@nTyYXG@s4UufV1m?zSUPw{!e zuu_O8GLz=E52&WaZ#hnmz(-z8k^9LAV77|FYzlErGn2C1le21gs-7xwV(*C+y{z(- zlI;{!U1s6$DuwpN`rp5eB*KfPqW3z_duaVSy=7!5-rYYdkSzzjJSL>jhGN0WdG={Na>iwUv$mL|op$_mK(n=g#)dxIf%%kI9?DA9@8+ zIu~_Am+Q{@!z(#Se8$O_7XMPq3QN{=xbVKDezA@+eKxu2EOig%c_9*?Nmh4!5|q<6 zCqfzyA&Y;%i4s5MFCG@uQ0~n8Lgo5o^7YsvesB$$`})IW+*oSS)M2yKcTbIS)4SVB z=XY)=a~I25?cyP0O-jy(4o^z8g~@{?K50?kYR?SW4b$PB-_2k>zkp>!7X*ZP1Bi{r zV`+=yB8fNuY~Ow3QX>TT-w4qchHVNPP0RwDdVb4jT^MCr_;Xv+^(j-F7qXs+?)4}5 ze8{SdZ$&-M)lCn5;GuEMG`!+2rq5<|-P}z6(~)qjsen1gpEs=3%Tl!9VTv0X%ljl3vTpxbmjV({+4ESD@A<+7N8_=w5T2)nGkdz78=aLji?U1T z9z2xva}i3_Fz>K3dwok8P`a(k=t<#*k2;**+oaj0CD)o!ihojzdU};7RNJFjIA2p> z%Sf7@-}rWQhyO)rvRp$~D9)}!zTD!n^ydCI$Me87a;sj+v5qq3KwN3o?%Ft3rrPZG zmcsG~APNP|1+TQ2`d6Nk842UT+fv(KCmts^JEYXIKiVeK*_?UrQ@`Mmxn7vuc&j}o za$M@rF#enxNvVz;(3m*UpLl$y9e(YdMXm(CO>fQcd{a*O&aqV%6KGY+v89r9tROSm z%DK6Kt)~|FaJtI4m0PU$g#_|1GuvDL>@mQ%O6v&AP#Y8c4o8lHP`143R%aX)wjg?| zWeI!<73P3FXk+YA#LPlgS2{(_;PZ01Hhko)vgDK6Wi$WGm)Kx`KdPwp3#<=5&Q1gg zy2_aw{H3;-i~DyExAK^=xhSPH)~Ld7E_ivl_30^Hf(;(|0x$324cXxNs+pg(V90w;HnP-R|sG(prh~>9{!T)I8 zHu%Vz4&0vRYh~3U5H!s63!ACXT48`!B$>uEcIk{+KCfu1_31h7@sX{9k!fsokd1)h zQncA%m+42PrQq`mU|O5GYUv@88KTNs6q7CQJHU_GEw_OGP}|rl55`H0NkxB6G%;di z+l;6^d2S+77jS(XL&19g$TmLKQXQ8)1Zl7_SEig!{RrNg|FUBXc3V&tAV{+>oK1K} zmT7hOPC{J+$IcjEU61Kz34fpNi12t}^I)mwTxK(zO46es^w7wUdu>NqSe@P5S|e8y z;$$pz2EDM~0=B)No{EZ1e;Ov|sZX{Vnm{3?8C)&wdj9}; zjflqwHX==)hM}Q?XWyHh($5OTr%%1KNE=yZbV#u0kZ9fuKYF|3yhu9eg5K>$b%3k0 zTl87_Mx&`^suw3sgfjLF+vtaK=UO+r>W}vpQG$5_oZxW(QPW=&%RhhsQpW1hMo%V( z0Pd{FS5~WZU3)DWjkj!^vWHt3a=KWy9G}}wA}9tY zZIb;rwzX}iv~Zoa)(K0^=HQBq6RWb`nOu%Y8(0*Bdf^|kq%8ji?DV(jnnE#JN%ftF58 zDOOU}Zhdlpgxr zjwW%D@Y17=F2LVT*m4|X=SyJ0f=*m&n%%>uZcJv(Qq>LaRXfKdlRE77s31+Y z${qHC%<#1YlYFYI^`*UjIW{HjydOR3*w%GwxkYw8HTep{n+($*t#^9*TdVUkXVlm` zZ|b;wvZSlR__1tdBFN*kkd-)$`P6%TwF8CWSzOplMLmfwe|$;G#gl37;s(J-`fBrD zGZ^ODYHwGVI50S`)$=jv@rJG99Ztv9luy?HI`gJ~7R9#XY`e#+`8F}J;|+HB_Ylf2 zH@lxEBN7kAbgbu@Pf6<*ir)7XE*iUOSbq*>4z$BeoKk|eA6GCZMy3*`6@{aDdA0{R0^8) z^h(jQCi#)&F)-&ZU0GRiNy)) zcBCCGz+0x1Y;YI%j?H0~N*y01E6*#;xbXY&Khn0QuHrWy5{**_1XjZruTD06?N+Z#kKawBVz#!XgRYXU?j4B&^&2AkA z@q=ts%fwg`brd_vnL5CtYi5vu`VuODfT{I-NZPtWR|)DZe$tA5$1apv6B5^vt3F}Y zw|AY#?vgRDw|y<)kWPHU%wKME89;bbj&Cq&9i)8J&yI?K%`j_sxKN0HGUo_lNe(tW zkRL~o%LARvNy5R&=Xs{%SHf6oMEWkMnhQwAF8pxEXT_@dWm6`n6dF8b7Dz6;lojsH zKjpLDqAh!gLatQHk>6x`jD*JuB$e~9#y9GEaP20&Y^4?n7^sDlb`*5hHhR@p%hrXt zOK3pU)AZ2NX!f0tES+*Q1cJX$-5Dd+x__%k+AT(2E(akabz$zv<6Xd*^?g>=t_=ff zll7eCC0$bk!&e{y;2>ojwtB{p{E&03(jlRFcy+G72rv3bfig}`0^=5hh}CdGYPq(V zDex5n8`p5;OixI_MJ^CF#WQKjBG>U)P@(Y)IRK+LMvFqlg`~} zpmY3(&_4fPlv*#|FbA9Qvyp#wm}}9~vaGgD6Q_x?>R)gjmEgyJyvg%hmP&3DR-@;7J(~QcCCZ|snY!sIRKWOC z8REZa`kMY()<3g^Ph=cT5D|iaRYWnd;PM`tP*~hZP_Fyy_C)bsabiVziB%AXGSe%n zv+1#Asms1eKX?*fiCzu~axb;H%qDO+@~|xH)K=KzxMk@BF11A#gs#o&;EFeaI+|8$ zRB@p=M7LEVvq`gRI?5sG zkTm`>_c2(09M16owR- zR9~c6+qQ~^Nd>YT!c|?rH+p%Gf76FRv1yb22=krIIr)SM?Vx~#84SuZu{^o{eoZ;CfSXO&T$ zkK~7k28!>(OurindEM<#&zcXIgA93Xd6yEQ!C|vTzR!p$1`5J3;2<{XLkB0UZL?{y z&i!ym7gFfq8n&OT+MF3H#xI>!^O}OV_-W_ZIi%1PyUsFVP7@stRzP%ZWof3i^XHrLLk6<4j+JOqIZ6O@V`G*)VVCZ2hFA_$~ zIfm6t<|OrUh&vXhLO}r5GXaxuaO|y z!cXrPEH2o#V9k4)bol(*8L3&2M;V0H^J6j2A~J2_Y{+&Z{KYWnn^+?^v@LZhLwwwL zBYvdzP?(x`C^8ZCQ9*mrnhBuTS*4~8*k2nBAB(gcnG8TkoAt(MY2~PMHC+DU3s&5| z*I=}D5Nn{Mt)IN6W4U_{B6%M8xjve3uf1P6z_Mel^_xs713oM}w_WQqtMK}9$0m9o z`o)FTC^S5c>WN`ZjUBTWgnsHtVnNc7985FG(JsSv_XXv)!-^^{n{uUzHUl=J!b!5- zLIoy|)xiXXUtUvVEQC_Z`M)e4^ z@8nf{x$zf~H-cCCw{$FSPgA!#Yx0$w~BWpNwKf6(>c8ubbCSO>HLP5+;>mR?O zTYwS+h%svfXjJQB;hQ^!wqeQi7-Ha&qB~4LVGfzI3}xs1a-atPo^Q!gyrCBv+nIrU z(CoSozMZU@r`7_W@r_^ddhb3HOm1tyA;npgR;V+6%^HN4R~w~RAj-<-gX+f5eX`r{ zd+v3r5+G&fx$*9F$GH+AfV*yWE6^G(4??MFx@`MRornI!P)vU?1c4$W-2R@Fd+Gt# zG8FpCXxlL0+o>xbDpVSsNREncuvkN)1~Q2O2%Q+a;e^6cNDu_uTTK_ z-PggC3)0bF&qmei1_I^UF}Kp3i9_~Yg@f?hndq8RRM>Y*XtEe(`#C6?zq@<-=118n z5o>PgwN&ww={A)qheSZL(!DB`(ng@(Fz+WraI&Mc2dM!PxvDnED=zTwt;IG$oOp(Q zYgg5CcNt_CjiYKbHdjF#YY)l9B8uzr>qu^c}UX z5u6G6U}RVdv;LA6p)7Vc*I1JW^Qlz^6>X%~U-8#h9Fcb2QT7dZWa6)brfS-Qr8wi- z8lx-VDX{`A+__M)Mdq5<?nI)Fpqvmv!F3j`}@jvtsn|dOD1(Ud-ROL z>k`O$X>wI|y<-?8TonCE0V?m<`v`vnd@PgT>Qcqc!>>KWhuoT^S!m{2h1YkGc6}IS zUdcBD=>8ZLNv8eiY-A4abU8j1F?LU?fYt9{?`J=BY88z1V2730i) zg*{VQ`)JsYj$2j}$ueJS3w|~_U0WY~$;(2CP(4g78A2~fYfw%n*5aX?Kz2s>6#2It zT^s+nTfl+ychKgO1m_#8YRA6qFq5~)@6~n$>^lwRL-`U+DW%5o?dH0&S9!42x5h|<+d=c5)+f7Pp?5R29 z7e^-otypZ0UA*tr7*+@Uv-yA;mel<6k9v7pn6I7+wcjqMk0LLVFx4Y`_}fw%L*%W z)+K6`%Nex!bYECt!twCrI^6oU>|U$U!pMC+1xW@{T;g35-o?@$vQ=&q6~|f7RqN%_ zt~P#`XOsFc4xU3!8k;Xugg|JvTp+|jg3fS@JuhVZ`?nh*Lq}POB4V?9&~ey13y+>|;_C8&5~T-yF45~uOxSfuALc2uTn11H3mA=$OW;(X34ps(j5Ls15# zE?b6P>xLmpp%;XrcAOjRkDZS>Gw6VW7Sy?tx z+mEx&;`-u6@Qu4SL_$(8Z-^BLa zsIvXqvp9hipQBMGSp&hDS@p(`cGLV@-)dxd$e5|ARixB%#C=(#wuCa8vgZ!_dv=Xn{k`kPh+ITTNy|?8JQe_3QL9oXYFQm9Sd;nxcWVAx5 zafu42(wV>7y~~cEw`oBI50}Hu?qV_hZYExH~YY8m>;0mURP-dW_pOY#^;6bcSKp^8!jTH#dZ=1rHUXz6*!^Pex?Sz z!vR~)^9cAX5$OGfb&_sLPo8(Z74uE`7b#1EECluFmQ5HfxLgv8IFa`hblet|@y1v6 zvhXq&y@yJwYxz5g`u}(*-V?>5XPo45;UHJybKPCh>VDOwr+z9lOFBuyc&4T#d zeAvxugaqA7Ktl1;R^%QOSG$ph)Um5(NlYBnLgUfPOI%AMU(%R8ud#`7_PxU@DphQ! z&r*3bArVsr=rMe=4jg-L5cTph z3z{qW`GLdz6E~y6-FZQAvDRq7N``IL&nfDEZE#yjMY}H97W+lXU@d2BiLub%{ZT;{ z6*vLUQpRen^1m44<`ewYT8mG^ywu=6ZP?*~BB!>}_D+OPHR%o81en2N8VVk)OZ)NQohc52`(Kgqg%r!( zBc6~WaApww_+;k`Eu`rjJ$o4j8<}pp1$P2{f8?QZYvoTQDAchEi(wxdM3ZJ=xR3%i zmKh2YlfWlm`I9gbm=;Zji4v({&&D4zM-Vf@u&9BK^@RL(?Yl=WQ!5pEes)FzzlRaV zwwav?a1fwBxX0SV!bGin&V!|1{NUiAo)3%mF4MKnF)91Rnqzg?;|F#b3DcFR1T<=D z8wuQ3r}S!l4oez8I;{3F zKj2*welAI-!^|ErRZhNxt?AZ-K|Z{w6R`6}Flh=;jh{tXOWlRbhbKjmmR8{!o9y@Y z+MB*$KMJ@}&>Gbe%rr-&@>X{=~JxOT7 zN)=H(QO>e&>J^D2H72&5PA1hU%8{>Rqfo=&?`|-%H0>t3xG3nM&?bcn4p1Ceox`I+ zXs&DIrjif6y!LQOW6RyIM_Df?pMr+>lTT}cU#;6DzR=_oEpZ8IK$mjIFf#+vDkET@ zUoq+Mawrm0;(vZE_mU$#zmGWm;JtmiAtV_4`WNWp9%x2eQOP2UQS-f$l}a}B631aa zmhMl$wV`4Z7EixpVPdhJn;|2MH1xrdf-z zzb)!6O^!0@usRui6iaZqi|6KKb{xLD%@-(pdmKJ0yB1q8zxy?F6Z%ghuP~*2gpM3( zj(;LS@5bKpvZ&VOcA<+9DjEh~M3R0;i;1w?Zb_$O2qP$?oe~X~9kZ+2RoR~OSPbz( z6XT?a3lSnW=gv$npn7m5up7A7UUyl>Dz+Y+J_7>JWIHjkVoy@@}9-*Oy6n zT0w-xIzCoPqLue6n?Skg$LLXy zu2{$6(Mz$0n9$DA0CEvv4sV2NRiD$&6(tEIRO5;!|6En7F#}1#1Wq5iqJesoG}+M= zdFpRj5ZswlMht&nAr+&3^HRTtZeyvD0({lny}K9T#238^?ZAA6h>PxZ#u?r%_&<&l zrSyM(YnezMkze9e{kE1)wEuwkiyqGTZccpxl5MyNgaHFFv1Z}kEVTY*GG8%h^uawI zhCr))tb}{m6DlE=t{iFbdlSpODkM_L}0T>5es}aCpYH6op()8cA<|Wa&G06-d zs%@F;OjZy>p1}8H$KZ3q`CvAX<$bj#(H&GVO9I|C zb}&`s4JZ{~rtJ@yNx}is2rv)>WF04((N(^sl$X;eRPrQ+;{kY@QZpRZ4@VF=KP4JD zSyY$i{D;}#v$Mhz$AoZ+L^d=5Wazwg_Lq(su$kg50Gf;frK9NBh{w2Jvht#EX_A7wqOalKlue;8#W+>Sy>ey($R*2X3E~RmvNZ-%uqv-{ zd70ciE$1P=s2LxeS-%%I>na)iS?bvRH^{=q+SlTQ7Y~LT&~h`G`1@uv9X`9XS_5e2 zi6D9*&PB{Jx>zW|cx&s7Ps*fvBD^>IU+H3nDlBfZ@R>{{e9cWjrLj4QDYT(5s(XsC z6+mjJ64rCsv;h)1`CEA1#{^d{iikh1n{3KKOHeZFMknk>ZM+~kig1U#jjZ8U4n04e z%{(!A3_c{2TDyya!)k7`WyP78W)|6hMyo|nPjT=kzHQ5H9DnhX%qh7 zv7xS8jDG2kQE$<)90fr=zBXgY66UaA_fwDQ_8`atO~(s0W+d07;JH(9x8^&L!GCXU zMt^k2n6UsHGeq1y%p9|lWIJuS!oCGWFJy%T2)$?VElaUG6KgAFk+hQAK##oon0su!EW1zwH%g06$?w6(dPNH`n0ho#z?$KqKVN%$%}s_mp6Z zW|)ay@?$f!WWH(dk5PXIJzFaPk(VI~DZ{k%H#X5VEkltBO!Np*yYhCnlGcCk*3f2W zkM{01t4Uc8b&lE7k^y~kv89EejjfjjobEhK!)woS?yt$oc?ou{%u$$ z=q?2plD;C9wAEo126n@v+T^M>#vd=>zLAME{uocf8*I2JSSf8E3^yU716NgFNR<@| z5T+Ffp4w^7(k8>c$Ue(}{@S&VW;fj#O&ro&L}I=?w2!@D4K-XCJt?iOMe37#rq4iU z-byzlN<|RLfOcJLU6nIXpRBiGbG5>Dexfrkec4TZ8^;*K0LX|flBBopn19MkB5Yst++E8SRyUAM?7&1spa=trg2bbp>s>=^LI4{Nt-!>D=l4yb=Yq?R9Q)s)%X5l57dJ)#t(IR)$z6N{}V*O5| zx}>%r&iZ@9=&K(7JaD9kw83t#735&RV6Ktr0-W$V89aDg4vj*o1P?7|Kg;X1)-Jlv+~;~CYIiBDPN$P z?grSZma6CzfFeCcFJxFVDROW&#_sL3iltXS!Gh#PH^(P=OXo4_17#Qku$u4w1|PraUlkl$|KgHLe?d+cGQWr zJ)32Pw6<7m{g~+<@TvAqi1ZVG;7g8+9Kpz&S|GNr&wPdpNG3~u{z`iKk*eUgqXo7R znjF>Sc%&x=Z-DhZ4O4+@!Cb7!(>Q}s$iECy-)w0hs$oReb0Xo(L9Xu?ZdCYTGe9?C}>q*roOmRfAB zA806I3B59Dr$*iTRgI0qL8}SpbS5bbG8Z_jk-|S?mltmJVj0#BW6e-(v0okCy%x3X zyZy*G5z0#G>w?G%2OO&W)#`)IDUb!tA_PExD;A9LaA`<|D)pd|#Gb;}HP@92ge*G# zqu9hVt`9!MIY(ZW(dBlAW>H4f-c zL?jJT(xCup%5#elg7uZfnTi@fOsz+&e;06p1=RtUPl1b+`Z*l5vocsdzlFsFBO+ zTL*b(LdznFSXP7YR~PqXI&(BGyJ4DhBSa-S)368T1;@ittYI@m=;lN1Ipol@k?R^2Glhfnk>I z)rhdmOh6pCz=0#N)#LAG=#S|LMc>F&8-K_{dl6_HgkR38@P|zY`^;P*mUt8p9$e^H zYcHiM9K*aMJ!N1Y*tO#`ee+UW$cIcK0eqZTrI;`aZWjcsYpbe59a0hysCDBV1w$mO zvU~=z0sCM34vh=a*s>7Oh20Rg>+()(5xM@U1V2CN9u_JWL-#6~4)4h8d5dzD0Nlviy>HK5!hdtHYtw zJvV(^hHQ&7HZoFhqC}?u-eeXsnI_{5x3Mz@vve*?qgtlo*aAPKT_~ekzGUZq5gsH+ z7&~vTa|-&XN4o|N*C!Vafiq50uNKpLD{C7;9dmzUQ!26PLk!g&>d-F;>FoM0B2y{H zS+pGuK)vRflVv$ZNV!_c8mI1B`^-{ZBaJ)#W~+!Kk0MnoPA3`oO5!jr%#hr`;cAm;*{06oJ6;tYA3)_&t_G z0_Cvw`O&yo=5ZzZg*yj%^=5Nz6Hk|?=0!5kaS5o@6!3$JX}ek@DH*20N!;fQQ~A z#Ql|G2D}C!R7{(pUGBhl{>7}!^WNcFtl_wl#Tx^{BFQM;-r5#R zxI{zYoTEa6d-Q#1p(;T!k`tgO$Cb|qr9Bj`(;(o@O>MU7SG~1LMCd*DMElBi{P&3| z>zjC&eBW4DI@_cGjg7j?%_P`ST!7C;6Kin%;3YDj59#!#fg3BK7jz~4h^Hcz{TF3| zUx3+YeOM=57 z;PBT=@C%eqB|1v}2h81ac#*-+qEqUHd{lN^3Ox3y2cDMxoI01bwUxgx@>g0ABX_HU zESx?fzH4Y~a3c~sb%^tKVO;s36x29)j~MaFW!h}703{~)`@b<|Mfy;zccArLQ3 zW!Sb`_YS{c(*IZ@gfAKw{KDw+cWn#X*$@Bt#RHx zJ+Sue$dWjmZ`XgRL4BMeyF{;KCu|Y^J8JbTa40D;?CEgJr;Xnv}+{(J`_3I?wdA5p(L$BX+ zB|}7Du1HI8gc<^lzl7N#*eMf!_B|sIQ3;Hr zy?PR%vm}LXhGWRj-snR4QXd_;`kF+rT6_zOjr41(Ay5Yt7}9@@Zj*R*=$zNT8<^h#ig5uYoDG1mqQtb ztj$>()+gK7u!h=)ibw7>pg#~!m=m<6VSehr-=YoWM7q-6C-lL2;FCVLmV%5DyHK*j zE&H0~WgiIX1;nYw8n;VPmI-`A^7#THz4G7l>rD&v9)G!nLptT@q2Uo`QFn#j(Pk)>6>~0!8&PP!-v(NMv7p56d4oN-G6pJjkZrs z>Rs;yAO2ocuoJ7!VxI{39g)HkIEzrkKk#GBD z7fu)dhpxK}t14<61WZXvOE)OpCEcY+cXxMl=#ow;sY6LfH%JT84bswaq~p*z8{hYv znIAJhx!Aqdepc-D+$X0hC-x{xGD<`>q_s>`;Ts5%80 z47K6%PPBurN~zaJUM4SJGJsDj!Zjj%ijFH$cynt5S%niXU<@K7`2<3y{l%uv)z?|7{ zSBZB!IxNQi-9VW2dkM4Oo|LZ`#6eM<`tDtpcsBxmddu@m!{vP#-doRb`K~k>sVIB@ zbNp1R)r$D+tJ}Kt55>OQRyyQIro;R#p3kI6o#XMRI;HhU^GII8#Lhq?T>i-xA0uKr zfuhs*@;Kr|$eZwxMb%O$An({$W1|X~J=0EQRnqm~qen4qFv@{Hc2gSa4{Ga=N%*r7 zmpAv068krvlk}nY8`)H(a_9MtWhc}|zCV{Q*Uux#vM%DqFi|RlECj^dH@NhA@^AFJ zW|1WGbVus3SsIK8cAe)Vtbd}+svA=L;d$a|!KL2%2y*G{^uT3Uj#pG|R0a+y9_=)o z=-hH38U9Q7DK(yeN%wz0##Dk6fj23752in0QpBziwSudG>$O-8C<=o&vI-nWn|1#X z^m?V<9v%4*c)iX|{l&?!vEfJvxTZ*S?%Xtx4^NjFhwZH7_$aS_5_$fsw_fZpwJ-HH z20O%OL=?^x{sc9S4d{2jH{{RuP-M$lJEyzx6gOl#?LiYXENwc!6UcaNZQq_ZrnJmw z)KyB(Fxa{IRIh5t^JTqzj$cvuo!nnDwrt5IXtwe|^Fl166b1K{wV2s}ivvj2PWh`s z)J&6t{Oy}jVb!>qv|fFy9bse8C1V&t*`u~Oh4Pg(jKu)Z8e@H6Cg`xoePv92*MP1L ztcj3=i#dkfQNaLBEK{oA?-5YSc##px7$w8#0sU?tDU|bw`}YC)W=?BfkNtLd^n!kR zf(}_x3K%IlslY5KWcMzp&LwsJ6dH?6Gfo#^c<8@0FFmhIbILn0=JNHR-F~^boIfHo z7b*X|u94G2EcUogh^7b2*vJiwktO+9yaRmO%6^IAi3>h7eO#^bug;~hhAhmX%m&!CV2b;4V>P@) zKq3<l-oC6Xn#_5o=cp*od-|<4A~M0;Elv_RA4@!ogrv^`vV@S2gl(-u{G|GL$d^IDS2aS!kSls%sCm}k80|nq*Pd1A1Am;9 zy8&@|IB;K@_Hw&<&tL3p+5n~Z|GMa15hqB;Sv8BdTWvAG9v>+sj$L$vv5%@QZ@^8B zsDA2)K7L0=3IHa^LE&SrY7KJVM(rp8Q_+%^JA~V zgE~GvEq%9~0GrDK*4|p@JW9Q)U98b8`YI+8F~V<2Am0^rBGS_3@`nVSHHn43^|w9r)Nxd=Ft?SZS;Ah*6xzU3 z+*LHGt%b~i($cv4dpk+9sFuAm9rTu-SydTE`G_vbHV3)U4(EP`Lo}=_7mS<|S|L9G zL|_rcHi^g&ViiC;qw;})Ew&urgq}?$++&tbqVkNv&yI-X>4Ma=wJTTZ2{EFg{U=Il ziWTUm|N2~VkOmXb2)k~Z`)MIdCgIYF|? z$-lE`+l?gKq3_hC-Y)B2J<2LBqn4^(PI`PJ_60+9QK-fj6{p*P1y=F;SY^O6lVClX z1Pg62w#1;{=HRaFbY;9@FmST@z(oe zV{9vDA6`$&u3wYHI4bK-xkX%tOeC&BcC2%qH!mmHAvy~k9oQ|qYC7!;zw6~KYw1Ka zh-*vXOR*mTo__?zbcUI;TpB@`ZElhOnIuBCX4=d0sX#HbsA;et91d&R{%5^7N{Ch(T_m&`KX3zG^EGF|VU zVfZ7Fu5Fj^im|7DDY1i4H}wi1jCucfG{CmjMQXU!ax>4~<$rw#30wnrwfjEZT;8Y4 zHS-~LuLa-NXDRkpA`2L_zUAz6w15DEcc$V4Y2kH>?`c10Sv9Mb7FN(gnLJgVZHX7@ zq(STJVYUNh{*-fSVPN34rCxIeG8x6RODpEB+vwtz4|}DZt4~o0X(APSSBy6&ZPf}8 zjCTE;EEjx|H7s8SpWbI??i}Wyqg2nnyV6!ao=`qKgM3>vUa~j(Az}P|c8GMNEOqRo ziYa5RdiFNj9~`lhBmv#B)A>RFWtHJ!K1)n%cP2ln9FYPB0;hgmR+M2F-O$s znx=#Q2AZ<6$mEN6 zi7ZcG=E$IHhI_a)a%9fD%=CQ1EV(Gw2P5ioJx30B2A{vDs!3sALbd){gzA2MNq|M*Nl;3|GrC%=P$S?lIQN5qX$FS)F<@!($6Iri8J z{5LZBR-SfQVKob&N?(0!IYG##&Jz;}LDmk718m)P6V#90tb2hA-k^CPHMj!r{^NZy zFMLLGPf`o*YmdI}(la%~LryFcr>_LFxfa;V3k#!S2tRQRz?0}2&J$tkm7m8sI3Y-I$Swrt=oyPx=FLyzc~s+PRn^_vXv3X-v1UL{%O*p z$C_zlLf_k8n^t~=Zktp8%E0|VfwtWKt)^0MXDu^*PwCvDTP$j3*U_*ZBaQXs;^8%n z^ZH*CVHx-gNw;rz6YYOT|3(h}=?r52@Zgzn_*F%mem2uTUPT+SlJ0*nX3GyrU@?%!h{2)KsE0X;C*h(Y?9=Ud9Zw_={N*JZPjQ*fg0K zuzu@gMKjmFHTqZXofDFdv~3PfJLomGpu+n&ZJ8QPOgk_p1Z-+Vlz}g~I>_wuhM%kD zXET`;M8CnI&&5H`-qOhR;a%Nb^U7DEpK@~_??|~qcHt=%YuT#1ksFlow9zt2G`Xp0%(}M?yP&-O)7pIK^0e$)Dv|h_*5`yV!Aim5vNz_~2?Cm5;~ZJ0 zBZPeym&WnW=g7@Hikx0k`C959XxSeh16E2j`H)q8e3ZmzcQwn)uNo5lY57(QU_i7+fkW? zvvDf&kOwC{fQb-L@=4Pq*LN#UhafDXvS^}~)%t19G9lPs--P2xk7Tkt3B3}HWJk9m zhIo8vNXD~?ema6h4A=$YMj<&2Mq$vaf7wSQL~p-;i#Uet9roR6_}u5X6qZA~2D}lQ zLwl8l|L(v|-a9NKk_KHBn0qy*H6}#q|E8|RvF0SzfyC4T()e?uvdujRb9com%_g$W zFL72{R$SToa4&Dz-s76T3DLy#r1A{&Y6p){Tuw&bh_J4vwrZ#2RhYPz0g6N1<1VFq z138;M8sT1k`g|=9;hOGurWDrMrtMev-sa*;LK-bNo4{F;>i)3oUNvD^@F&eSyAPb! zPX+ezx5rnCLpOF+yeLvl57BT+8!tXnp^=E{eRDdo`X#8B;(R2YCYKBON-Q}kqePbF zAM3sHk-~q?Ds`QjhKbXD;(+|di_~IKrnjnKn@D!ajPuXBsbj^X|rF$3#3zUwuaxyNNEhrWY*vKL0Rna8Bxg2mAc70q|-I#VNS zkA>0&YX9ZiGD()cWKN%OX4nNV=LD=Z7LUP{bsAm**N(Zk;f{MO_kFt zj^j|)4-8CixpCfG8eyF`rt#6ei{5n-7?6;`Pq`@7V~w>SwWGP;{KMbJNaWFkbr1JJ zI8{xcWjD~EOavtrV) zL7PiIklEm(*q%G#uJ#*lBP+sCvj&7Tes`~;w9}fS=;oyA+o-R~NGM2#^$@mOx<@9* zP8&IXiZPCCd%56V#**x|b%W*=vu;LSEZR3(%|9A2IqgNzdG{M@_B{pYn05WQn1sqM zO2Vtcoy;uZ;SHO$i2b!{$?rOqh7Fi$Q1~nTvAsoQyAKcFF=C0u)nez={H*Kyn4{c& z;P^x~ofPBbjL+g`d-ES1$nn04hML>rAe@cnP}XlZ5? zcg1&aA_f;TqQ&&|#%lwaPKLtA)3R8TXL*`nsD*K2C_mYai417w-QHKA+K&t(1ZGD| zhb=7D$N3q6LMIGPD%qRrrFYOpl4eO4InaVRYG&Q`wUN04mo;#jV%I-T-RTkr*I-wd z|Fv7|c5O=h%jBb`X`Yk88=e}6pWk%czc6AOGRA=|IKn!{s*bCutKw!P)dtJ{UKD#;;;>J1Kq&Q@yEzNMLdOb?pS zY`DX)vU3xqP8REXB!kU*cRwmKzD2HlAUQLx(+=^A4tpc!UtuSne4~5U^7ZB6nqD!z z6}lAy16(w#Z6(K6nx>ho59C zhIE9`?A~JRup~|IENYA3Qd!!8`IBB{Iw2H|41Q7G(nE`p$*IYU^AdiO;@MOhG96V> z5bn)@ZT58$nMWWY)J$m7525-ukLbb;CJr&S zd5iCHARJ{RR`T4Fl7#Hi)GE~`*dyO)5NySvLo?zH;P>PqRd@BIUxC!iq zoZ=tFphP&;K*96P)ZFN~8RY-;B?_OSaf zdEMx+44M$EBw2#)sg_{L3RZh0FrhjygX;6^%lEUT)wtrq&1UbCH64Eo&Y^p&AvkY8P%18UPFV%2d9A(RtcRi(D8jDJyV zD#kl4%3n1CO-NoGev&r-0VdZ{S7e?0ms-J`wu(UvSGY*$ZJj~VCNpYL}^SRTGj9Q7IgPRXAHAyErR&m-WMTFw27 zuji>2Zt=1r*$})2F8F;0cECHVYgQn%Y}2>N7~j`8?m&h&So%CVu@oxbJJwuiRwS z->-S-c8HaUDMdO<+eobIxV(Fc`5+%}YgTAp|C{PfO6zc`a$7a$Dnj_7kqa7 zrq)?f-%#L%Y9>4!VVZmg#W>2Hl_&0Jwf}UednVk0nx?Q}PZfP4uKC`RBfMOgi@3=& z*X;eIAN+3#87zajX@VtmUdE=H6ZBI2ar}aTqP*tzG4SH6$UUk(H``hw6umtcQ0InD zF`hFG%yH?D*Qd&1Nv}x=^cLp1#W^sYtlxL*Bo3A_ZXUgd&mg2Zl%J`rGJELox4IQv z@_tWjz!Q=Q(L`sx&#-kSk2~(HC$>i*?_k+JmK>QC1bJoGcwLdU6O~gbG%s2W@OX=y z*WumMR|S**JRN=SMNwUU`9p}frrNQYZMmHH(6u9&gU?9#>8#0^j|K{Z)52m>kZvSOHhy-^`M8yE z^8Ea8o*VirA@Ki6E^1>rdu;Fvzi zJKY3!Jsi!>uXPG_JWmB)?4@gMUADI0T|8}7v%yEq8-aVbph}|t52x%hlXf!AH(%lDW`&Ch{v?v*G+{cayFp-OA4#@CFRt`Q1M(2L|5lEiVIx-_Jvv45LoxXT-qA zhuag!49>EIh7B41r`Uc1E(aGHwFRI__aada9SKwB}j0IWMeZ!oE!H(p^`v5*8 z$E|k9exqAP>)Gefl{Ek#+-+k6E)Q-5asTmd*|!<_ACRYUI+O6FR4v4*HHwGgUHM(nT>owM^A3{lcUx2#8aE>GXcT$7a_TpN;UL(glVPfwO@%<>O{kAWr@eLcRiUDpu_&#N)X z-rLg7s`#GG5R%nT|7f`(;QF+TXe*$)hXe_7=HU?QwAOX#;i>fbL>_v40NXyXu^!F# zkE62)C(ZGm+zuTUbprs(OOM4+v(b-YXKU80ofQp}s~nlK_t+rd`7Pa*u;0^(1Sg=4Y``L4~5Nu}z+uPbc;&3@K=U~@3IxUXRK6IIeN z(l;1a2yF6j_;(U5!j*p02XMbEVSo!3>OYLntICD%NMAd8XI#2VNpPM|ESqIdkV3H} z=l{m?{FxP);wPHLb7yQ|Y_?vBl+EhA=w0u4jQmF^4vS5c9w59tBay=l*3<#$ z9aGLj+bEKWcDm~|09h0C zk)t;u75w+e?@E#-`0^zPjm9QRfo?(>s4%->k~!mC?n2#_M4?M-B7hwT%Q;-}f$_SM_d8>Imi_e1oDZ}o!VVUpLze~PDay6-#>M- zpY1Yg#=q^@ZLb6+i2?zvjgs9ovj>{-CALb0r(;u5voYZ49yEg?(oDlQgJ~3^G0{mc zx|pHn>J%d3=mvpsAOOlxIF^-O`n{nl(s&y?_%&0}2g5*?tGhN}h8sv>rVe966ru*0 z4WD6(*|;st580sOrs;O6d3PUOfQ69?`ogp_<1Iy5-&}{~suad#TUazgC1nPh!+Bob zNqaWjy14kml(zfM_SVJ>*!o4Nxn-;OKxDxUH`w6;vZE@ovAJX9!EKcd7Qs@WILPCb z{_;^YvJ5#kfcJnIvW)sw&O#47va5GC?grJbl?*k#4=jQX@V=vK999-TRi{%*H?Yyb zb9;V<{i-k)69LPaRqj|$J8#h?&A!o$!jF#i>K zOT?*9D`7B}JOiv<%l*Y}J9k^ZFrDiA5Hd#z>j2=o05YYKrBjyeaAKtKa(H> z8r_m@Na6G;GhgU8ZZ;LgCladN-~Y!7Y{K`w62`&bzI3OPXSqG;s*sYW%Q1)&>?hjh zOirdp%8)^{-nV<=Xbp_LqBuL5uRD)1+Al1+6fhc?J|ieFvGEw7P;eWdXc9Uof?-pc zssGwa8aP^<)-Mms>8pmf{z==>f?!e-uz>dCpBLN*guIr?NC;louf|I+{wLfQ57FV# z%~7W6Kj%;5xxNAwF{ zOd5IEgCDBR`>zurhEXGQbSiforT`iUyaoTrk;5ZR%OD(+MMp*lT0o|`WX;p#g5Ulz z&ncEjKLC?fp=tvx*Hg?0s%cl(HJ8DJQ>wVJ8S9SX;xli|k=h$@c62hp{%0IUidh~M zs8PQj5lDAflGq-Z!F4Dii?)|pisc&o><)zH%#A;*t<-QYU>bHXfUp(B+<=iCF&T68 z012>gMM%r5vhP|Q@?@NA{!V!D(v#BLCXt?DEK>OYI)hWuOrTQOt48-CZj=6WD`9Fv z=-Pn@-6igGx!pL++u;&mF;wT}vx12?ag{Mxxr6wG?13pv9s4MT*C6fPVV~+XmmGieHB@n|}pdPw` zJf#udzr1Lwx?ektM(l7oDG>gs(jU+PoT@Gh^+FO@gw&rq_WaLLLt#37R=Ee3`~U2a zc>xn=A)>HrRe02`+fNnfxaLrYbF!g(TL*;OszHQ%y z6{z99@p-2HNUeUIUZ{yD27>D2T9#OK@DIwTY@znStRMmjE3==-Ua%qSXH6AD49`ZL_ngN*a+Sfkt&tg%!v~?DWt)5F zrcC!d_=hB@@b-uTalGWk1%eA7pxDg#PhdXUS;T`M1rBTCfi)-`oBy{{1*cVv3W1S=k%#>VRfdIXTnx7C2~BQ&jIh$N^Su3>;Gr_ScLaqU~sc-yA8 z3qdp4P6HK^AS)qMxW%V=kJ%ib-*aS@#c2Uvk~0g-UogWK=XZ0n0@cP@p}@Vcg6A~6j%gq0wP2Kd^O*Wbdl~R`O6X#OP15QYQHF*qwj#ET7s;Zkl(B+(91XS}L zdj}g%im-zUd{guOR88njuG{h-w`L_-HWd*vbW!`g^BayVUE=E-3tr+c(dSOIl!Y3e zT&PL+CSYql;-%{Z(d{xIQe>4N%Ki3ZHv6|ZW1Q~;CkZB2>PIxF_*WPCnuVEdCIH7u zSkqZz_(Tmto9HmLQKSwKVl{9C`Wp%^?}3QlHl6Yt#yNDA!3lHg7&IbV2$j}c`C06oMtmN+CbXZ#L>IW0`D55rxyO-2|A z(myWcsTH2>l$I{C*MgyKzlfIU!$jS{D{GS<%UKM>0ke(=N-1u6@LGl1c+b8FlUYh~ zj9ZG(%;r&fy|Li~(I;6%J$ zCI%jM2`Mlg+!&5Deu1Bp?!*?AMoEa zmm8V1M$>JBLl`Z#-E&dk>j2jVioWAZ3KV&LAg{UQPsIyEz?H-v$& zF&&Rkv0g|oBxFt!>7t(bF@!%iY9GrD-kcgOeIyz0WUc33!cR#-L>y>Fs+_-Qg$qjs zHm$(__6JG1L!FaCL35^bl_D1CW`2W}SZYhN^jvn+(pB=+N~C8|8kuf2{hT_0%2|2toz;9{r zBm{JkIti`&et`wTe#bBnWBq8B^xK309CRe!_kz=x33vYbQ%fZy(OW6A>H-YVQu*$# z84b9tLu;&MvzEsx#KE9b*pjPg$k_&HZkOwDH+bVMsLufiQywZM_}aD&CtKX}UAELB z1qbg<<;cuGUv6*Yuu?zx`cpU4{*IoQ#CFaw8c&w*=b2xVu9eCA;f7051ju$KFvW zd}{CjJ%3eTiSq@(Z?;_aHY+%ADzlo%%fWZ=PsAX6ct>)NLvGDE%YDM`83q_MSZjBb zu-;NIw2JA&K+CT^e8rH_RVcw*io`?B;W)vXYZYDXHkQfG{V=hw2~L=+eH5hlYYDu z;gt!aBy=#AaSYc1;wfZgOU;U8<;*9XBgK+#b`p*JQiWv^fc~eiE;X|l9TU(qIu{

oh~Bye}|0I^wYegaHhWclpK0QJ?@rQ4JLn{Hea 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�X#kdf zDdY=?QR@%I5Z@~h_?;b+<>e4<(l-G~Si815LS*3cYuA9;pnu332iEwlWDrzqb?PqH zYVUR_VDUayyE~f}Z0x_H1BljgP+gZOBN40$1;zhI%r+4ZZsbf#lTh68~rfnkYBXKVMegVBc7)2{r zP_=dYwT$B%KuRA-w0NdJRRHvApqPSE&m(~?w-SUyDQXyy9+1!t5V(P^F9!LvTe>(e z5Q)?#oX!L}oaR3pwf`Naj7S7_ez~*Y?!5|i5`M@li2*7ghUzp4)iPSQ6A_TC-1m&L z|HsP%cKsmi{&%7M?qGVrb><`2n40$pu%V?Zo1%R8m@iVYma$wld4Xk^=j->siyiA# z{5C*{X?u8aWwM@uOY!G#{w;2QADxPp4&J)7jUp|J;v6v=xJUrF2ngyE>b1Rp*}h~a z>_7Z(Bh#=-@_%2+$^{_h0sMZq#W&bpDx@_VW_uuYq@h##xl$KZR!1D!V#8W%?R3vy zdWbznUWs(B7AX5b6AzQu!rE5S|A&G`K3}7?ljOa0Xg&E|XfvAo1NrO%P~H&my@;~@ zYRgXv0KoOABkFlt+U2ugoO&K>>$k2@gC32d)d5seEo7&Ljd_7LW#_f?u*jV_yg+3A zlWt5$xR`aAo}-A0F4_G(>csr`zAeL}s&rCYjmco3vNOrPW#3&MQFgmxsw*Y?i8dctD}BIb&G2s1j0WoPz|W$f4)JIU6eE zk6PmOfR#nG7`2w#YP#w5)v;XRVLla%3gZWaiEF=Ad4AugcBlM?m^|7{{Jv*ig+mIG zEerZg`od8sL>JT|gj|FadyI?>Bd(d6h5=NRZ#B`7_v(y?A1+X^ZCblqU~Y!Bct}cm5je-JLLo zff?Mj$HFYFhrN?p-)(WYf{+G=|J6rRk&rTrf-wV6c@8Llj8~l{7jqZ{T6AE|p?O)w zqGLEDurCZkc#p3{Awue*=afomk@hmUec*GwnR`c^N+`-*Xkzvs(*V^%=C9w#a%bCc zvh#*br2Cw1BjTTX$50j_=L^nh#EP>SP*u{?8WaREMfDC*$H)tu)8&H>RuM3tyh|XV zMwn##W|!h@{pIqqfh20jGGn*@0L#m(;lY@2VeHl1wHQ1OhYg^bk2MOf6(->k&m@I>xQSlYb9df=T{^c z*JN}w>mi=N^UtD;U_QNrH}Bsadxna%O)UB72d1si1iv@rum}wVtH{mJ!g_&1hy_)j zXx>PUA+i<3RM$`4RU+ceT0l>_WJTwDy=Eol#}qx37t>2mVGSaC&}u?OEI1V2C1B0N zt@FwmiR}=uU@^;^?9}|muH;jdU9!i(oKjDY>YkDR$Io7B^V@)9DPx#at8MGBEvjzo zxPB0wmB_)!eKF{Sul$HxvN925DS%j4%k?E^h3wk4&&(}!vZuU3xxh63}6YCzQc#kVg3*FYaX1}^r+1GTwClIsVy%bx?& z{Kmqc^f9%hZlNP}bW^h^(_wlVzhtx~W6yKj5AOfON`zzsRQys73+a?_F>O|x%&+sFFmGYfp^5p_NySjoFUOvbQ5>#aIIRltV)Jd#2lAcBAP z3_Yj29@Q2PX2`W3NkG3aHOl-YGvNMEBK6dhkYt4At{@3UvglP6>N!MBENDQ}XbEkqf4)^@m#{yVA&m2CGNH5p~P>mD8D@vS0$+U(KUrGB}sn-gehXt=}gPPkb_Sn6HH9UPLv zXMWxzKU7*cS~`;NFw@UeC$<0&h9D3}v^CytT0()~3EP?`o}Uos$8Z)An_^~fx59-% z@ILuQhxUru25(hSTQTB$yFISDm{4vxf5|!)IWSHxgi1H$VYDFRhTjl}zyKU|yK5;%o|%r-h=nhe<)&r}3$p>FF1jDgGZrF>Fb3&S!OuEj$ppUkqf`6-Oa^be z@}&^Zloqz!B>A6UZ4GB^s}~Mt#bydd=Ib2{jYBPp#HyNPkD~bn?^by811VIe?Mo(u zJ6>c&ANtp>{FcLhEg;MV*mIolm^de;mib1MV}$ zlcANR>J#5%#n1h~*E{2NSd=En4%WI6mH|E%cqbyOp$5BP((whn?#{l<9v7SRgTRq5 zNPO3lFrt5#%S|m7lIDIL>9E&T;sh}Vv~5*df57EK&;bUs;;(4|TvuJB;cPWt9&O95Sxq7s$%!-WgO6V{OORd#!kwF`Pdh3>vR$ zjvtnIX_XyD1q1$;o%1}l&4_oWpTVqOK~l-q-f(7@*4HwjRn3z1_0^40TZj$3MMVf} z=3vdYjbr(yEKtHhJ-@|jg^UJeNoM9}I5T1xi7O&RA>Ac=EEU|iaJ@r;{`7{ax&UO;*w>I zxc8fm(?}DVtjV!uO+0Zenua>d$rG|>Jm8lZ&f3^yL_j6U9&!UBdrIhpQw8xj5<6Uq z?0opQx#eo6lTOeJh4TS7r3O^5W59@u3h-5l_1#kc_?gt>R`Mw~kdLvU@L|_-3FEk| zG|?%N#zL9W8S$xz@efR$08_UDNzfA*rmI)&Vn#&PGfF1y?x2XLDo79Jg zXs>uggHQaguoBtSEjmc~PVAS22i*rX}iKnd}i!3bc$=G|7rS z!s{SyHw{Xvums`f<_p49ZJczKMQi??A3DO)RHnZi1H3iaONg39_6V^DO<~9l$}r;< z`pYUhOGCd`wP|l!L{p*|a$O`)NnH=Yd1DFumQP0rfYO{k&A)@p?hW+!2~YBNP)#86Upb*ODIbE>yPMXSFHmh`SqUT$hrsoA^WwU!{6ep}i{tUN1tm&* zXT8+mcJYg<6*h14edHENEhQ}cxI}^+? zfFJ#(2~>^l>xFx+!^ZQum>g!v$++Q^MZSqzO~p}7FGNYzhOzpj@wj`NMh6i^5+g`M zE-hc7@kB`;@~kn0wBbrLDH(ItX0#g+?y4=h-qsnQ^6A_nI*%nL9<98f0W3S?Dfr_2 zc;V=Yw)*(>dUJF7dHi3ioBQLCzuWwXng;U*5?Lt7XDQR;F{aNiwO1Bt?Oag%6 zyigw#pXquYjW4=}>KiOORUo-|%S5-H81OgVWrx+aqW(`ytHP!<>DqzdQvym)c*4J9 zT{0`ks;a+-yY7+Xw(z~zy9*dxtw#ErJWKEu4AoE(Z)+>|tS(Y}l>=dxJ(Q+JbdQ5&E0z$gP?$qO?&DEu!TZ z2IvW+U3pRDivU#+FhOl=PeJsV^sjC^w#yD^M`f@uM`2lh>9MM0golA2xPYY@k%=ed zt0;xnIT8%>E&6j>3w^*i^&w`pUnL@-v)_ouSDybO_7hvMS{kmaczC5TO&Qil&xV&n zCc6fELaot!QGzHwmJ3@^JWG7&HJ?Tr06b)hO@@%Xj( z$J>zondti4-lq;>r_3Fd(TmIKPfdtJ#1@jLj2_i0^1F=ES9KUu#tTV$0IP3=wZB4M z=v1qWgElZf8Tlziex(y`N;P5hOT8+*i*a;?MO&*d90sjIM&r?75?glG;!PXxqSEK} zVyGd}gB5wV8XL*fJ%5yrbdA8`PdVM*)zU6pkkY>;hR&D*wE3>^dJYrZ#M*6*03b$ioWv>i+$(1J0(-tIa54}hKFzq$`-IbSbNA0JP*-~MY85OnwSU$<`Z5r5r1JXHAy zzqfweZQcI$?RxX^c6YR(;OpN4*3Ud19@j5#&--ZBng8BgZYA4>rvZN3*?7UeS1G0E z3n>Hy#J_*g5b`q6Fjx?95D36)atOWO+7KxW5D@ZX5D<94JI)p?PS$qj_9ljgzwKH6 z`^ElF#!E|Ij3JVkN?`h)seoW>vax5uqB+XU9uJsK#Vt{yEDC})>hoHEE@lTV5^tAv+Kjd z3tYY1a;wS9-r(|}*2-bfxuAO&Zq1_Swe!Er=Vj7rr+p4ntM#{wRjQ!3>*?3>AFb`{ z{Ohkb?Pp)t+r8TUdHXiCx_Ca+wf}qIZ~pi4_`Iy5xw=*(b~WAI{dFmq@Mqix-H$}d zQ>C-DuU=2{9!`(z)rcXt|FlU~-iXmW%zvEz(_RO;(Dhw!j|M$QI=xdB?}K#b?=wB$ zcJa#s_UWL4{&JpNta*LVE0ZgV#~#;v+Ns~^s6_k6l|L4HeU zl?u)6n*H*1^{W8O*IK8RR+oRk&=41UBYicj0bu-;|#n>{t z>v6fS>#2)1vP)tK>9FoceM_@mpHL&YX{zg@yVJ9)@o>%3ZXLp$#X$LDctcpA+M^@r z{H(UdGb>{H?`nRXKy0b?Hp}9lfndEugG@Nly(aehlcicVi>0CGz59K)QzTmZTGoEo zyr4(3`E%!u_A-vH6^04YY46u9vzcp}nsKjJd9V9BT@$90?rc;JP$MW3e_L#E^>85RlL%H%?zV?tBu2~=cTp-HFZ^g=f*ks z=X8gd{s`ml&P{`6g_mz`W+pfC&MkxLCM|ZyO#IxvZoT?%;ceH~G&jOZ zudPEz{>|+Xd4v9IR#sUVl(5+AfBmu#5}w=?IZ+H(rPVc2+>&eGbhr$q7n?9t6;evy zbmXc+LRIj*4t2cBkD9U~1%87E3nRZSog4CG^K(m;smASr+rPv%sS(5XhCrHst5i+Y zxBTcjq3mUylJ?bvI*i?_tUYltH|wtUK%FgHM1AR8L-U%977YA(d@dHB%g^Nq9y#FA zdKO@@cO8>EQ&UK3ebM>bz2(b2P>*wCCGpxy`;p}0M^}Rv&++*!3H1h|#u<#&c-ND5+sP z6!7VBdQ9kev9N8~Rvz`+d3kck&m0^KkezM#FJCTtO6YD`v(YX%O26$RJ5JTk$5dGX zcW~z8O6E<-r@{sM*ePDoF!8DzS$sY`*HF4}ZuyAQr~29orsn@<5jUx2eR`j}*=9h) zSflpbnr8Dzyz>jw>O}%xs!!wh6k{v=e8`Lyq9yo~0i7qxlS*%PZ_}tr?#Ti zuXs<>Ya(*5&hB^A9DgN0;x|(}d&ihvmrbtTinRVg0n@o!V=H$hXcP-0`my9L5Idi@ zlz0&il->`tY9~{OSg|t-RVZXDadUV&Ua^nySXGDBoKbO9PDy+L4z&BssUf^2#cA{_ z!iusD)Fi|P8d61aP}8|P8VZp!NkMIl+O;t|Nq1?X5yG#_Soe)J`@BVFBn-w-gsR+o zs8!U6yDO_zj79iNRM-$ze)}y*E*(Gl2H4B;2?M}*7AP~L{tij$B4;FbcVNU3$s=R5 z6cvjjQWUJ%G&i4Ek-C>LxFe}azwSAHIk2=C%_h0N8ClU#%+kVBS(}PYp5h5mt?%>DOtJ=@-l5&MZ;zmvu{&&6q8RY^o*<7QIL6~?ahjJ0H(O{ z;A2REY|6EYPF|}ZNPTF#hM@tbiF%km$S1!e2*uu$x?)pY&b%wBeu0Bywt7b-L`4-NJ+nIGeB8YL?qdb>V*;OF+^w6}Erm>x6wyr%J`r&TI;d3<)ZJ+77)2qz zAx#&lRIiAk`ruapH}tu*=y4Q=i^rkD9$H19NHo(!46G?#{5e2w6g4r$PoPk09|q88KnGQV`iz007IPHi$P z7a}$2H}?GixwNsFTu8@;Q(Lk)hG{Pka-jnJ8~i~rvC0vmF?eaWkIbjkuVstexFD*a z$_-w_rj!Im4(T&`1VA~HU5V||QP9y`SQP$zNO$Hpmlm$nY2(6orne@wIx{1ctjb6- z?$5Q7K8`YzB;r31a%Sp*cz$IlBLyp;ztUU^gJV$)CKh7da;X+JtI~p&O~0)P8V)_d zs`9D$;$8OXX6b42gh!A-sC&m{YtSCRZPGmET4$rlxTc{d{8{O>&nfZ)8%cQpqv>xN zp%DBCRUJCs(^Q@hCEDwJl{7Z)+ILGeBT2c&Vz-C&57ef@v}TBEVPueKCnr$|XDXh22}M|BlS2qp zDCt_ofu`9dh|g@?MOanF=H?LPoq>aLV zxsWs(76`n_`>M;*yEYsgy^~cA>UVQAocYYSc4Kq5sBNb{puQo)2X8c}4sGXFeD@7` zpvp(hGONVOj}ooiLnXVEw_=15aloGo&+}vavsV{rP+3u01d9IKXk(tB%nxDxs!?I% z{KQys&e^cA=?3k9UsK}e$&rd60gb@$VcOV74}qJo<68l4CKpj^zm#6Gv>wNU9Pv)l zBO@9 z?s3bt)e-(4>olYKXL)0&F;AL2`|m@^6A=OVQ?(!O{-$L<>&+r+aZCXvvJX`=Ya-m| z8CR=OsFJkenI&O`O7aE_^$IjYbBMMtICf4*i!zO0yiK_3h*6&=EozBTI;v-2B%iDFou6N)gwHml(a0Kc3PQ_3RrZ^A$QeM z{_;V5-#rZ#xc%-(Mq?4=xBN?2|Ktw5pCAbG#FbcP7&w-VDM;T@4Ppg6Uu2>k;a^J# zj0@b$1VZL}OO@4HRnv>Y_+8t;<98AtLQLA8L}1}PU)x85!UwR`R0QSVyLYwS0B+L} zS(C9b6b7c`wGq7O$K`4m|4RJoIOSl+(&(^d!260hmKJS*ibOXug;94LynPa$BGN_f zJkE(bnhdbNSBEt3bjM`az~bx?4XVU8*FsiO5w9U@byZH4^K;!-&# zO!lOkqD_>poW!FPz^B1%=U(7Pd9LECS1uq2JFIe|e;xqYQ(8sGj)@nT*65S_o%<^e zROLkAutp*Q4*nd6ojDHPoYdjz#wG19^R_Ax+mfP*$UE%qF=EsD+?55w!XpqO(Me8G zGAVJE;w00Ll+I44O)~4U0H?ieW!9f>c0x&hj3|QiKC%cyPV(4{A6Q_-WtWAByN^_% zLMtA+Aa~SNJF%*CLC0h$il<{%_?p#a-i#CVmF$XNc}LPM-+)G4kfX$}}Jha7g21>`yfvk669zW17oMd5k zzs$0P(g@wiVYyDWQ~A6zQ(B{-x)nF`eDVYN65UQ1hGsMs$v1erpKKIsu#ZHirr%-A(IZgtw zf<^Qgw19ID&KcUwlq!QL)}|2YChFo;=nAIY#-%77!h@>I;?{#9y>pOVVclSjTxM1M zyA=9y^7=|AX?s8H{2ZSqkv!72H!1d{M3i*m56Vr#bhz6bz$6ec%vtW3L{LcGDV>ZM zCMXH54#IUGh02LPg>V@dW`+q|E=Acf89gyq#e=HF<_Ol`LcEnD58^yQnPEL>WYSW_ z;O6z-?TG#aMYBShK@7rZjEwJABq{L5PKUxtY~vM5!yeDWs*>?M%d+71!-cA}^Rcji zmLFe~)<9%jpsR6=ngttL-Xs7&h_Upf&gIC*JMQ2vt}Nh47)!XVdLZfH>kWNk(F-jh z%rx-Ayu&Mnfm54W5{miJ z;9-en2fIpOBKnzjA8fzR0Dhtc+(8@66T~M(d|N1q`$3 zgvKO_@(NjZU&0`Xsu%cRiBsJ|Ap7Xm9!^2>Yl1xy-LsjT%2B-q@HKEJwd~}(=OCbX zoVVJP2E?kqK-9);C!zw4ffoUXzR-mk8r#*-8;cNAC>Lwa2I?JXZ8j*O^PB^eI@VX5 z@<6H(_JEfoduZTr39}

(T-ofpfA5-7uVHT9CPv3fUR37a=CRG>S$>3mQ+M!RiF7 zPqxJZx18u~Y_l3QLq*hv!<&|M4(bPzhWuAT$<(7I_eQ(|kIkz@6%1G#0hsl{@1SnK zgB6IdxC(D+&<#6Zhvc`{K54yR2&E|53PbGMRzg31T}Oy>gxTU_)^meZ zA*&;(Q^otE1PNE%rzI2G`LwC|s1>YXwJbh*+8ZlEey3Wrvm&4{2>S`S>c+U{FYbCj zRlS9vQHfUum?|5LotsO2EH;YHe_ME9%#GZmq7z}cS`2n)*_c^@X1{$MDhQ>X_z*Fd zxKeidx2*Rg)^-ic&ovEQqH1%pQW2QZ@1O;vUuRk1M!+uww&o4!+u^i%_u#W zWzS@ziqc1U%-qG9%UeL*6`$W^e3$zbIngO^ z#NG&YA)BS=*9g{?YJ@#B3e@2O3l;jc{!}{=$WNuN zdnBY0vWMmB80ZVup*%=N0;BT*Y4XTKb9h8w4^s=SfoeKW9~oHZD^_PSQvAR`l~TzAx-{ly@zUcV)EsCEjnI3 zolR6gX^|S-A<8^lMK2w2gu##Kl?vjQPWm;deOkG5%+XtbaA1oY;R9s91a$DWe&Pgh z^UiUk3AEi-jsA*$k^--I3j51k`y&X?Tvle85xn-NpNiRPqVm+sx=`IMfI8=+w;d@H zIlG!et(gC~ya-jPg)*8?)MHYbz81r9um&;57BKn>M0pFq1kj36moN$5x;#FCI6Glr z^V}UMJ#jduJG07fP*@&XCMhoDVYH^M*?dVN?0BLesl$cpe!B)D3aAD%|X$x-S#VAIX}p$XHK8?K!-|oqq9z-VLZOYbeDp5FQu5a>_w6 zP{I8P4=M8FuzJpql8A4FPO|JAN^tl?qz*_E^;AeF42LQPpQPRo%eza$%~+8VMlLwR zDq0>mfpHZoU1L^KER{}C0k;qEJ`x-jT`BIz~t?O<%rv7hyS70rC*dQU+RGYAo7^!Dj*6TSfz$mBY|;PTU%QP6JP9 z2898Z&yQ&EFl($qoEV0J*GHz&O_cGxAD@Ou2891TXJ`>JPMtI~@Y6LnEO>@9N{^We z;<@`qU=yC_p$%kqqv#UQ5=`WsxY8w|6^c+9 z0*xx|2c#rOn4aocM<9)pwV4C?;S1yMbdG%&UmGrY>{r;g|K_v!;;sr>P6yus+laR$ ze3a+2J4wwTlumzrOpXlBP*8vzL?^Xq0}u%aXc2a-Me@T~V+E>2p>9Nw4_g*QX-m1m z+c*VQF2;Ss>16zhp0sGgeKbh>tUWFeqwjM%Os~!<2iv`yUfXLMGELH%fMQ`yxSPP| z6r-XS-zQ?CPTj}>0Z9P{;o> zV&UzD*~3?86#n>$5VlkYJrcWk4vsp0U4pc5h=9k$WArJ7{LRg{bas;`ouHUCr$BjU9Q}afzw>0X)nQTeYR2Z#+)X?P?9NmV^FSKstJS z5{XK7Fcq4{SW;+~N!$TE8+!5$u18f`lMhA|=#8ZyU zgZ$QfU1OBTda?)zMj`HOl?~)m4Z}tv9?~aE?K??X>+(0_6kbz%W`^#RCWrSb zL)lQUy4{oGs&FgR{4p8L;7^_MdR&5;J=8UB!O>f~GsI;{Zs~5$)SPSj!=-ist z$;#`*0%@$`_5po7gENJ(#u#?OxVw}3X_6?*^|yRr#BOdB)j~BS%%sjTWjjeh(B{?H z(q6nW+|u?McY+$|Mw*~w3pwME5hhT!IuX@oj9?jrvgP&O*c5!)`&mK_p&G z$k$92j_w8>?1P}0WQ6@g8qkb{V|7D^nj{&-9poq0+y~Xiwwid%xJ+S3w>1)3Eg0#5 z38Ybte1LSpM`l5m!fqW$WsL*{ER(r`iFWj;di%&E@bSFi<8C9;g{?+W(d|1GGExYM zCV=d;f6_d_tx3pr;q@-E6GJWmjJDxrDrK8)1!=;x+E-v&`R9v0`~tmi&OaD^Xqc+b z4~QjF&?%!iI!HPCbK)P@%fHIwYXE(^=B0 z%QUdZpgFyXVO&)wD>woBHH$9O2Ou&(!i{IyWqU>MRv_-!B0cI3zMq_FNYjUnT*|k{ z3!BB8LkBm2(B8!L7J$$X6Rm9t|AVDQJ+-L3OYlO1@`TWW*6gQ+@#vfnjOT+L0(>1z z<+XdZ(&|iv4c9$ZW)P5~o80t1ue-_Vf?E)m#3$|O|Hs-}K*iB5?ZN{D*AUzZ65QPh zAq02#;O_1a+#N!&Kp?pL;O_43?(TOW?|aUB{_p(juDkB-wdfvZy0_G>dg`g_-Mg_I zm(+0tg3DBzn0ijVkTPmzTFoC4+H-1HquMPbIh*CNq#78!UF>EsC3Hgc1Ot${xmr09 z@mOrf2G+z}9RbJ-Rkj4V-zLi|xQBUi;O6l0+R`B5+Tm27InJXU7<^=*nWNBEjs%yC z{B`MxAtk=G%=#B9+}j&EY2-xA1HBw^wYhk{%B71Z16a zkQGjy{L(R{ZVB)`kV-Ylx86yDC|u4~YeorLl$?cnmsijlfPv>zKBk~SY6ijK8{koo z>%TBigTzo_R8sMg?aeh(X{@^OAgVUz&j8ZN>_sS&PZsd*t1?#vt-U46N<)+D_MrSv zSyj8L0#fNR>Anv5y3g7<0cCsH8GNP+cP|;O+s3-aNh$NKm|Uj^H@?n1MLrL%ziy;E z^oU;D!fl`FKqD`_h`R{4gmQ8@DtR6XoT6^K->OJDOKAJjE>x+9`S1}|_4dnHhhWqs z#^Fj{^BSPpycq@EdE-dIeY^ z!z$ex5z0DJ@;s7`jxDE|(y7Ag0U+g@)~N#PdL<~v7oSMRJFTid!L%rY*E7z}Gb`%ey9lC#a|HJYt-Paw-Mbe$aFyUqSL`O9zOL11 zY+ET(J3wO04BC->Jq{#&lm3IG6rA60dspP_u5C0Nrz4kK-Y^(;t0;Jfep>s_1j&hIBlRy3!(p`3!8h-cYj@qR@JF z%u=wR{FQpn@prD@;!59*rsW3lNn4jewk1WOiX&id5k!lEHT9(gQOE0{^y3&&_cu=O z#V*&}HfzreA0}4=P+E*8odCTB2x}HB4c`9qqymCQybiTuF>D-k4`4b$h>}{s9WP~- zS=7I3qg{#9X~fcl?HjyLQlOpsQ5vK-I{HCFl!8qSKg3}f^~A8%g{rQX62u`>u1sI~ zTdbOrMm{reXk5%KL4K|S_N?SkExrS7TU0D^3?m5ZOYP7T^Da<=?4hsL9H35UyO5sq z72B&A5KgT-Yf8*Oux1W03iQ`>Mn4lT#BbRa_G|e}jC`&R{acR5s#+atUtF)J6eSJ6 z1G--*V%-6dh+w7z&d7^9bz1>ZOYeb#bv3ijQkpZ~vX|jNWt`~YA8Ynzt(4!g|9zf; zNo5vB4Ao~Rt`=g>LLbVF-kv!?TavTI@@L}d_9F0a5fiOKzoHs--Jm&?{gzHLR6B)^ zN5KN#=gWQ=6lz+W1^a%+itF|RYHH_5skKW9pqK1{!Yqm|%_8ePh-8cORuu+8a6ue; z<{kCS%=@U*FukI@xuOIinxqz#)=~%WtRc=VX{+A$t|b8o#!$7**0ZQ-5w4bmkD0Uu zwp~w@lJQk~eN{FtKftGgz`JK)}Hug7SNBzOE*Wx05}y62ti#H7hR%uC5M-r zNRI_?5ur#POV3lUVCqL15>Xe!c&Y6~1D;Cb6K9^rgrnXh#K5&-Nddn;$F-H7wE?QT z5DQ4q13a7&NoPDlAEO+_`yv`4dTLnW2rjZ_e{gdJjoN?kKOp7i#yU{u#!CLMJ^_m4 zcV`c3ti4M)@)wx>XGZ^IwKv^rDl3#wcsEBc-ez>^fUa~7s8{~cyW~0)mS}@925ka?XpH}L? zezXs~Tla4X2@L!N@usuvj*MX_318>=eVRBW0yidyz#IPS8Mr#NV?-Sf{`q*2__gls z?7c}uX2%Pogl314LN?UGuJm6MS-%F})#pJB?5g%+%zU$%1tiL%oOoy(q?dHTSzv`HYiWns32@35d=%EdUuz}-7oz~-Xc{a0D)(Sb zUt%s#Nqbg(j&FUi0oq4ah99%8M*&xz`W4Qgtba%&h=#pGRD$zMoCRa^`Ffo7@u{>3 z42G|;>hK`J+~EE&L#!fE^_&VZF#PgMw6(%$FB5fKr8#~8i}JLPR2L;EbB>!rnUw=I z#|qU7KAw7+$DJ;o@0c*duX%@hR)>O>)q>Z-jH?Wu$z$U-)fvkAk=EqXvT?q3&JVDG zh1#-X1i58U_#22m0~!Ly0zyO`Tn;uHX}I=eTPU^DEiwBM{U6|<=;GJFd0-ycxAAgx z?sqWoKkTI-4&{U*cG0jfBIyxz;t;vvU=c$4=D-rj{mbg^>CC+t+}n$?!3BO3c0=uk zeoJ}_sRG2wfra)tmAKT4T)|SGYGDbTm34FUR;-?;Ikdr<`IOb7vTN_{jbOUR?9XF9 zj8AkCttN@KSC(ZJB3Kly)zogcX>m?rAaDB}8;O6;!@$|HReqGa>Qi#7s z-@X}nc!^1))g4v=s7|X zBGK7`ANn~+paG#`W#a`}sZ9=?xH2H9uW8GAJp zTS_4M(fZw7gQZZHCKwKof+L66Kyz0_OAOPi=M7!OT8X}EHmv~_?s`^Ka9U?LJ_u1Hfs>fDTGNGHXpCJUV@9KO9_t>^`<)yhuEjnVxI#@KvB*kdsy%l34gKMMZz;kmqB=O%l$M(;sn2Y5qo{g~_PsXV zwbtWMw(C3hX0H>A8F6^JDE5P~j}0!5!lCR3NuQ+ephYu8$*oZOrXNLk(ZdRq3k1Fc zVfT6n$$fhK7vcssZV~483Z!Xb*;f_f_$7SlU_h^LygW-shM(x`mh7|HIy(Fn%+Ft4 z^cYB3@$7iLIsXiNe7rg{nxBE@*C{>rtZgM58&SU2J|;X)BP6goW8WRLQnWd*SuWeg z!|}QgWZ7Bnl@>!rT0|h2s9cn|=iD*WIT#2i33zLGV`?GZ4BWp|Hp{=7q-*?iA6V(` z%9`}Uk7u`8?V2jFsjs=dwB)GXZ@E!*yomAhqrbZLQoY%EvpP53&Q!{2%}{os4osHK za|C~O>sZm~*X|}(OIoYNYC|AvWraBWFZC>whz5sU)`Kx~FOhB!lMw7hY{?V)g}MTw z#I0L5x4xray}vv`kFGR=UR3<_7ZO|ObyAtiAW4;Cc>StfctJBq0)n^~LtJTw^X=!b*CKvbX-S+F6 z$Q0yVT2GIA(3DetI_c+C&{W?4GM~2<6QxNC8UW}b0s!9qna^u)Y+zwP|GH;h zIv9$}j@FEM$B$s=^uW3vNw%~yY#zHvs-GH%S5b&Y5Ufq7p8j#;`WnyW&)uo=R6fg zCrm(eZHpm?&oX&f_m?)3bc}91e7~h64C-HUMOY*;H(I`5W!yZNh)E6*({Exs6>@prU#j-;zCUW7g1Pj4F|T z+JsUSvdnm9s*})hR~fZC+if)+BZBc$bNi(Y@mr(&a{p1Sxq2)Y%$UVDKBszyYd_vH zN*7V)ZZfk$`Bw|RNk|1s)Zdf z@d3QSdOH!MM_|fpLn$~{I_Am7VNk6CP|0;_6(|wK6mLrSe4cVhLaG^m(kuAIMi^h#7eP-jfC6Va#fx;>rjo(DGbdR^??wriKyRZ)psLX*kMA5BJTKR-TV zE@?MEo$Q^m?@oL;ZR==$xb07Dem>>8EL~ebr*HB&JKK%LT=ux!mX5@qo5#aXIw1}& zJ1Jh(J0=g+^+CEn1>;ZcVEEV(Bk*>|@%K@G54e^((O#QF>0#SEo=O)akf+&fww~~` zjx-{<b7zA~ z7A5V!%_e!>^+|L=?O^Z>%G>PfH>Q(4kmLNs$co<-s=vWx>(wekUQAE=$u)%X{7#SN zoA?%2;3bY=GaSM?(mjD@2V0D|?ao+TC>C=xuj5R(43FKML`+YICpi+aaI}-3D5iVl zEcYi~Av~FK#)TT#>b6J2_qC84rr+Z}1l<`7;gn z^Wx_ku;lH-y0F}8`0P|hbea3N>qeE|>%`+9h!s-z3@Kjz&;c`u$v2y#v`vJeHn={G zvnVyPvhj7spa_1uoPCS)X;Dm*WAlfCYib0N;}jH*$h zE5?z#rZu&vRYkXs_7d-5(;IAeQ*5HEnyWz+SuAoM4VPpJiJ=0|ZU zGbwDy5NMy38sEikgm(@Hmw$M0>LYLhvx9<+R6o6s<4U10*#6{G0eekIW9Dj{w$Nf7 zQ)oBkqG+czdGmaqZ#b^SS7I<^mVB<(b$N9uXqpUk_vs@)KHEu?29|9y6UQC(Lv}WN zbn4?rHtwd>%Zs0L&n@XQ)+|@C5q+jsPP^z6;14W?kG5^CPGon zj$`Rc7~;x0V99DDeMHkT`ldCTtTJk^GAgr|n5p*JW)qIV0v+9X^J+!7aWhbGPB6d_ zFK$~8J-0F$7*-57l>FH>mN_pOOy(;+Gf||y{A|6Ai>ZT2exqVP z4fkNey=qr|a^M7$blulFTwCV7aOAgUFAJjikdw=gbZ}eVR++-oP?4~h-M-twYM*w7 zsw0_D$NVW@>xeCyW_jbJn}Cg39{4GaOCwgQ4~j85$t|vfR-4u<9+71f@23T|vNsB! z+WL0^YQhv76npL-XQoyXlYm7m*)%CapH=x{>!MwtIt&J}IT>(VMqUYdU?#)4-51&bSB?u231rpGo>@ZLGn?1EbQ^gjmwE z-&-^H>3EXzA+8#w7ug9X`|O}hwv2K*srDx9V|N3&HxLWXgeJi$C!9qz&n(s7(D7p2ziV(GGaiYk^>j8VJ@lIZ*QO2C&tU(} z{i-!|PD+EGtbq{(01*GUUpspja|62<$J?QyZngFq&9h|USx0q`k19c<&I2&P)sWQOldy z!l+!sDoX3ArfiVBR51)NP-|(FKUdMMTg#4qRyCc;nPo3$=)J^Q4)|rJYX9gGk7>XmEjU@U84z7vb@!_=vBeS}rZ?s{P5xKWV!#ANLO*E; zvco0fG7L$?n^G&Ga-Q}|v-S^J2GOx%p&^n|EsrbaIct~lS`Vqv7gpBFC4?zq`CgUB zx^PZ3i%DTW-_wePd)Kt8IDSB`sP+7ck<$y5*wO1}5FgX@n9pHX@&3MD{$@eg3P<6s zfo%Zv701Pp5AR%}{^b{~8mfo=AVoXV`z61$><)HUnW#?lw?7>g>gn|H4L|3WM;PeT zeUH2(@?J7e-Wn}+ND2sN@G|rThQgjhVO9*l{?Hl8Gx$jN^TAj{6p~9YvDjT$$C|me zF^RhY)3L8UAc%ev!Z>h$Din6ByPXI7&4pbsPu)q>lx)Wgj9M$o_iPjHpWI0Jz||rB zHx=lpi7o(4wev^ant)91z+iNT0$Kj+zVQO41ywfOrVShg;qNrRF$%C#7+4lPr<&mn zoh0bSB$PtmWe76hx&w9=C(<2Cb_cE-psFBl>=9hoN2Ry7gno0Kn~du&7RQ;Nvc!zI zl)12;cz79K2DWD&b0zFEeHcy&lR6UyhGXhAE+?lTv7QJ(EMwn!;G!`u62EhhMZ}ZQ zS#c2>KC{5|#1i%bLTTPlj4O(un`BVre}NE|HDH#=g4nWh71MT6h=vOJ8NwoiHYwPR zz#~JTnCEC9+j^%BhoMAkmw>p4id%u*$*&IrbJcR>Y&IdxtV=g!>ze z!D#|XGMt6mGgU#6F(c)E;zo-{Ev(SRM%VlPk|IAVoTJUlh4$5EMb@D$vzt5?tvA|% z=wpTMF2wB_r)F&*W_|s?3#*lbZFKOFk*eG4lF;w<&IPIU%m(3n0Uhn*ghRhVsPhg( z;JpzV*DuJbIN#)0>0ffM8qDO^wy^EUDyiOmZzbrtzaR$X2HGn&@X5nI2 zxehBFI{iq?^Av-FIN9Fww$tP;-1auT-|@z~uT#HL)AW`cp6Lub1fz6a?0V@+JCkR| zy(lo`4m==AK3vBxHUS}$WvuOzYjM%4+(iS*95+E!&&dQkMq6?gtGmQ%Oh4X;v7m8> zbzr)j$mY`w8)HFI+E_PdX5=KGcjuho_6YWN<%5YAP=v4WFtQ8c;im%MMske1x8ms% zAqx193Hse}gU@YnmL*_s1pT2(=Vr_RyLlfWlCY0iz29u&cyrO~ce>sA2nQDtllOqp zp>BA^eOXD$de1-7Cw~D?uASYW9t0YUx|G$mtOfUwuZpq=aNHLxN8q*2lu!(Nj?5dX zxg6TbLMXewNDCwa5Q)8F9d$(Vkn5S*84B5IkTN1wa3KNO@SETU)F41*0bh4V3s^}M z{n;Okq9lkFL;o9G3Q89!w+`CLWcj*!Rw|y7h(XN^DGef2Q~7?PCcS(xE?5)!fv^WV zrX(Cifjx1aRTM&K!}R;Z7m>#|W3t1ML(u10KJYmXw`ht|yNp5S@VRr2vr019d_+I{ z3RMy)-wDgWLS9eHU`TdL#S>#9?!;jl#K7aM7OBA)@;!1CZh)w!#dX~wy0QDyR@-FyJa_Em190I zU_@s1yelS^)&UhfdYzVioX(t|bXu+7HBG_e__eq_gT{%p0{D6L6!m;Q ze&86#UqnnFT{%Y46m2N^r;{dVzF>Q2nnUNeGBQnY5tJ-RI1v_j*OpjBCu_^MPKxzQ zF}tW0-5joChNUTU;K7eRNLfq*PV){pTf~%osaGggqVOM}7GuBN*HNeu2E*8&5@n6h zTjOC!&6yrqi-mq@Cn4?4<(thK8&;r2`Ny0G8lWU#P85se>8*Vp0O-j~EBjuzh? zp@ldl>rG$tPvZO;xce0}vxsjgipl)^7+Y7AYb))jwFc|Ga4GHOwq2LojIEX3MKUIt z=E-~j5qtSZ4nk^^LE)~uz;7+;Z1++$7rOPA#E`NmmRyowSoGUX$SK44+n912g?H+Q zZ7;qFyPJSjJa;BEN47pl?fBSS<$P`+09@0p8PtmQ3f*^?4K+XaEouAdo2K1;cc+K( z!`gq~<}OBP#L`*@)Zfar_8Xq4&&TzuJYQRKomd@%H?Xthwx{iPXboTI)bI|cf*u5g zSgstL_1f9E;~pxikiRN*FJIWF@*h7m&@<0^VE42t%nDWWxMD;39qw>_*yOUVYDjM_ zQLug0u4^^p1k_qly|P$NU2^dWw7*_*mRn+>G4qo1G;^6I?OkK(y)K&*fm!w^YTbnY zjCKD7>!Fz;=>hq_F^>=H7uMh)PT~O$0HFQFJdAa14fN&hZA~nVUJ1yz7+&di29y9N z(kH*oMw_vO-yb8miF~kT;2Prb!iC+Dn&7FP3C7=}$0S5}HXmUZPIE5@BL{7OE0y=y zQUdlzI2M%7T2v!#pYHuKL&DXLhNFipz!kIM-#9OKSnl)K-K{CHX zbEe{HtGNxc=ZzTN7+$bUzDDA=Oqfa&y+aI__z){(vq5Ox!e7}vNd-=ty=aQ0KgvMUk^X) z+v+;Kh>QNO53d=M0p)qic@7j0`Y11=i*o4@x&-vuAk7;bG>Wl|K~I3BETeA7L`)bx z?cFiH945Eah-7&~OHb z5ivNoMGUo0%nr^HchbOIbx8ZysG6PSz&ZfE)+KEQ=CB+Nr4TK>FFy!KAS_)iY zZ2g^9>Nf=O0!%Wfg>8zbUCwcb?OxdFKU7!VjAp z%&$ob;e~x&F6>_QqqFfMcM<=W5cmko2zvS%MvUy;mfHs(h+m;+B9%L2r{*!YCUJug z`co-)Y^;9{-Fs$A@mFPCX89*a zfM|9{t!IZiXaU_L$6(>OgddyYT|NP)BT@skAJqp$mMjMmEY6*Fh; zO{lh@@n@jREI}=dapjAPe`?7%`3B$m?r1A&!mz*5*bK6V(8h9kX!5rposo5nL1aR) z7RufS@=vSf?@-`w?n*w(+j577Jvh~lQPrUe(LC z8S-j($mwuyi`(nPCV&m;wS@cwjU5hgIhvBVqh-MjdVLw z_G@%iTAE?q`D*0}`Ozw6NK+Ues}K1 zS*qr`q4eV93wl*;P&)_|R4=zw0b@P}`x7Ys#J~Om?GJ!mEvpK)SfqzaP>|=&U+rAI z?6|z2v|LO8I$T&n7MdH657Xs%S>T2;&1JlWTkmI-sY;sTZ~XFXxgupV3eX4}>P8G$ zK^kGl^TtIS!9;EiAKE6y@l8pK6o*=gIdNZbhB<;?9^}Zp?91Ywk9H6kbZGw(FY`{h z0mxl9!Y>lE&274HJXddPZMT|}Gxx_`cne3#fNO5I7^miW>0iOFh$ zgp;)QQyevNT=0!JayD>5)iFn z;feH~Ra*@gwL{#<!r|P& zRyRjvvesg1a!z@HZmGgc^z0MvvPZk#NeGA!+D;GS-;-y(f(X$lkfSltv9B1AwzSgp z?Mi~I-)^ZU{G@oCcDS>3R21@=o%XeYSU15Z3akwT%t$QbeeHl1>6t}6aF#02g29q! zEWXk%em3==OqTzp)$!s>v%sX zhrDTHTtu~qkRg8&#uok9^?933RmI=oTT1bA2jqUVx+q`3a6x*|ks=%0udwQ2J`mJ}X_ zO2)nqgNuDoq&IR0=SXAJYDJ^tLv2rcvhsjoS)eFfCRY3m2{R$Ir`%^jS-#Bu1s-W% zqn!{>I=kp)?_#V>YmBuCk`Z;6+HYe?(caFw0ZjboB)_Aice&U{W4FJHlWec;cySszZl=V;-oSs=sN$XfZaK1cASStIB{~e9wYhpzCy*krHJ@jnCN0KS_ zaoWIwP>TY$mV_tT4cuO{aV~Wk4oEf+qp^brz_zyhZN^oN>-l&GK~E1)vwJ?r4>0ye zmxAlmuf(Rtf!dF!d+3!GVuc2sOJ_$uv&*Pbw2$98&79g-_!O^en2nXv>r(Lrt`h6l zEry@Cm>>Tu*+xZT^mGLg$2+ork?p_W^)=h~=Qf+#s^uC7if4Qe@(4=3Ovrb!MkVUh zPgVtu@kceHKUUPchh_~aJ??P3TS-xji_!9}6`v*Hf7mrIY{R0LRiyQD8UH785s$)*+{ao*RvCFP3MlY zKiw{E%yp$EFRczi&K~Hd#8pS~ukdC8988kC0EeP(?P$fl)!gNmXNzd6A=+B~2_>`&f^VkE#b#5nn5hZyt?}o1=A!uK8j9SwkHZ>IB)T3NH;Tt8408KG;57_tFzF1G#sY zDU1?YDC2wXY@2|RhvEUOkQyW@w56VsTLcAD!Z@~leD!|E8^Utml>E&Rx{5Tp#V^qC*DIG_;WvNTm%!v6uTLQMFykBo) z1-?&Hi81ZavQ_HxeHXSaVMoFFNIO28Gy~4e^0{*EA&5czpZ6pw);k*4& z_}hDY)ak{SI$cmPNp4ZhKa1Xu3Lg9Zn^m4paoqKuS-{EWFPV2AfB z&AdQt_P6eBKKuMoxydXVO3L??vgwNrj*k=aPRDG8 zdV%;v%ZH(v61l}VPu3Ps-}`#p&bJT`FR`np{pk0f?$qdMiE)xNfNsB*R_fWkpQJ|x z`F~HO2wm@h6(m1e3)048#}&(4`QX|XkZgT6n!~dgu}X9L#ZXmIGh1)#abcTr`kOW5 zBzo|NJ+BO#7pa`G1=!$aWMe$e$|2oCH&SP=R?UB>g3g#G<`*Cehy$80fc~FU(8}D( z*6tOovSSA=+Za&3X_L)C2MKvshQK7I6%aW4PIi$enA4YQsx1+Gc&N<$g_>t|W!#j^ z=`5T{&UV0ls-u5p5-yIM=|k70N&6{7N)4fIa)YxpgtH92Fpiv3Es}7~LRfV`Oc4K$ zLuMtcl@M)7H1R!}TPWkkK@DaAYp|R`+fTKw_I8!u`z9uz zn?(@RtVGaFPu@ZQ!8y%SoBtVk&*yTwZ~gK*;bNntq?GR;j2R9jke7`ZKwk7tDk2pC zc=`Kl;)I2PzKJfqiG{9_0VAEYrBSeqln5dm&dW83qF+AA0RRxY008(13>4^_1AfM0 z&;iU&PUIt?cnA;l3*e2Bpd{!^P)`4+5?{G1;ENF@>d zB&gu5b@+H&gSY8%{dgum)NI?WmsWV*->X)w_hHyI#!f1LyC!v8%k}^Zmw_k<5eg6D zD}xS$Ul4?DIXY>IV34d16k{KeA!$^Uz&j$85v&PRm{NhZLf5P9y~oA+D<|#A@uU3W ze9z{oyTT<8MaAh6w|RH_OY5GgB6a4EFvQyqiy06=twYm)yt~ZIrd+<8sww9_2HLrbdMTA? z@tWNq&eurO@5;<-)!Umm-tFcNyBz3>yVi7f=)Ckn2MbgL#TSioXj-%T>*L`F-m4ka zdH$;zy>W5wCC~fAgOhe-+l_$?W;066?T!Y zSYYUR#LA67{Bxi2Ow5(NJ;6Q<$sg8W-3bZs-RGtBVDY=5RBj`~akqGjdt?iX>!8_Te0qUncMFa`oPQs~XZ|)_+GqOg{9mzcstb zs>#RA{>0%2y%5`3gG7Up=BK+047=IOpqkM-lN3+5afWH~$ka%W9-XDKOV z#|HeVszbSEp~dX0!`N%nxLdrMBjmdUaoK6HeZHF&KRbeX&-BOJ`RAz(gD5k$p5+1e zbSr=W4oI?asEPKE(B<*f6CbK@?^oEU9Tll|Pnm?D83_}2wD$LbmwBg-{8iyQKh~d5 zu1}wPG9P!|?aJ?~RUTVTA5W=Ur7DiBZSZP0MvM=!DvkvIX=$)nEI*yHB438)l#KT&@)!v2ILJCZa2L5q6@TGu$dRTy!S>xB^xDe0>=3Dk zOZz9_+TmKVT}st?q|rXLXM!xVzY?jtYQ*s5mDBxU&9HfiUZsWnCdn~J)o?9QuGn4a zbWV!acGkX8vv}SklAT1J$6VD&`GmQ-*h3Nc(G0$4lK7{sNdBiA z)o#7D{f+0P?B&FU`BUoi#}w?XTPT3N$cwJs#H6ts7DjbHuWJ8_vFu(NHcyTZRtRQP zLR;$&75|c-v3K*d&i|yh#po7~(X0M}ZyLB>X?JDtYua>J`p`Ab; zC{1?x<1%Z0Sr~}?e3Qj-q?>+kqgi0tjQbdO0bKS`S>np#f(8gUz1mg2bI0@P{xbx7 zl_$EqseXyvf8i-sojlpE*z)Pmq)PCEU^1NIUIL^li9-EH?ZhqV~? z1IEjWVNd&cFJPqSlOa$yvSHdzyVGoP_&D5RdEd!wrWqU1@*q0~mO+&FoD}g)!cHgZ zVgM8)s1XzZe39pc66jq9E}tWyKMp3OD%U4^GXp+U8HV;uXh<;w!KF*mX% zw#ExPzL>j4ysM6Fjs8uH0VKcm4C%t>EHd`fg!D{`~K6CcuBn(Bl+Zd4!Qs{M| z7iF=(kKDcC_f`bR83^QSjD@F)yFcVTw;XrBR+FD}VOQ)TT=Wm=Ndu)GBB|O5#u=LF zDX$)GmQS@pc#dv)t|=e23be@PuK3MGkFRe6A5*{p1B5TuJ$A^SQv@)sBfC5s=Zd>f zNDdyhidsV-exFl4e!9EAWUdPITsrOQMlBg1uG>Pd((2CJ9@H{e=^p{vM&gb8!|8Y6 zI>A*^z^%vWTKCAZKz`B|D9v)@3Y*+G6F#7354`AQI;>} zswuw5e^Veg##&s$cYe$}eFK8vw!5Y5!)d&k*4>0?7{}W4o&5)HV^ssi z!oa5Tubm;P-I&ca)BMOT+c^Eyri&5GPiZD(ta_XSRlA+q@Vr;4PD`A2LyJw%YFqd2 zo0{#OGs_{75yHokHHpCcW)jLhPy^j4&p^UIxu3iePozWaj|07f(&&D~(W>!M=|**J zUFP#6I|Lw!|HYwYtBWQ&f2OudrHZ%5RhHsd{U(!k(6kmwpC(y7^Fg6o?+I(|XLQI? z1)g@ngs1z3mXWqtgC_KN(QgNCsiNln$D?CaRJ>m^IH=dGTg*=OjU7-l^P zBrxiYAzQVvcdyp=Ldt87{Tb0P{{nqudh^S`pUqYBQk(``O@|~7v}+z6r~5e(%SQh& zw?;A72f{v==T_Wj=z9+FdgEliSzbB>Duz4jf@y6p57(mE%5X#LVUQzEwm?Hiwz%Fa zD3L1ROsO81(AOBN_t;FCnnuW=7p*Uu9hkU0b}Y_Omwh*Q)LoGhqKWKwBuAzh(8%WU zaJ%E_Zr+$ijeU`HR~PVD>Q&lzuO6%o88s*UwtI2Ej{Z!|MDzK+gh$5>WuJQ+-J(cfFQX;mD8P6Pw#tT)u}bMuNNucGzp9gjs$=2m&8J%FucFwqMXuMeq1U)L48`zai1 zSba^ln1FrX?OpqOerD{Kc&-SNrHJe+I|Q97RzGN4fKY&itTv|DSLNYuR_MOZhH)%k zsZD0cyq~A)^jc=V=@Rp7Myb7plZ}mEY?CkD}?L{%y zB?))_N@PvsKjb(cL-IYCadBCkJ-Ts`RldU5q3^*=nP0N~>(6p^0ORU0@p^Q#cnf9; z(dl}So;N=mqg22%rJKDn;T8rl`rRw73rpFzgwxR7Am8)Sk##v&QEAb^pl$=6t$w%s zFemEc#=ofZx}39UOW5>4eOKTOqeWw_yLxhD&19Le`3v_1Z7sC}1=;h3j#NtD zx8=u#$#^eo8L9UYCipQfLP4+$+OQH`;x9Z^z^>`lOJ4O2L|irC=yzRrU20S>@-zPs z_^w|gAm!b0`1psUhlyvBHAeg)>fSb)+1!qTYDG#@mNh~wpI?K5FX-T)g|(feL?dS) z|3nViA)}@!MBslJVFCP?lUyGgZSQ~03I#q#s*b*_ zU=2{ff2n7B{t9;(`Iq}5a#NB8e_58lTq#wcr8U8 zcZ$e=<6eDV$)AoMZjwADY9ap8Te(DlG23IR{1}O&;Frg8o6E!0#Om~mPEIn9ahueb zrqw3g*m=|!HJBj#{t0|UBhJ2?4u*O6vVUo@;g2l7tV8@uUaM*o;{$GEk&g?Y{WQV( zEJK&ut1|r6Xu|X(B*2aSGW2X3eo7lH000^lkaz|&jz3R3W$!nP-KNJ4J>+U9%$nB@B?nE)5_(<|jWG6m8}Ps8jEOED-FE*kz=luRIv!NBDt{2gxe3 z+rN$h-dq{k+%FQ}69qldf<2AksxjuEy{-l-Zc_Ho09#zrt2;q|8Ms1k_y?NuBVTk-)@Zt@i6!o= zz4%7WaiUzR$?aCTEh*u}K7X^l7OClRGP)!s*nCDkYg6+uSZFNKU-@EP-g~e5{x943 zGFh>@nJe^`|L%Kpn*12D_St0VK{Bmb%&U52^ZmPbC~`ICuBW$Y%)9&SyeSI_FTwX^ zFnKh91@lEQ+a$R1^b!`GY$(=U3F{j_JdX4?;dNEgR3W}t+a5Y#FsIp0%(a6KW*Xd~ zGq>Tz7A}QfhQ}D(gT20qL~}WQ==#;RF9rX1#`RflY`Rc2mR6;dNWIp2_2P?_n)18~ z2CW)PqkeT~DCV%5^mU`feD$E3$mk5i--ep(BpTW8*i5GB@4h?sYy281!CkwhDy>V> zlovOYaJU*b=ePV{7{^os0+$7PhYH4(ZdjbCkq|Y4Gc+I*h{>zUz zi-KZ}bHm<(pucPV2qGyzr(yq=oPWXv*H4g2$atk6+!M`L=*ibY0y3ojr`_JUJTLOj zZZ#wtn9=dMlD`Cvci$!$0pBIPw&N~>G+!k*L2qVNPlI-Dp`0F9m5`2O2?CA0OV~U; zmf$xTbuWdY7>a+!UDsnW$zhO*!{RYODhU&JKjWNHyfoLy9Cu2FoX%YEqA%))(>c>`01AJN zF{s}AMRp?Aj?1BymKz{fisv)2`+rM~uc2%2wZtDd2jr@0ex}dwk1RDRYpS#Hy z5wI8f*Cp=`=AQ%2yN_%9)d2z?AUD!L1VR|Int5Uzl0QBR?mtHz#25Zx3aGpWqJivJ zB#NSf5~$cc{t-g}!uG0H_=x+fQJ{a;|F`_-{|BP!wRjr!*}|{YtUwgJVoH{U?IocJ z+H^FwG{@G<7p+8NloBJo)Ad=$b~J~7U86W= zk)Up%(&-$PY)@Yj^@n$-qE;k3Xy4ucmB0<_2a36xH<2y&)tp|357rj|)v+UuM#CdI z6R$o0CUkPiF-JASZor$(!z<8gthtBsWX+fjMBI)CJs|Fl4dPuN=MLHaXq6tKw_(92 z(a6x6UN@lg6;NGtI3@VFlkOFTVTk`IoidqNef9Z##DC&5+f_{Qp+e4~--<*@O!3#H zf^1|v9!J3~yFc6kt4jq0fsO^{Ztm82uVNVsE6OfV*&g&2*XYt~0_OHP*PQ*^{rH1i z&j8hQ7o2kmYEgG6;keckft67tdZGt@Xji~L`d>e2n)~$^r{b6*@bNCenfG+R%V0r8 zwkG?jEJOQm`U+y^*X@SQ^2gjI@BfzYEAg&N$1h>}*Eh7gY@u2o{=NuJZEXJqzy%&X z%8&ibha)6cF+f=MKPY(A-u9!@|KjYshznBN284(aQ9xE4rN~f} zDKiQ(lqIr96021zE6N@M3IRkRkr`&2i%(`r` z7c1XjV)DBb39SKw5UZ2*@Gtxe&Fa@hl!O7*4^%>;9vjr?aGE};{vC{Q5D~>4I zPQNTA^&ocnl-yUu9JeQ@`s@7;s^^-O>WP8SX==7SRndX<1q4L{;EFQuRDlk?)Yz4k z7eFG|_#0QT7L^&Dag<4xbZN3(`ZE=&yLu4v2Q##=#Ae12TP6C_lII2M#=0G}UWy4CU0150TX)vc5UH@q>(~P4L&B`Ea@9Tz{$oguOP4HHZ=) z#}Bfl*~OjJfBn0?%##wUhOvh4| zs%HyNHBy7-txI!~Fe>kBl5z0p3pN*b9R2=+Sw-z5CA+W=mwPF8{!oiePZ<&{m6&(t zM}`EO3TKR&2QzK6I+0&uX@Yl1n85B{G%Rq)x`gFDpKjBZl5`=XvjV!faW85{xjN}b za>3AvmYPZK%ZcEH>Ql|&et?T5U_TeLODd-{>;}U1HuG{w^PEF)@dr5i$0l`(uz99e z>Pj993@vvvCATMFmiH${*R35j=ROJk4gBxH-_U(s0oJ~C(#-yN?5GQRgR?E9lilrI z{Z}#^P!+t9Oa``WYk#^Osh8imrM2eswzrcPzf7Ys&mt z(ZqknICVR_1y4+lEPddYx;g2K;|qp9&h7xGnuY~>u640j8}&7$V`4lGNl96LoIvAU z8&kiULI0nC@bM*no%mu`|J;k(Y?{>TtlJ4Q2R*vZLxSO!z4n^A?I^E&PtZj}mq(t$ zoKZ@?7b_s4md1f#{9!RWmm4arh4fuBYzi0Md$vSdew`2?*ZCnDt|j=RDdxGMZQ1(g zQj2lx|BkATQE{mD4}JgkQ-{5DD{-a>B@C}%(a<}0_uh!xu-?@X&Wx;Rd=%+Rg=2;q z6VGWgAK2%wEl>1eHVk4S`469$nQ#cM%&_I#wZ_KKn%$4-&63{i1)$VwHBy}X4nS8; z8C56xwyvdooS4phnwT`*cfy$pg{){m$0OML?N6+MhD zAxKXJtDk##s@>yMI~QMS{h!Ue(ZbbG;N#^LS7H=uMDE`lMOu0!-s^J9dkgHLw-P&H zCRH;2`t^s_Bo;BIe&>%TDL!j02#_?i)`X(MIQgZZ#h*KOlx674?Q+FmsCyRYB=>YM z>;^yg%%2vXIIJC0gBN_UYBo)CQKvJe>_oV{c*~-9osub4e3COaJHC}WH{%yhVY*Xo zgSrPIbohPq9$s{tCeP-{j##+Q{QWl-1dePW1DT%LeJ+-^_eD5y)xMJ&sEXf2!>e$r z2zY z*7m5@9P~5K{8@2G-ke`K#Z_QVSH(N5)4hSaGjF6Dq`n1)9-IF_yT@HUuPbNaVqA@F zJ2=s!-x1H`-s~tIOco!<<~-wg;yeqh+%jy5iyyNS|0d9iNufWcHKzM%}(3Z~EkuK9TQp2Y>xJ+DE( z$%aftx%7b+VtEE`Cr-{wx6Qd;Fk(#0rA74=v(@ud!%mKC3PV~9a!cUMy=TUx^;r!| zQ;p%7r;N15#;)P{fop|{=$ElILq339vCRtr)n~P8OPu_4-4RZ{Fakzbx2lXzJj2<} z@6Lq52-EJ&%6vj7UM>Q8v)y!(om|nxFwH#DVmULHRQb$?G)?oSou?n8EA|hBYdIK= zg)dD0$)no}%sDc-AL6`a=}YHQI*||CSoQb|vZ~nZaYH=r-S`i%)o{6h^4V7-Uz0GN ztcR^8q#uF)p9Q`qvg6O#DzOGm**D^~7@WYhzK$l2Bey$w?#+ajR+vF^mqxG8Lh!XI z=7VJKku)b72j3=4Lm6lXdAVh%I?@`-bnslYll_yXW8qUo+?cILGrx_S^2a$xcpU>- zn&?_n$%Ea{JzX$|x;y8z+jpDBB5(D)%hYc6{fBtzac2cEibdOl=Vz~%lGTgCzh>=z zDL+Al*Cp3tE;i#mn3bdRELrVX3mT6`pb6@I|1HkUVGD$j0eVG~t%{R7y>>Xr4vd%; zk6b)cFwLW`$zzmPa8kgZ4|4$*01Hucv`p~tOs!LNm^?-n5MZG_$^7_jg*o-iJz z=r~7|@-x=#|+v_85nMSU)tc^tmY@g0ONV-#yQjZ@ZHz9~tyII`L z=%WW+InQYq;99Y=vNXqqgQo|t?g@-xvHr%lDv}Z|+VqDs(CMg(i6HaDxV?+rQF}(s z+zm;;N&q}m(&x{=j@w|e->BMImhk4H3pY^vcV|Lc2rE?ttN_juUfAN03q!zvc<+3x zV(5A)aoY+fZh`VhUOX_5EMGI7f3vu!&6yyd4v{N_2VdfIl7U$%tFg-t_mfd2n6gz0 zXum;&XTjyqgsOd1Xh#!}Bm&k+J^rm%z>DZVvukkin9#R5?6#Me0H9of;;K@Q&x6k; z8SB3o*=JvNr6V`2(v58}1;>vMT{Bs^I&yc zcY4MW^+Rqrw;27RB5SVx*0Qc(b1^;dyg1KIdzHA6be_hX(kRVVRq4a-{xu^?~u1XYf4x)N?##m;{)&XUX9Q_k_7NrM(A0{%G25 zS;vsQ3A|cxg;Sk@1jjFt``Acba^{cv3yJX*&3uB77SX&th&nen)B9@rE2w@&VGz+R zbr-1I;0vcL&haRKkzS)0?i0#&t@fVHy%){FjPf&q^Ivp%YsY@6!_z$x4Lli70M4MB z>*&Mq(Lp6F1AGcUrS*oYO8UQ`Dqy0n$CQ&AlW-iI$wUV7$6TG*28ElH9S#GxiIYYn z;69(-4=@#ytUkRF+|q5(EhSMkutCQvgrclh@><#EudQM8RpYNB6erd>J9v-NAZ`^acX;Jz8Yh&u>hTT9oIlEQ4 zhmT)+_6Po(yC}&gM#E|;@a7Z`eqXXbq!C@%|0?Za0(eZ!FVMmFQ#z_UGX3N0sKl9H zNsG3DGY4_Hr^1QqiQ4al25c_n|gx(*?o|rbo}9)#$ImV-wnrgvy;m>xm*f?1OH%~)SIW& zGu1n-Yh1l7SP?Qq-X)G)_FGaz9Q%RpbrEBQ)UvEVPg(h__e zW^zBY2QJ}mh5k^Rw0vZ0`=(x#++HPduordBTHQAmn79B!#gAg)&8Sd`=2XNc?RBti zn``{F^s9vu7^RWnm7u;s6|ToG8n}ghZYXRWv0Q&&Yip=T~c73N$rWB z#;d03y~NU_o)naoc0}z^j)d@hbr$YGjyHmBq^+s{=JELu4?)YRhGd=amO_Yz@hL~A zJ8l|9+rTj?al^}C)VA2{2eksH3jmBp7X5F)=!wM3i1+HQBO@d)lxT<5SXF89+!?dh zhzZ(A4mVOr`xoG!5?0E58)K5Pt#R&+M?2gBF2B_R)b!TE$e8-#%jaDhli@PE>)kWv zD05y#?hUzT%9bn&ra8IpHNjLX6EW|iiHNtrug>b#t8bwVwo+le3VH(X@sRf7A+M1v zW1M^-#i+J_A1%`fzr$GOa$Ab7qSi^~; z7O(QsHgqGmSQnLPeb~J4QksP!ne_pFdSUj_M(y>8`vv0n+uqyj<9!TeZ0+)BWmznb zb1Ys(AZB4&Bf4|GnvB6Zg*-2vO4GAJ1lh;yEpUiiMQN@*phU}w3%YDMz1GJEYOv`;pE+hiTMtKY(&fJb)7DboWGp+G?6@T=E11Vk@AuYW#0BPQ~cXndOZDN zJKu4GvF@5}=f%Me;zGauA#es-V`(96K9g*i(Yg=rFv!~bt)vPLAjs(LYeRR&d?WSR zU!=FVZ}Su)Z*Ay8rUZdV4%HVB@;MtoNagGQ4MLu)KOkQU{#N!GL_V*$o6oD_E5|m# zO1t$2F$~o9=gS~cH&%|C=%c+_+XrV78XmKQnn57GdSo`@OdE!wC|z3Axs>s6mdBxs zUv#vo@+JOtPti^EdYho}5s4W5`aEb=5&J1K#eQyy{!Dsh(s$QN;;`@Epx5Pw-EvPq zVqAUZrzykJ_af=MTytm2&%=poh}a~HViOr_L<%o3QbspN6&NH>B656dD>eCpq?;RM zvBe%cVFuyhdLg+MO;ar$L=sic2t_~5qv--aDKHGm;v6FPj7s!@*?_mt1V^_Ge7M%? zR%0rfmXLaKQiuJv1XG;*&Vl$1QnM1xakjzwQNaBx4+-YazcIJ96W5&Spn1d>ZWu;$5yEW z%r#V8k(vkg)yq<&>IshpG1)Q0v9t$3^9hP#25=G_)@`mKJWR1uogfqJ3eb?IbUaDL zw#@xxRfVcEqh7ymfHo!zuj?PzWfzdnrvD`%pe0nrKWXi4QU`h>CTo9coZCUqh}*+f z=EYwz4O(+0G#wJZy%W#Lu&@BiSURci@Ltu|NcMK->E&k8w*L!Wx2Q0L=&qI4>)p{f zcg`9M*Ou_F5DNR|N?uw>mB^CTs?6R&5}w|g^;dEYO}%#J{O-}}RZ^Wapjm;2>%B@V zb6&l-e=RxD*9XvTYD3_vp;z7(ScLl-+^Lo|*p*qrl_4CSzV|l_^9tRn#EwADUp!O6 zd*hZzUwy?jZALnF6L7@b?FW`F^<%^mE?c!QWklC;VTzB1dHg%@NZ@$)ZEjzc8W;$# zmodD|;%le6GcvZ#6fioc6!K<88lf!&Dt|Z@Iw$Rf+DBu(5CflOODd@HdgXIeRj{lb zNa*-P;9nmP0e*+l5wTv^&*N8bg}Oa^Fm#VVvg1X)pUNAidg~%qF!&0|p41CaQCflu z(zCIv-@nKI2uitc3{r?RR940i@cREbh75Staj2ycl!5t2nl7`qvsx>dn1IVnh2gX{ zS}=K81LuN(A9fKg^vp1pHq?iIau_k`!577OLscrK*Y{@%blD#jj-tzOrhJaIA)UW` z-OVGmXT$sFm_Oe8Cvx}E(>a9J&6zZ`K17WGXJX%x4dbG-d3R~Boo*6V_yi4l1jUJt z?elLnHyf4?D-SJ(wOjU>&jFX|67A`^!#3}q4YB#S4qF*HuSOW%y>jQB2rp6=LA zOs){c5tARAK5b$i^dOo|P_LfIb!d{h%huCOsJr{Jkbv60R(SedV4RV#c@1qSeAN!f z)$+z#Vk!~u2~7l_$wv$~aFITlcv;3zALUWV2G{<$iHY|1+TfxyiRdodxz$1>V3Zc^ zm`Jq-C0A(f4$kuokS>>Pc=h32DrQ&MySbBHa-ynzc`hgNKTk2WeR798z+4I5IPzW` zrjfki(`x{xB@`n!_o41ogT}(!X}|t>A~aQ>a0QsmjM(F+pX=ZZ;0@{COR}XU0>yi5oBdvW~zhY<3V|&D7!{ae-6HOKU!l4n&WcxSo0oc_t)6Av(t*uG*&SXAb#n_BH0hlO zcO$HszKbSD$nJZ}_ks?m0<1Nj%k~yd0RKwMOuPVy{eE?hd9rj4 zaii!D;t|R>O~j>e%0WauMVZmg<#}byamb3RmhEIh_nd96iQT~8XwQGj%R=rkm1oZX z7E~vVk${}AX18Z4V2s;l>F?c(mwe_IC8E6>au>pqaR;?8_Rx>6xZO4@PB<QkJ%8(fx&2ZqpJJldvGllTe z(>y78X3uUM?-e#%K!xq(Mqt>`-(5}AZKg+JNjNHF=9xSh z#+P1)uqLi2C-_Gy!Rvl@R$?2NSQ!rdw<7;ih_{rAZ_@kS+e~jy3($afAGLuy)L%+5 z8%7`Hy1nJ97X4;tHn`1RUtcv3qh$573?pm6N^n9a(^kGU*lr=@%)8ju9J_a9=LC>w zNM*RoQ8VRohhCYt9Cd=oT$g8&|~D@<@%D$MhDzSAiXb1{@?16)-GmZR8=k zaUXYRf-mC<=6hF*Z9#@hbC2~v%Q@Toyp=F5mDmW#aZXeK_ZGEO!jk$EEi`Vo=qHnT))qkOe z+^bEc$6G4~g1F71HW?;;j_?-Iz3-w+qQ8to;=L4TK-?@_ow7E;sqADpdZEJVHsu*HW)$3NvR+^OEpUMx0h3%`<7~@)?LpoKGxZG#)%}Sh$P`DR}N;A_xOU$LArc z1=((9pXO0d3@gf6zKGRIX84YPE7W$xMO(Ft5A{}gXd~Y9w8RPiU(TcDT`AlghH8vt zPJ^zJ*d5kxj(*ZLBOo+E{SYu_nf^fW{_cuGsdQAwid&eq@b5!1R*Cc`tBfRv`Nyfb z@25nqFZP1${mK(6NM$X93f#oh zXsV5={$3p_i?;6}wL|7&5s5JuKGmYS_np=In)=L#=W<(UOY$k+^xn+mPCs>J3BZm9 z2Vtt&AJ_=8Gi`$sz)`_*Gq~p(7GAjE4(1a)Bv#!6iLQ+gb>fMGW2k_-`}V%*5zOco zUNFtkb-+KJ{>Df~5rOl4`38f|vslggHa8$N z(f_pSH2frflTW&G=pg;#^wFEoquSV*%lQer>M=if7%paFE%jK}Y{Y7Zb5c%1r!f@w>BX3W3J;kr6Hc4x?rJh|AD*>r6y0Vc-$gx4RV{l&R%mFE~gX;syUy97ps!>9B7966lRW zeS;t)!Ov~#*OL5;e|aCDeN=|TGR|lijDv>^nbhyW?x8w3`j#Kv=953S@xk)YJO&NT z8Q z^N-2xg8y|ZZ#d>h{Eavwm<>wIXH2Ri$?{9>HQH*!)+EE^8RN;ZJ#-;&>hz7&nL+ak z{v5LBY@ z406ZTBAH<9hUM??kN4Jhco|kzV|M=bO>uw0wQzs8I9%|_MU-<*vz5w4+u z-h#Vi?^f7-l?beUXR#990Pte|`uYx~!@XJASqGEAA%q_7U^!6#j}B(b=SP42!%6;8 z{W!<>VXrX&LEfsEWCoQ0(C(t0Rr~O@r$hOH1m9P8X>bSVxhdfOu`MINg^nmCAaN7f z>WRH%q+%SiyBd*S7$z1ca(K?qzd37V+Z&uLxNSZtq4qwQ?ZCS-XX;#Jq_0R;kc@yGVkHI0Q+ZpgKws^B4N1f!lD;LW7~AMg$r z@VWLas|C^fjfLxI7`<@>Bsj(H2iJVOG>+K5v-OhfZGn$Ag0b-Mq)mmyy@%hgMFqVT z@glNrjV=}++9tC8;)MXq+yKMw9e3lZX1!WbodThafLHg;a^on0qF;Ni7Q|65GGlsx zjV)7t)fFBDiTHi~f21(Gye@|PRB+UgoLucOtRqiOo!Rd=brNt7^AckBbCXwJI6F~T z)c{N5DC) z;be`>D$<8I%CsVG3!m3$=qD(?AcTJ)ZK=e8lLCR>UzgRlNr%NZsGuBlG!!# zq{nn`J21ifgLWhN!V3wUaPh%lpllrVt(*E&?buDZfW_$+^QSBhf9xQt3Cm-&V1V;m z#}PTJne%tcY0>LLBF^DIHhnfROW-%C2?OQ#x2r8*gBIAn_zyBcvi76z%E}QWnY9np z%;u}D(v>G?Q-Usr=;)1|F{IB6JwCiplRl54zB_wCKEPF%Kik&oo6Y+LuiwVv+z|)- zob%->htS=;!KB&=nAJtExw`C7Ty;ZZsHw2hwOylj!GHIl0eYJ5XC!=QOxd2KTk3M+ zvfa_|mG-;5BD6N2uMxkG!E33BwmmZm-I=aWZ|Vy`Bg23lN)!+UR*dRDyR)8_Z!P*| zAbxR>hkl{H@b>ICle6pzu*lIZK3#7ltn80p{7U&dm01ENsnp9{w>~vCYvHY?Xsx=; zbZ}pPG8mw~S$1QGszw5Sh8gOK7*m6b|E_{FN!pFkHH4;shsYmSI68^D04&Qq)=Zdx z;%f;kiD0Qy<~%j4miLR32<#g?zO-B<^ppJS8wD%_@rBA0m{sX2i0r!v%iZj!V0qLS1$w#u^O375l;R%a`YSH(R*2Vhw0%;^(D9>P2>?#2rysOFM84|n4E=VcQMKOYlP-6pW4}9f5VUB- zXgok@nshzCBY|(Op&)CeK4co3J_Z@qAy|q4NFFcW6S4$kG`h)>Js2i)jf9he+RP$A zUyOIrlD8zG`$f~Ip4VVjF=T?W;`;(E+76A`fAh1Il_9B7K(M|?Km*tUpIC-1UsZXIoO^~JRn+3mpNT>Id+tX`s>Ip#6Mk{M+7-?NeC^6C+h{yT{J`>iTLnZfxj1~GqTse)U{};eB%01Fq z3*?V)@WsN|?fD@vj;~wAzs^Fz8a+>k3kx}Gr zn8gEk9-@|Ny83pm_3VK&DOZb{0muP=E#>>vanJCX{-ef1<0h<*`BTxne-M+d9*DC5 zCc6ZoC~h~8`PEMf_37T#Fr3#(2t-T`lKC0D`B9H%$S7gT%){O z<2QgKsv<`9U){Gpry%}-4s^UsOs<5?3MHNDIcwF}f8DCxtQ+rLI+RWnwl$|X_7cVO z$(0^*MI7`-RHVf@g*qc-kefnXWrEjEIObK_!JezD)(!v8+S)u=AN8z!We+S+yrw5F z8Eg!^3f(&mNy8-js>`A5^RGWHb*kFxQxuu~*C-R+Cr{&s2vwqPK%X2YW$c~SuQhNO z$)imG_rNd4LTPUy_35V>QU<}URg}A84Hh5KwnEk;{0K=$FAO)-HwiMe88$sP5V7kx z?he%O&BbvoYiPX8nLMQ$f?ewL^>B#KwkHRa`Lo;G@uvu-@XMwF-K>e@a~H?;2|NG%p@A{2T&*xzURZkc|_rWwij)W|nbB`Y%(%9)Gk$ObRDPs~MT=uI+88qvoK@kcBKM(;OyHxaa>h(#~`e+$(0K%ztl zPx^BaCoL(8b$*l-Z!2zHJU{t8#j9msZNK?!*0Yxh^}~FPETU@KN2C>8O1BS=~O98WmOj zKkM7+!ArdjFh8W&o7H;Iva#qEBPAn?T5(OD^|M)PMoc{|E>zDSr3dq}?nEhkFTuXf zdqAIixtncdPhpt`k-I%>isD0~=Ydrhx)0*IQSiXp@Z-nZ3QCANK_Me`qb#6W>P}9s z&7CbiA&^NM(DQZJ{c_P|mcJ2N`_dR2wGU`DLD5{b8--w~GS?-|0FA8F5usA#J& zs?D6hU)A;AWBEegnSWmEMphyc}d~|8%xpkb@Ol?-Evx zN}%|AF!0(L_6N@1e8+!@-l;upCNS6nv+P|ohu7_a^jHAF?*Is{#sOO%XHT*AuvO8Q zF+Ux|>g=^|NWL8A*@_>LdA%8NM*(a!XoeeZ#_1M5=f{0!LE@ClDopSfP&E3}29_6B zI5*<6wP3oKCZIi>9rVc1s`v#gTr#M(&kc*wuEzaH*V@?q$~=C$f?@dsU1av;=(z-prMxCa*}{+WT9-qtgb-jbp;rjK>MV|G1m zFW3;thBhRsTwil@C$_J-aoWnzG_gAc4Z?qy1h_ku(QGW(NxiO#%(L@7A!pj>P@Onq z5mY=IgNzL+i$x81(=yy%dyNN+ReMp}=X_(70(GZaOr3cFfA{FI-isFrEsB%E{8)YG z3TZC+I3N=PRarPyBZqL2bMd;2(5qg17WKefTrVn}JcTRyE88(K4*ND< zybMnypN9N2!TL(!u`?RS6N#G#WS%Fhair_sbIqNx_MC>gdKk6aH~O-I1H(Uxx+O$d zM{&w9;c(RTvN}VeaFl62ebTSPc#J2W{F5D6#0@rU?YSSFOW+U|3>lj|6giVS!s1vU zn=U@J*8sJQU<4u=PcS`$Z+G$4x}{&V{U4;z)W(GK+Q}w~vjr{%UVq4d_OIgtz*43^ zMphUl{7_ktr6Sx{CGehSpP?$&nI!l}+k#>?GcYNf3`T!674Ygilhp!ZYsC#_`mLc+ zi6?RbSbA|}d?)WFGLjkTj4WVHxZLs@445r#dHFuk6USVb_89i-FYcUQZ{7~qoA@Qc zv3(kQQ=i3OmnQhF=X%+cyw4_M-5hg*X*bHBBL?C|r4|1n> zc9w3y9???1#;?*T@Ob^v4zWKej<|_0+qd_Y!}^+kD}f>vw$U8U#I~)$m~p{&tzK`! z!FcZrS$y1ipF0a~Jsi}0=?A}y8KVBviao7#!{&rGy-{f5+UCD1~aDoV8m z67|YgTKaDD>!~v%6*@AF!Tr{cE`(gvHX}jARrr2)!!-&$ASncF`*l-2EpiFTAu0+- zwoMx1bDW4*iP?^Uh7k9{+D{bZa^Mq@{rF7f$(-0k|Ni(5j}ZV~Y(|WR9;)HHA+HP6 zxcbkHgqj18W_9m-QLoR96=uiH6RxWdcNnq*Okd&$tda08bO=icc+t=VYd72Kb-<2( z9QND@hki5g^c3KA-3Wh{~!_nM?>D>}R z28>0^&4Vv`xdRs9iDK<#Lw3(jI~UO54hdZP=B6^O8>Sn>kO?yotuQ-#v6n^w^WNIZ z#EECP`Q&q`2uJ?V$ALe?iRfZ$z_GmmgGiI9GlsYeHY4y+{h=7n$qk~H00seTYffYf zl$Mo3GD`4A^iyszL|rkjDriHD#_)x>AjAT83kA0PZb6IhTc7GV9=b50r+$L^uf;dt z3Q)v2@A)SumaMyJ=d4>Y;B>GFCkJjE7!hCOvM zlN!4*9e5kODhDfV>TMu>43|&<@cWn2szy?rqs#JD%Y>O$_eXd`{6NRSu1*2L4jZhd z#+G^j#(+rAh5a+xC9`Akd2SPck^~+BpU$@Vm>L4LuXpG2(|KrRp{@=h;#@YOn9Q%Z z24Kj5rcnreiF0#N8$`Xe@Bi`?y-~ceLNw>Cg=avI$FdQ{DZ!>)=3|D0p3*?PH=EC% z(EkX5#EEX##h$fe2Bi%ejsf9Y=~Kbsoq$?OP8C49l+-EXue_=+7N#211c|oow4VU& zV~tw`Mjoxr-6h7tt850q%qyj)qqnvqA#SlHCO<-48wgA&4Zt4bL(;@_&E0nfgl&5D z2ABV$vwk*Zzi=--_h#y*lH@&timDE6K7+ZE4hG5ji5X)CP%!c&ElPArYo(;SEz>(e zCz5A0h}te)mEfe!fsX=BXeS&ZN~WGhrI&zB%ga{K@)=adqrO;v7rFyJ28>V9{-U>) z`$1aAuIKrMsWaD*K`3ljrQ;%zR{|QqM5=$fz5u-Ue{5F%@o-!~!2fF1UQ?%7_ab%X zSK^{=cLbIX__eC2J}UPbuseJJ>#S2ief;PoiuMh^bVu*NNtnEb5^N_FOmP1J_y)5{ z_8p6RfN+j}vU(*d1}YWcUV#60<>EH9A?o6wkrwo?vl2T$1lN5Q-i$uRzO$8M3K(`Vsy|REoBTM1_YCL4BMas4gIC z?gJ2b;^zRtHDBG@Mb~geV1q0_YT{Cd%UAf;-E3{#l-oHN>CS;5Sb84%+og+tibxPQ zS(8t>8k1b}-PU9vY(bMmVcgXh8F=(FEQNYszljhCRsxwo29mgdVm z2|i2#^BQbWO41P^=w%I_e@TXl!=x$wOa~w*nrD~XCiKQRZCf1e`WBUzLD$16i4X%E z?km@+%x+Zc0H*cGP(U!a_DPP&DNAs|t^?Xfl790=e$akuEw34K@9`Fgc5>#2>yNVX zw_p{3*P%5+kd4ALyFKl$SjI@74ng&YIHCpkcKwNq3qS0NhvFo1!RhS-#vJhctvUKf zVhOibWW^tBaT}5O(q{KZ`i~EjBEGG8wuzqk_e`HIG?-(FL z2Fizr&44bJu{4%2wXCHBexXV@t@xKopt@eD&jq+x%xGy;UwWVx<_+Fc!g@7A+-4r} zyIna@D<{NZ`jAvT5+pT5EbqNy%Gk|>r3<@@_1(gp8tj1|$RG<<^xUM{wG}`2#=7)b z@`4LHYXbNW!Fgy-1;iMGsHZe;N(Q}%gWumwh%YfyN3h+93nv5l%z+(WQ!T`LcW#*I z%?C%WH8w2dT+d~u&Ar`02)3~LD`j*gSB6+c9m=41Qc*k(5wyvlYS@tr06G8jqez(3k)vBV}o6Wk`-27sPAmjdcSp z!#&OS(^hE8rWogaAj@n6-CGiJHecbzP#;NKCO{S-<6D<=khX%I8x(%?Yy36H!OP*s z3^4!g+HBc)FpStOY8wa-uAi|TLgWypL6paX2f)7p2-k>I|FdO4cCdOMzKi@V=-r$i2?XE zx_T&kyyH9A34AO*Q9|o|XrKNiUcjCJH+EY_I$z&#&09dPy5XwB6syt0`8DS4Z3n;+ zNLPZDCCn$E5^W0(GeNveN(f$U%~N~Po9wj8tXMqn6)^CeRWQVhCf8?0$V|-XRLfws z|4218qz5vMs*^;t3gh>EUl{>hpl&VrqwUa(N-)9Al+~gKu zsXU;5(yG0w!UeBH>lWRmuyUrpA)UE)lY9( zB}ap$9;77SY~hY+5CnoU6h!<%WQ5to0Fu~FbdlP(A;JG{e}hfCGv&STmx~L*_Lb3V zt?g^afuCOQc+Z>aNFEItxRdf*Bvl^Tjtnu&y?l$M&evS*9crsi3LdcfOI!@3Id15v z@Hx$0M4#JDApW_eyKm7JEQHi$OUf#yPS9TZb$Xhpo|aGd&ZPJE$ODx&3~a$e@{`oz zoJE~O#D2-D_G8$j0F#7(~AiCjafxL;l9l|0Sohi z+7mjxf}a`PJfU-0+(c_zivz=E7oN_}Coq;rc;b=%SyKm(m>#`qxsKi7^1fITd(#S{ z+aQl7NQJBN+Eg-BJ`$GXUliX9g1RD2fHnmfps5Gn+F5Cdv@h-vy;-iBMm_&~ivz(O zZA(U5-S?{bhs7aNdnxQ}wSz~PBQ%wNGFPYOlZ1vVXCQbT-Z;w|Gm+eI8*o}S8#E*8p zAXND;RUpaifD*_r*%CQ_XVNeWa*iFBGp_)M2HG7pf1m?xjw)aKZ?^yc+#IEOo6)@B zhbUGclayP-b73?Fgfq=XazxCQd}V+iWwW9rld<7P$y~qg`lKOh5O-c1Hg^IJu!f0j zf2i5+AxP;w5p;H74bc1+4{IRCvP@Lg?9*KCSzk@HD;uRz#!2rJ)nrQNiWdS4vK7Bt zDb?47R!WcL#xjV-auKLCS+!;lTtY^+p$F#rWSEnA;K~+?Wo=$duuA&9I^OMl*A|6i zoO}a?XOP6U;=XfwiM|mom?Hh93fXR&M4LnO0_0L)2=?^LyKuRb^Abda^I4d<;W;bN z9*7|p>P=1eq)U?k?QahYFVjfi0m-KE4#=7MWQGCh34i#|`^iUNW|~4~&E+-6t}sfFC=D_gLU_PFr}b>eW_A==~3 zY5}tNfPFO`kdYtv-%dPLtfir!xFUl_05Ud-lpYBAHGu~v2)IqV<={6`_qD$A)DZMS z=KIlZ(wL>vdnpLezJXe$FvMm0T;Jc%y~YBP0?>Ld9PP(VGEX%~lBs-ZA52qL62m^n z@9dgwxnbFK>1xkG=i;S51;Vg z68xF!Jwofultgr)4m^R^2?&u?G)yY(BE75Je3khArFBw=!74UzQ>cyGE*;*@CZXoi zmvM!9lgdq!?YgQ*t;GcZN8Y{3AMf7m+6MNNSAIj1+-&L3 zmem@V#UEK-!Iio)%qRzstbl-0)BP62L4p`4l1-_C-J`Ql3JWEg))A1ZoKfBa@@eyu zo41g1MtKoO3`rz`V`#;6JO7_+v{F|Tgfov9Jw+J$4I6(T13`gvTa68^w^`qgHLgnJ zRoWvRYc-?6`h`j#y=a1_&ul0o7ISYXje%7UA&VwT0q%<*-2R!<`2;XaMl(;Zugjm5 zBRCb6?6snZ$E%UkOnHP)SKSV<_u3QIKC9;+W-9D;*4xn#40c!!F#g2Anm=VXp;9H; zoq%9}_&cpI!OoDpA0)drI4bxIIiP5zqkpW@wd@CZBJ_dZFo3yv`?Khg=8EB_CE^7L zyE_Y5kF`}!Gk*3D%=I0C06ZbStptgmUHx4&%Ce$OE4Ncx2GIpsh{65;l2B_lp2L zlb(JbpVt1qz}Dq#6-jbqnl8Oa#s{d@C&!Xs?dbaQ;Ou(!B1u-=MG{2lC(+_SiXOn3tuLo;V|tg~f>{;+|xC?Pfnd+h7JbKKYJ_I-BB_^dCm9v2H~G z4n+#g>yJmFlom%()5=eR9TBE0mDS^iZiqonhPddEY6V9PNg7bhoPsPEwl_NiD|hu3 z(*+~@8JdOs8}&-*{8< zWM?2hYAXs$-OZkb2!Y4v!8-R9rvzZX{%-E5x5L?#r3TW~TI;p4N)uUc{Z<=H|_J1cIQfD-IsNKPf_U5^LYpY^<=I1@M z$5r{i&i3`33ExvNa!kOQZVS{GJ71NQz`8OGz5Vg@3A^5q3t>=!7Co?GNJ*t#pm(|D zK|2;(9xnimN8J3N`^-*+fmL3(joF`O(OowuqXxPnUF{?FMW%^bRL97QD1k?PCydl! z2Jc=DYcZqA4NNA>`H`l}M+|96WaN^)aQe}-B&7>f!D1UE9$;<9#8CU66jL@dnx<|^Kj8|r_ z;Cw5mFvG;gBe9Hb)|^K&;AzdScO|hk$4BODyMt?s9I~+Zd+D7A9|2*HLkbw{j{F@m zyv%NFjYPDf7k%!914idW(}GayimQ`?+}4bbhULWFOw+G6XaoPTL7QU0nVaSY_Jx#9 z9;qm1&C=Xm2Jjvx#hlwg*zFymN)@e|Ayia>$E_f-IW1e25y7|n?H`S|Cv>{L)U`=Q z;;{sI4z)`YnV!?kCf9yENGD%T%Y(v%yss;fq-=IY8Hb|aW{erT_OO?X{Dy_fu9&Dy z$mYFu$fUZ0y#=RYR)#EMAQ6KV4&izQ(_5B+=@nFo|N=0?< za%dCGA@g^Q44*xgGlh3;dk*~HK)A-IE!#UmdjfvEp~T(@3;O9l<5zWo&lu1ol9W;< zyHxOwSIp{PHlpnZ{Rfhj5}#HczL4Pv{%dpi%?{RcMqXs*9P5$Oc6^VXczt1F$J|On ziv(wbSaURjL89`R-K=hPD+(7VQZ)K$f0OMRSZzax^mDnyKjqSK3v;%dg+b?%>DgAG zS$xjEyz4mrZ1BJ}`DCy}s|ovM&3c-VP#mTG&n4QM#`*5evd?QTyVkeGDJM}zZ^|?W zYu86+wxtwpg5@W+X*$~PT$8BfUDFV_b8%<*lu<#_P)5GPK&P|7PfjK#=IGe=86Xg1 z`xAayR}Gy_5QsKA^O7Q64HkC}U3p?-m}R`en^ikh`!7q}W1- za3!gIi#;&t`62vYs4?nZZz=}N39J5UScIb_dYqStLXds zh0Yz+#0=~-8A@^kS(?j$8YFyh9>W9?M=9?0l}7J}INd zajnZje$Y-WNm?s9%uNKLYpFMqY5@YoeI~F66L_VQ3*IG?yjCfTZC_{jeZT8XD~Kut zd%;K_JY?MyGwZ_Q7(X37p78}n2D5Lgeb~Uzy;~ybSSYmxgyh(L9Y;){RE4~XTi&(A zgCOmc5^k6v1B%&P_N1*u+Jm&q!*$|!Ea{RWA03$YH&V~cUpo5n+CCcBAcwG&l;#T~ zVeG)dZyqYBfV&^p%p?i7QX5JD3n_lbbz2E)lZ;p3R~{b$N5P}3@a2|0XZ9&>H}HYB zbm_CD91?9?F66V)%JjzjaP~mSapy08d}1!00`{`VJIDlJep<(>F8Vd`RY@#bWCQ)h zrn)E3SK$)im|L`tVuq@OFod4BpUqqi$(OC@zx1B~xIA1ui-+eZv-y?cM>Y$I2|fe=5%rx9{sO!wZe#0PW#vd!u5t0V1>K7a6~2bCpfwkz zH1J05JuUPaoPL2=u-$@M+$U6F+tNsGGa)Z4n|dYhs*coH-IZZ82Ugv0Z(LIV6iQ-2Wqgs_o508EB(QFE~xkM z(BHqeK3kk`lz~R-GwMa{~F%a)rjER0a*J$MAKCwQ&w4ZZ&Fdqc-%+;O^P19QC9=R{pz)YXTq+gNskM?Lhr zVKoyTeZ+`Zm45V3aAp?%GkNxr29lJ3<1#tR%#Ar*eK^_frSTW7)KEq@UMsV5G`9sw z`YjS-!**JbolUp-WB&J>Ka%))Nj7hRQzNjS;*IShWlAau0`vbGQxaDQuoRIcm)Y45$GqRP6y z!BX3{6%`c_5f!yXl2RfnN>mgTP@;%rm86m+=fX@2C`u5Cg#^jaWXUG7faDAcLXmSW ziu(4s1&Tg?@As^kHGj;Ssa}m$_nf;=+9&Ps+ov6iQ(@zS{ijvx`mMagOO>vrdKdZ& zB=9C|QJoB0j9E;Dg!P#@b(17N4ozjT{($RI<|+Npm2=1A`vJ%S;%)fI?^4D*s}Kt2 z8W34atmae-h@H=8SDtqCRbX+W^FmHN68WEej*G}-8%6g##;h$2iG)8dlSc}#Hy4tc zVvcVY3Bo^{vKbYP-AA^(2qqV~hH4p46V&<~Eb^LXLD>%*nt39&p?&9RKmgmBH!Jyn zk`3AB*RIpe4(yPQEHDh5IX-Egozsz@pUCQT0I(P9kBdH?0XZPHh3PvuQndRC0!m!H z9qu_r_r3=>*sumcz zu%^hg#o7xj?P8Z+hmmDJkB7H5aEz$f)>n)k$gI>3NBaK7ZSGP?SaTt@Fu8lm!xB%h z&7uU%T_H5L`OE|6J_JnpyE(&LAE1oZ-Ar$$?Qw2Laei@I*dY)=pmJ3>5dw}ew7b$k z=9jj+_(UHI``Ju<6POz;N7R0j6GqB8kfSWAyq0#WD>@#J@KJGBlb)o8sTE(|Gd-sF z9$d!Jvy+PG*=AWsVg|mmz-K!9aF8;(2qTuk73ju-y+vlTVfwl^C25jn*%58k#(3}P zu1)^NsxgQ%AW0BBs zd-UWI+SKAodgQ4`u3nj+;k$dQ%|lEl(r$l!Z>u4ewO|(@uaa`3GFH3TexSxY&#bGY zH{A2?cXCL%)$Q=A1;PStt2f#SIH)Npo%I9+LE&g}$n+iCchskhr;SJbQWS=;*@OZU zwEN^Nj8!+XCJ1}(d^rcPJJu(FQT6pGj~`o^Qt&yjE4dQYVO0O2!EQUz0$ccNn(wCv zJP#a;JB`KmpxybT{hU}*iFeZrQvk9r(c{)=z5-d{h;jdqJxvimI`yA>T9k^J(Ak|@ zZR5Aep*P^J zbBMi+`3z5m>ATeH;al_+@~fo$5)U&oTdEbB7<4r@q>Wx_n{DJPBqv&Sj(-+Cx|Mit zR~#txrb&L>U6+fDK9yH!H4~-;00#zu+7rWq=v&<@&NVYlx~~Oq*MWN=S&3~mcD~`Z zNntRhogm^hI{x(dzO23njo-nZ;drEw2D-8T-t_cJv>X{TJ$0!Ye=MypmNGokl9h+@p4*M_JP7Ze z2YM`IDV1UXGkYwNUik{z!s;e1dY;4&|2p=kY26Qq=@~s3C2mkU z@p8)C;h>>#TV1@n)54?Yf^7BUjs^$E0InL*m zBYNb|1lO?dp;sc=mP~iVNQc0{3-{Im?)Gtqx|nwJ=$J|lN1VCk4^UrtTXM}yw)#xd z%5kJZ1A{Z^Jkkwhl_{a#Pac;HOrIeEI??@I)1L`#|d z2|DEdZlV@{`}nb_ahBI%(he;WSm>YNg^AXlxu@VxlbOp8=UO!5c)3qTb?9{Ac}+8i zOTDD7sRyUXB*0U>+>gCrtf(jijCLBtjk~%Rm)DEAhte(s z=!kr|$|++mRxWeR<1|1pa%I{>WMqoA*{LOXw43g_=85Ev81)pA;i#VaMWNEp2j3OD%T2`pp^e$At{gJcn$*7T4~H(uJkIkM*b9 z+j))T&gW{$=VT~Z17AI<$Igfi+k8v=1|ag{eat@`*XmcE+?g7bDa1IQs=wfv))``= zlb}8`Y1mp*0m$M|HyW(?sz`o>ML3+(;hzlfc)E~4i(j;+PrLt-eYf}P*^xM9q;2_3 z)3%^X3{A(eYI5XDoW5R!L;o{d3HQo#J)FkeY8 z>x%s?hrt|hc|M6|y&}c2xq z8e!|g+QttN3)Ez1*@b4A*95}Q)9_+ID0;9M4FS%(0PET3;*!Enum$um<|otKy_8RN z5g3I3v$?K1s_1^NG4nhsM`MTf#B0^jOs-mG3?kYbet!h#xx$2UA@QI$UVt@cq_TZba*kdm5EEK0QUI z3`bi3j#$v(?6Oao>5h#|F+c&yqK)7%8FWYI8db%gG?#kFJG~}a2e7q78vP=I8^v=RW(o|N0*dE3S5;60porPJX zn*lBOfv3V}vH2Ur7f$8%d=1sRF5&2*Ikzy%W~FOloW;?y62gaUQ21|Xl81`H?pL}wE;xbG^^O*jZz-h7zt0wmkV=FN+ZB+ZjW60GN8Z6qP_4)i4!Xga>d`VCVKlWFg|F<=D%xno@)*pOs#D5odGC$)78TB`S(y zVAildf1gvP&_?KM(7|)iwyge?;rTpquIXV(YH!WU7ZWkV8e06B$?zX&R-RL4(~^3tDJg2Xfq{S$01kgKq*-uokljeh@*UC8 zL-e?@hvQ6To9{gWST2@*bg^U5nv17*_Lqe^VurK8xp^w{){Rk$;k0lcA9Oz3e^x3u zN|U3%c_C0dP9J!pKc>zhUc+mbduSo7GPSgA#bFBDX9OxRK_t*@Y( zu8c{4UIJN4&2?xCo*?}za|-cms9U)_!u<$qY01_rj`g(w^q2Z?5Q*))`A<>HLX#~& zh`i$Tc|POWn)QTMZ|65>HS z*^xC1Z^RhKBzW|kGReiIc`OB~4hraIzR1XDE2QQC$!v(6f6jM2ubr#J?r~O53-}u^ z`dz1k_dF~{LJ|KI+789$RiG7Sz&pzDIGN3(pVKa2e`7{}xLkpgUEwPlxMQkynruR& z13Jw1VbHU8E5Sxp%hVxapEdc*@wiT(C)@ztJeu4wEKEJm+2&7}a&JWL$UJb|jAJmV zKJv4~Ue-lfApS2vDTc*c6g#Z^l~hriiPDoIu6hOm3ok_0O>Sd2O zM|<5Q!6FCmNKtWOD@ZX^Xj%A{aGEc@XJOyW41Jc~y16E;U2aU4ODij={CmJwj>-O} zJu+$AsT-|O)m6JDek}%Te$jq-IC)Kd`z~XShmKbQ79(VlPJjD;&^?<_1ealXbFB_S z*XSDkDv%$ff6Ise}Lz>4zX+G(xh2KzN2;sw`5 z@GyW$2j=_BSNOvYi07}dix3`X4O#n3;>Y?Mz%@%0y1bMCycn#M*w~z*dvYa2Au=1uK{gW{^`q>EoI29^RVHUjWGJEwS)Fm>Df~bW?B37`kS<3Bst zwypsk5O&WyWOuo$LM&QQ&$Y;DM>AKkzN}MM(@m<~`Lv$qYVG#^mW4vTUZZoH!C)E! zoLOP}SyOn^K_NDa^wD=Zln0_G;`%W88q8Gf{jFwo))92$c^CBINQyDz zAy4C(pos%Wg@-`QD3Xa^-|>s{<&Bd9Wv#&e2&wFr=7T=FhVC%}+jL~8tU3K^M?ntR zu9{vV+-%Cg$iA8Y{$k;j_Y7a{tJ-Z0b*Fmo7TZ3y9?0-vqXVE_&klFu0Num+r{fDc zb<<%9!V!u!5Uq3R0*dBZ-bjy(qrq( zGQdax$a<#OuAb}`4WxaX8x-s88iK_hkQG6A9IC7%S^sIq_S_B+jnPmU$+`-{&L=k; znF_55yw{KAtYg>EN_c%(v{>ui{>z_bv$~oa8?Bx2EvoXwKd_*LlYsI5+e!VjESfqn z(j(Ga%|9UVDX0(uXkFB}e|T)F&hqC~)WFDYZ-$ZLSou)89-wH8^j@xMhcn$btBWP} z!?~WVqeLS86528x%zha7J$P2x^(xE9OQDL12P|I^a??^NNnH=0Kt#86VXC@W^XqR5 z90b-Mk^jIa?_x=`F15v1QjGd+pv_efLUnlN`Ee1y`A&#rY0^DZ$D5-_dJu3BiiJ3A%VVtJ&PEhX zhZR;vWI+gqQKAeSRM^;bW5G}IerK2qaVXbdSnX@f=OGPi#XT7V<^0LiY)Z|@c!!#k zFwN{ty)-qb&OIIQoPq?~O>NAZMP9j4hddf-@Kdmz(IVAh+gUi;&RiMzySG;-Njn|4 z#$2Bk&Oem0BMFt}Z7wl;HS0|om_F+0q-XnlwxA)`pVBEd&?g8;yUPeENX=bBC&;P8 zGp61Xj)MZpt!l(#O~;lT$yrmZdSbPz#}v}X9BK#Vy1TL{o!eB5&%u*jPD&zPj^-sASn|yY=$!D zk(u4m`^Kv^Ab{YxodBuD401kj>H&!Z+WL9yB(op@UE$=G8PnVrjqqB%6uL55!F2El zEwAGe6ePX$wxHfM4lU2qN)J~2=ro?E{{+S972d^WIk2kFK~mW?$4WlpfPjdgtmb8U z+}n}GQvis;C90QS`by@$yfJ3ikg)Bqpho?BW%Dq(g%%lX`5!l(mnAClN)1~~@$ z%gb{uV#p;GmzlDtkbU*#c9q<|kn83Zmy87stW4{WM;@E*fKVfNZ{gOP9QZB->DEEs zItDusK8Q;H0dUi?D>fVzbeZCV$f(E!%|b#e{k4kuploG@E@8D=y2rv?zIo|5=lGB= zo!$c9TYU0ZHYsoGCzWI1u2HB`1$GA`Be~-YK31Adgzl2z2h9xe3#3DYp&I0wDwW_d zB=$M(pZTe58TlzV!vJ2Z{3H6vRk*7QaEn!rS8r5)u9rI75T_?<6;;SFb(`vS5nSYokbU33m^6-$yLXGztIy+&2 zd@Jo71!O^xRL?7=g{jTfW%Bu}q#G#}De{k~a$q*5w0)__R#CUH!VJaT*vxVc3>xb? z)#TF^b|DbxbAf{(dNYdPW(8VV0iwd(g&fAOt~XM?ze81VlK~Od6ua7w-}I-{>x%xpc?Xl>=Z?SyyZ@>m}QRu(O8Ff16uRn0AUi{Z~?##M5z(V z__bY1632qR?y?;6=Pj-ACINt1pg2)A z@#YdOwEB4wb5g3qHT&W%6`G#{ zbm$<5h^OX&eU)s+SO05lQIwwCvM_@jn?}x1$_+MK{$2@S#VMkt%h+TDaGOIO0hngS4=$Gi^DsSA+VX!R9dxS2lRKQWlDf3TinlTqjH;|>Lkiyn{f z@mTnDDTU}Cp;Z^}liOU{el!`wE~LR6Ay$7K<|>t1lJTwV!T38<+*r%^3%Rdt1|WX< zzjy)>gTRo&o4I@t;1t??jPZ^{Td}!{1${Gr`2v74E_oUsAtFMU& zP=p20gwX-v7 z)_(PmH9+(F91}T|W0e7Je4~J8$4ZSwzS+KDeu(FT^rZ)FU}B*^FybYd!>KXO9=70Kmpxm9~8j+Tj1M z#B8-LNwktO)O+1HgFJsaDI&p7)yj<X#{UzyTSPU0uNT(ntYn?~s&|XlqU+gfVcW zG*UMiTk{5G5f75AL_ZH^ByS{$_-pAi7W4G#{`S7F5+5R+DfMQTRx;_>)J&JN&a`Gt z#*_M5!OJbMB>+4VYzZ`Jn28cXkpql7d5v&#Yw6Yply5NQ8iS~+o9b$h5d!6PTG%ON ztqG3~6Q%;&FTMcBc~b!CGtiq)C+*BO32*J7%cwhe{TMbji!`;A0GcmE$}XUcWC?h=S`^-eqG#|VTFl4IsG|30GRJ;_t<_1 zQi+WJauZ(CfExpL1uPp|0|f+Px#9pj2vf-nVGsfVnOk+gJ>^K)@UX?{b^vSuKF@uK zd2xU`0CSfOZj!>eV*%v|sSbG(2b%N=ZW3RP9=Rt>({|z=t2lOK$x}-`kYQA5yYR~U z)teXcRp9UI7$?#>oNOdU)oOe(zQCm>Fqw?Ob8;g50#vw8wJU3Ka)Qu)Mw+hzfyLHt z(nCQi(@{2)8hsR`NTELEaG;{0tK8jm*zad0Qv%3ykMZ{^+UndA>n{%wGRU>Mb)j^A zCK6$l7_em?VH}r$^+AYI=d^)#9@h;6ITueaJ>~k;%mqoJ>MnP8K`@_Dkoj>1P^Swf z?4RXn@Jh$ewqFwy;+-o9&_z-nkO2YoZy^8?(Tg>)uA9A??qFYMkG!MU2onovWco#5 zQr2=6+u7O+$NS_NWXJksAsAWQBMfHXWX{D7<$qN&y)Eon92lfCbA4JuhPmkRCV6Cg zObpeMTPQ5Uf^E5<@id9;@Y@B)#?EO?h`{CAZ%o{^6QXry(t@24)bV%m<6T2w%CFRK zyuPcM!(_h*lgQahuw6NnkQv#~!tdP`VO^4h;n6#JB|2?FhC7FZG0J||KmiIu$3cV^ zX;h#dE(|b^677FM>;PTD?G}LI^yV2p!Qo}XWL_4mcB=l3mNM6Uss2<~J!VpfIcXMV zOZ4%q;R|>{L0QCrA28e2V9`r&$HzXGBxB)dG8A5b^Ws>G3iX-Dyk`%D4I|Vca6)|~ z`l1#WHg0fN=QBtHKx9!~bUN>to9|1eD>I)C+~JZ0h(USlmt)@kIH23vjMVY#x0#C? zPHfZt7h?A4Q(qcUX2qENKpU*lP;ai^3y}}BS<8dC!LM1hyPgfL+`PSKVIS}vGj+Vu zay)W(j2n46cU%*B>CxoabLY#R(t9Lbk;DsECzH5K2#=ae#$#EgRw_R95PdAV@F6}P z0P~O<1B>Ce!mTNH%KueL?%e0ehkE@+d4H|8C3R%rV`!=be-q7s7AvpHjJ^QAU9v4! zGZ*A(Sh?R-CpgQ=LJHf%y=_MODV|~%%BAx-YB|;{99oJ5k3v^3i*W~P^No#WF(%NFM<++Alc87M-XrC9tu*| zFk6+>0pe-CY3y+BD1M%@Jo2IpIJ~8`n_F^ryPtt*7*Upzl<~3g^fDcgBvmj@)PNMm zHapkD?t=LF)Stw}k)b}r3rd__{S~u?BMR0z-!O6P=K~dD7J8iRqPAM^UI2bGyhSq1xPCRH&os9dc4=J>;NWZgZTP~_V z_O8#k|M)3BIQTe#b?QD`8Axyj0E$TlvsjJZw%nKj3c$%7!y1ady3x_h=i%#rWju%J z#D8bk4g|I_|KtTiGcf#r#E5>eFq*kH&P|$KY7P)I#gXz|#OzstVMfx8%8*|6~-fnnA)7r?Xy+Q?k~6G&)bUAo>tv?7C4)jcSDZ7DWrf3fIe`$Qp_m70m1r>W0D_5p#; z4BK->)EO~*XYuH*7k90=5f6TVOg%H`Mye_FUy*mmh@Wf)GgRywj@IosZ!m&DnS=MDBQbm~{Xy&K zJ1&a`o^qRM);&1xdvF+n&q)c)JQ8Lla(P4_rvI79x^$b-4rDCZSQRcEaSmR1CJv=C zf(hl(R{?5R!Ju(mfqN*=rCStUf;_R|ji;yvpV=TW_%^E5odr~t zhXAsJLtrc$ahy9)?NLlp+{v#PVG6QjT?aM*I9v}sB+4DfNIPMqBVUq`k%>80#DCu) zc;)|oulz*h`ejL{=~n9xILy8r{V8#`o4p{(L7S?Z#EWLki(VX5TL7R18W-;AEPs(l zal#!h6jyunnjg9dhm(|$ITJ5_^`4ycsy`TUf8zdvXM1pw0h73F_{I)-{)T^T4Dr?` zW(MXrbagGv@mglOhUR$e2OqDEks&Yo{lNX*y7z}Rof*DI-85xfWw+`1>zsc+$Mmd; z?M>T|CRud0GEd-(#Ho=Z0~^VD5w~`Y?;B!lw2OG*0J^meb}4ufrq>x9A^+>ZP$%~qrvF>PAlRd_t|PPfadC`)<6 zOY=G>Dfx^>5qr`!)^<#+KQSxTJe_kiWxD&Ar?lAKOYck1u>4~h9CoT?`cb<=$^3!H zOa-kjFbu=ts8nz_`l<1Ej`m;quNr^&|AmcDdNHdaXBnPbQj7m>xW<=l?YF z{L30&hDQFu@V()sk=Hyk!acd-g%0_?(Uzpq2on?Dd-uK=>HARhUN?zF$hUBfeF=P| zuyuD4i^-b$n{SR3)^7cS!(!_>82Jn9$uRQeN3NI1w$R^|czwL?a|EN6RATQ<@fV`c zN`2}I*DAh9R9sQUB&5(E(hxaQd}q#;OXl)v;l?dz_?-vliG$5nhb%_Ak3E+bJK*(X zrl{=j7VUGA_q~R9<~b{L7X|l8IV#0!{kHX@EN!nq(})ZG(Rv-TYt}c7^_RGQ@#iwW ze^w#&2j6;UXuX_Sx-akEz0HlT>+HQJSBU%fGDbMvh#APusg<~WHD7znm}8z!me3;! zhucx25*ws8?mq6P<7ly6lfFV=diSl+8#g7N9}Rf(-Z(qADR)FX4qw|y;ud7TyusXH zc15C}?kCM_^H#sW~byFK}`elDD z)M;B)Xm#qYsD6|n;%^i z`|O?6$3vSQAqMF-t{ymb=2+|f-2+PXYyRp@+2F79{=z2m)NAHM*K_XtAE=IE=E9EQ zk)qGp<FPrcZ;1H*+XA7bWwSYqh$~eV%srbK<|+z*lRV@|HA;>q~l}mwPSZi|>Qi zO}0{gueoNP-1-z0P3d@(E4Po3VDRy*xv+NXm-N7w@l1bE(wpa<$!B@gT-jpUa!hBy z_VGVE#9J>l)C4+%1GW@KT8CI%yKbm!j>rDNI>Jk#ROZ8>P1%2s(!Ut4xyecYY9A9f zqteQa*+csq)3y@Mv~BpDr(gX!db7m6&Zqj;di9=9!~&UyH&y;YEd9Fs`AP>C?oQ?m z2ZGZ68&iI%m*RI*@|{OU z->hdd6nQT3nsuF`_S%r1=Sr20fqyg~cMn?YL8%_Y-cjnWnV1dYRa>aIhA*y}hW~PwoydUM*kafcv1+mQa&s7`s0* zlRaXdL!H_4l17B@+~5gCA?I1!@Z_N0ydDjTw2AW0ye_tzy4Si%*93SBMmBO+A75bl z#(Cl5nLaC{(}@Mflk|}rHcBY2itwqfv9h|TcI0M43kz2+bpL-2kd6WQp!xrPfUtEO z8=#Zx(E!EdR9}>~jg-14_bPHr*U7tNk2eBNvaC7p}4tI$vwjdui}MH|YiM)ETO7TUlQB zpiJTLsJW`z%Q=Y#iucxlQ#WrFDxV@eeEj%)V0|~2>VPKoj$h%c8{A)pyZi;bH7d7W z^gC!RKKA>aC&!=5al>XnP(W~hDo#$$yl)vYEe0CI`)g?;mPUr1)pXtt`I?RuB zw9^xbZBBL$j)|19+I&~%!gM0RhC0*P@9MOmJ>N0akzeg2;4YRuJJLJ)bu!Ul zJVg>CcMtm0o8&o7cT+lDdq!p^<~mw^@M4s{uF{C~;a#G+wsTz(#9g~OwH79O#|s6t zI-Cd#qg~aqM7Fm1k%^(NUrP(=@zcr)@md78KbhMJ<5T&hdggYMgpO;&T3S1p@uDA9 zc{R(OW?Ji=&i88e(n~oh%(+&zdlBL${0D1m)irqcZgt?LT;{s$qMX2vA#NMYXmqnucYA+i>_gV+hHq*vn)cQp>8{g@&!*TIJFD)y%Ib5OBzO5bO&aBB(H+xyA_C(JNkEAYWab5e>K*(gZ$1JAlxrR2 zVuD;ekV_dd#E(FR*~!A`_WyVa^?6eOuRVd+w!>>j;WYzzt$yM27oQ)$fQT^=Y54-# z-$C~Kko`}{z5%kcLUw_Luug&2rC;eNJ5;I#RVp8{yF&J@ko_QJSA*>73pU;LJcJ45!3kbUP;hU+Ew6t@PO@vbiWhx@!dd+crr?>F~gPoS%M>`xcN zZcFeEk-Blpg*$OISM(puVUb%jp53EP5F{ScUGQRH4*rKxwuZc#hxe-KDOWmm^^uO1 z+n7JTIa#oppEua_)Dt>GFIItf@?1S?!@7kRZ7#WJ+Tq2FSB5D}Y^l{Py7&(~7_vWM z#<0&j#D}c;qUC{PxJ}Hf>9KG7<+vph@_DwrG-Kd~w6;=j|Ep1qITM;`Ef1u_d%~y3 zy7ph?&TrnE-6+DZfc zzhFeBS{}%T_oUj0{N-f4G7{xsv0xC#%6a9#JDSl%U{Z5y>jQbLpq~BDxFzs8K9T~j zE}?SNGuOVx%BjA1T*)Q9zz$C|UKx!Mv1Cxdh(!4ZM>FPZO(?ild+~}AYIK6}${2<0 zC-wHemJF&`o;d$6kY_^Es`Y^~R!;x^w^%vX1om9!dcDIAUub+U7Lir4V$j20N%lV( zgI;;v`al)Ea-NS_b^W6+O&ak~#zyCFi(mfv*5vq9maZPCIiE2bFub+z;=N}OL>xLWOi{yU*!pZgMU3Oqi>yY8Lx}y1?4)MA$Tw_o+ol%3m<{ehoRQ;W zKu@b3M$D8=d6+rfiMig1dD@AY`Hr%{9TD@Btyg^7@Ww0f@hk8{EAYH4@y09h@hkB| zEAhOm@W!j~@vDRq5Lr{Gj(k_{5=jw-OSWyal%6iz;cQx^NIBzJb=A5F^@7-IJzcrh znu|?&9#X=8j#k+&-@mc;w3JSNdQPil2Cy&I)FJz&CjKqqO>VQLHD-E|^rZ*?@dy?g zQYz|)>@&0WQd;s-5`OxZ?sa(DwwPt&dvE@}6QA3^w-1l(_@r|F zX=M3fug=+&SwGGom70Y2pF&=^ki?#sANA*3+uM=8cAHmd()lyVHEJh%eI?$wSPWeybU9kETiHVAaLBD%Z>j&k}+!~t>Nf1$(&A5mS_ zpp=uSL>27e2h~m!lDYCQ2Md9cQ1HixrZq&4Ro{DkUKxn5yoUOPfJ$7CN^C(7?_EU? z9a7IqZC2bGF!t$Ac;&Igf9LZLyEaAZc%NuCRH`ZoFiPXL)h$1!=Kb-ozJHvQo^Nv5 zW%krhje0R2YTbs(N|L*m!8sEvs=OYf>im4)>C^A&C%X=#k zX0unzOG-X}b3CKc4qo_@rtDG^M%Fa@bl{fd^`}DpTIX%xYfQ(6^971(wHcMuz7j@C z^NgQtfQtQ_F)s-tVx=Sgyx!JS5&7X)r8ZixrmJ-HqwS;^!SB|rYtV&It z^zg&7Pa$a)k<*)Q2+I#Ymq9dgm<9P=RqKzg@l9n`*mr1hS1(it_P!Y?6-p{ceN?gI z5zsmm9(PXSSsOyEzztk&k zO^qw%KX(;ga_oSYG|xYOJMrlhY8<{|$GgScpACg87Yoi9epgF|@+>okUp1Y-m^mEY z0CUu`%v9eoWVgRc&E>9KXJc)RA^R|lv?KmA^n6^YBYjr^Lo2O|naQHCWJqysc}d!B znSh$3DFgfdr;x22z(95<_IMaTN7y9}^9MCWk3inIb=cPi7}_``Gb0#h@3#AyFj|w+ z@nv6b#&mpw=?kNnaSR$aX-D5z&`0a)elsbKdMH2MfNzt=g)?^>$Qtpj%BSV0Dc29U zFtVtW?|=mk+vR->rt@tWx$H8AVd;j|RBt3@VP{v<`k*v!QY9*~U#nUErk*^MT$;)v zY}DV8U4ghxL-kKtHKz7d)YC)ug|DH8MEUqKV7@U}?a|<~BU(zf-N#SDQ#BuQP*fim z40Gi4Q+aH-VV~i*fnm3fQ}+jZ)ibCOaW3sIS!98Y%TdG3+V5vRUtfzguXb(5vHKBm zSQUj+d!?*Fd(GTLhNgj3^7`3#oTbnMfL>!|;rh=U9bFe)OI{DsdUM?XVX zlUoGhKvbrsMzC?%iPmW|BX}3@L^@6Y!fH9~slmpv(y(EnG4IXM#zwn171a(lYSg#1 zF&N8+b_6xmVRb-djJG8k>d7}VhztjQf*ybeny6nK_inN$A~vz5?>p;Pjk+3WKoX22 z)@4CWmxocGpsA2cw6;=XYSSM{xx@wYFs>xarW|#us5bOEe##N`y}k_ki}EM|$JjJQ z&tSCPlhN40xqv@Nm13reI5R&N7Mhsr?fP3&l}0t7voGiSdZOpHMD#ru8_-Y1kf+01 zMo-?r8x06bg*@TYsCVE10-e%&BG?#CXo$fl(S{3SPn3rqf&w`*hnanx;ON0p-o{pL z;GVzwYS?+-KG@JvB4AXQ~-FqCFBco5IVmA0Qi zoDV~2{tau~oDgsu3?XnE8bQRd@2WF-F^(O{&any#Pcica5d?B#obzcp9z5i2l?WCsGmcTb!&HVv6Yb zCtRp@i0xo*c*JEBfC5^sBU!l=X{?OaYt)OSnTKsu?P#2%EKGF|dePk_J32N&^(7Bd ze=Fa*)X#K82;^JmKwi5U_ty#?6Ky#&liTKaZ4)zHBss!m|Mti2xt8qv zLyYiD*24t(FMa78+sY1Jr3r}?`RRKUtf?roSf^% zCr-GhwUu7hv^J&EIsT8`Ry`42<#=)L{y)DB21%A%#x|)9ol>4j5BJ#nDD1uXNYOqA zY4<%9CDGYgTIHL0%no0aeEvd5vcQYc;!^JAnL=UKJAGcA#E)xtUhKVLc1n2Fl}{AP z!~nzZB&x~6R)QYDPJ$rv-n5+KuHC-<|1;c=NfzLFO1AURria5kqilQI)z-LhUpjG? z=gP-xo4uRfH}+rHPFMd__;gxV{qVlc?5kz$Su5=A=7e{}^i#_95AL(zW9)G7b6tP$ zNjP1zxM7{OC(rXezH-~yRxx(qIO8W9=~FKx-aWJNQ0G5)9!5U)d+2q;pn)YIX~&hQ z>rE^j+D#=_l*->5r6dUbwGTh$z7Yjm!4;%xhZo~3-Rz_Y2XYobn@`gWtXO#v)HF+~?r$b9rz?SzXF&4}tp3YK z?X-!pg|4xM)+O89y5<^)wdJILCXlLh=^6C4iwtd@Q7P}fD3`*jl&gWr`pF}X&F0jjM6Wo%#eDh}6>P92z)b4`Yjbq2mLFRcg&k|WuOBKcK!bK$^fGpQA&xS3yy# ztD|UPhE&SGqu_vhqZ$TdYO(&;KDarIQTVQpUapD$wF!D<#@BhkOywK!0tRFHy&|W9 zRiO!(juy@bNN>BSs{NJ5mW_M_JE+MV`>$;YnO#l;>y6)bqz&^;Lo_qC!zRJ>y$0xu z%))XC+9rl3X6DOCz@)%FdvN>X7-XIX;&ABypJ%5f9EG4EM!GsTui55dU& zhw}W_7XGTw{Xt<>*nd#??NalrvhfFn$Z%Sdma86rE&u29_K$aQxX!c{xc@kP|N8pR iho|MQD`hNueeozIC%qaWF5y_ng7#KJ|7#P@L6gcoV2jW~N;15`b z_tIi8r6Z)<;2Q)pQF&1qn2KohI|D@UJ*w?nO$Qhltj?$3u)Q_~#xO9gmogHfDz3VF z_bwu&nwf{8uRWGLZZDc^4-Y6BZ=Ekk=J_4W8V3Jl9+Vyw9;gxN(BW~|?AsNej1c!O!gXl~H$grx<}Kta?fLE5r=2cd25JR~@2d{p z2Csj+dw5VhLlA`^*wwYQe!d#*>FJ^Ir$q6m#6nMg{*b`q8vpc7NN1n}Tfh)L=KV6@R{of0O{y#1dn=B|PsjjIZCn6HnWhU@& zb^Z4Jd*w?y1}3J#kr6Dfzu!^)m7Mz817837{Tq*vFgYoywxXgP-zvMcRhX8RmWD>0 z_L+gbl~u{NZ{JEwqb3RP@X~qga%yXzUneBslaY}L3k$0S5}lr&nwgo+eyjA0- zz8R9oMabR(H)etW_i(iq{dmT^=@p|*GsjKUiS(ew-%uFABLS#rt$Y2s{JQUx+$*DRo zFVG7XWpzsoi~b9aL_kAB!*rQmuyuV7g>OQcZu4gwo9NcHwKYb+gvN%3BQjIW%+=)| zKVFd51&UFnsc`kRhe5HA8xLFL6csnWqpq6&8>g#1F)@*+gSw53kZ@TxZ%JKIQ89#< zgX46yJA9~}ac_H@h?v;W3JjH!l2TK{m9kE0)75o-eSLm@&KzVKB9T*A`0|Uoni>l$ zt3%#riBDG&Ho&pFe|-srxlNd~jeLfgSVd^XCpYEiEn0 zdJGBsWb{)s1pm4^9$sXlKg#Ge2ME07pPg&;9Ubw=m|nfwIK3_o^Skfl`uXjf@vfVz zBhus1^XJde(b0>Fif}aT@wFh~-31+n73vl1x0i=T;dKqe!xa_mL*a8HBMPPF4i4__ z#Qdb4Rcp@^kx3e=aC(zwKJ3HGOO<{J^RYA@tEeF<= zlao_%;HSFU+Uc1Y!VO|#VvXrY5^meBq>)##0WB>LFJ2_E=nM=Gn`~&%AR#DqY)|A@ zcvi)Rq7}7$OG_h}%WYTJ^TH<}pl|HMR5zGh@_D?kci0>n8p6Q9sH(0`fsP{?us7Ik z4B%I__xxR7FRx#3n*$3bH73S)wj!*o_2J`(4?lBrp_3h2H8nNKWNFY=cX#*7ml5_u z!^0&dCF8I|=q{D^L=FxPSXfvyjAv+Rce7?$8G;^MOibaEhJ*o824gT|^n84&R_bnU zyj;D1{%Fa`p*wh8ZzRodrU+FeYSmh2Gi-4@7;X;s&~e)=b_GYZZea_J1qKGr&3!a3 z_hd#J?9$`ro21p}}YRk%4El%-}X$ZQM z(YSe%U)aOObo|Vt+LYP%;lC9O>^zooatp zPO3rBBgTt??9j>gE|2Yi;_*rv;eb%_D?z-^^`KrdVm4he3AF?QMqt~PEqr>Hsd4-k z?Fr0Ze!JDKDccW7IU=rDUgG89s%_%QIN_4y)myY&ev$z*%10DjF(q)K>#YyFtvA=# z21d#!uB4|h|c_+qK88^ z^a}zu^lkK?LCN=swz9lhAhb7Y8ykUR>E{r3rVdSK^A2ffMyC+EZ*%Z{dR(0U$0?Xw z3b`I{5w^(lRinzvO0lvTvJ*lg{n1?Y8R3EiuUt@g{cTuzla=_4v3hV$|Jbya6cmVf zdwY|^Ni_v}N=fx_@DYl>nomhgtT{hnt2$nAS!(b7`ST})aQ{ z4dcf#$EK%)+pscLQmtW~MXwsGjbdYCZ5gsgdmlvcYhqs^(_J1cKyfP6$1#L@J|-8| zBDza`>6f>({-~iL62lygQ4@ZS*>;>9@LL&C&?v9+&u>^H7A`KXzKEzOL#DX+c$51V z%*+x#GjCD6->|bATsGJs3U;BuL@q2W9GB=DA$oGoNLdnFz_YFZ$RT87JQex?UP1$0IEh&t(q4;zH_QR<&d8k(JpP>oA?eBZN+^<4LE^6N z=R2xf5X$dOp4YFbIV2WsU!fNoFY96Yn|5i|-u+aXlCO#pde$g8CjCFr{^raq2~K{;mC z(cGeYfBsefGJ`_$yw@ZHU@-8@1(n?+)Qz*5B zir*RM7GdQhGvwgQIkIez*#I$(acymF(nz~sG%E)O?t!$?9ubBfs3S9<%os@rXK&WI zg(UWZOP;$Q|1gl;;ytltyU3nb_4Ic=_|J?aOA7Gv^77o!ICf@hJC9$^k`4L7;XZq& zPcIQ*uC1*d0U@}NAi2whVI#u2yqfk~#(!|VqdeH!3Q>mRrb5KwA{|l~5|b-P2%KX> z0AH^dHuu>$Nm*JlJFvOuc@&gj^8X%P~u_aiUX=(8b2{azsu6nEbYA9bLg&&Ti*$AS0#mlSrG5Lpw zheISxRIe`K7(`1^%v$eG#(unNu0?;=q1)hf%cXv7lzE``PAhhZCUhqWHeS($~ZDo!5Xj3g^5gy|6H}I@kdTA4s8YlPgYcfWJT7m(I(lqG~MF)d!QEHq?%biwk;X@3WY! ztSo8#FA-QYiQT^-O&uA<>|#SyHRVs0KSalB_#88Jbsasl(c3f z_AX*%8ET4U8Z9LHdd|%71nczuv#k3v4xQp7dhjpO9 zPzeQK${9!-D8G)UO7Grb<5%+=Za=B;(I{zbAV@gbLiuljJv|0?(fS zy#HD;^STM;&Fl?+H~aI_xP-42dt(t$omPqC+~(!cMp z_YO~}MXFvGC*ZZO4;)}EJROu`fy}i%8Mht3fBz1}Wk^p?@9FK`{QDQO2HpnE)Y1*V zCW5E{&C|7WZS7_w>9aS?W8TWz+MfG!)gST|z-vat0r>LAo;#Z;BW4PQAqb{Ni}Hn z_BQw#X=#5hyjY)@+cEV|C{$Sk-08+ZLV7xB=~gcuK7IzD(+;Q*edvK5e`;-RZ*Tw1 z&gOmlrmwrjDy4J0IW2iyPvn&!BX+wUv|%Oh`y5EoJeDtS9~O;ltm*e*x$< zWW`WaP^hV`l@97%6a54JBR07}c}-1F=yL*ss;VlmmcE_hJl#h{JTxgWacXMH)6;WZ zmv|r~EG#TC@(Ds>alLu-iiyccHO3CCr^2|nI1SX3%GzS#sJ;8|DBmT)|L(#bvxrtr zCLdV71Dk)53#%)LRipPyf5W+s5ZfC?4U^6<<|PbY0` z`1&FvBLkKP;k&%Jz{;DhSGvY8v=xQ0d5F*}*fli+t%IV?s?3r$PoywoeB;Gd=yO zA>pp!-Kcy))<#BHZ&d#co7}ui`0tT}2 zu+%1Z+p!(Q2PXAOn~#J|VtrL;8_Pt8BF6soy7pot&(EifM-N~yy_;l;YTcLaUBO5w-A{8? zAuS)`3K!x#gh zfc<;8yMyfmHW8(fKV=kJ(|E=Bap=lQ_IT)z*m333FEhfnD(P8SoBy2!0u+QTn4A?b zxm2PM=_q`hB&v(Fjg1WeMgGn9)7vM1dfQFDjN#Dj7IW}StCGNGU#JG7o1KNiG)ra*|@~(?Iab?Oa`5-FeyU zu5F@>hWv9Aij0H=x`dkm`K1PF1p|E#J)ehG+0EnbkL4`A$j2kcK30|+&#B*<-0WQa z)!??bd~;VjI^bN2X;rZDY}r~2t_lr`Yg<~PtSupWK>jsx3$4AZ66#&MMOk|glz5Y8Pi3J{}c3dMVxKf zFg}}_UL>{N(Xp^ZG2Qrqnmj+RojlpoL(j>HM<*{Y56ag5{ywO^NJvPYLak+Gqx17k zm6cDhlaG%t+4yuo^nXXg)6&yB+};jVN@jA87#ey9mXPt@{(h`kAU!?3%i$s>I(j2O z%S;v3)sfNBW^TO6&@8-=r#&7ZTM2~{9UL5>qN2`sVHcN_sH&=(7#mY!0a79o8XKz& zxKhzM*uJNy4z{);@M_N}12;B6y947(Qp_}>_kvY`@ojv_ng34%BNJac?p*}fd@rwj7n z*7o-J@83Wws;sICNYJE0ASEN)UtNt$O&yT+heBznsWo)5_@2xEXQ{61v$C?L$m0A| zke8?8;Na+#g>-!W^vM9#@4b>g7vuKfA*kMtK-TC76MDWo4Vn;ThB*0u3mxoi`%|ks zDgYW25S#$0rJQbbIqdje0QxE#3W|v5-tuxxd^|J`sA)`0MKd!RUBf7D6>a_f{XoxI zXz}{f+si;pYwYEv)1cz^zvVngA}uZL_U5JmU`0MY(4|b0oC3uR0MPslcC3aGo3QZG z%uGnneAU_UYGNWm)%y3^|LnCU-@RphUdVPsef{vri2cMZ!aw!b6?QfQigQa{x>BLpMJ+;-E*u2O;-DGne^p{{q#e0y75k8dl$bc@sqo<}Mp?=``VP zT~!?;UMYAAFGDM<$p1dS>+Wg$Jck_^g|}&ZB^c_o!i6pFMDU@c0gjV6&dbectzelL zatj+31~l;biZ~@+P~Ad&k5zHQy9p1hEG>(H5`Je{Y$Gt2PPStmQU2p{;*-3+-m0Rd zrL}!^*F!rQBdV%|Ch5CrDC%lRWev4<`l?m&#PxgsnKuKg`VFk9|1Uil0AGNSDZrD{ zoIL=qzqTmTGjd2hvnB1l2NI#sfrD@}SoG1O@_y=jH4$Ys3 z@5!a$iL1i;U2jZCTkZC(%A>)U__tG%JwAe+<5Rb^qfN=oIvS{3@mTuZ+BYOP?3gY* z^gly`$?>0g<(0c{aBZFK#-h_HuZ<&0`U2dS{UJ8+MU(68>k_{&J; z@`Ts;6YvS|8Nt%k)a)M_IoR7<|L&s?BwbKkgoGXr78)ym(&^~vfO;7k8Y(~@oq&Ob zl|#$IQVKpdK>+K2c58b(BtI~)JL}<$;q4bt;Rgl=Kqu(wk;27|@9TT}1<2AwBqYED z5pM_z3Ia$Q!e+|)@@0d=W>jV-IsI&t{nPw`(ilTVIu8V5U0qP5qs9`MZeTTUflgpf zNW{R9|NFO!u@WfPj*k!bz$sZ?*8fx_PeMXcm$I?(9}ve%$jk$(bRmhf zSOS22Akcpw9v%RY4@uBOrH6-u)6k9T?(SY()VQ?86 zhNs02DMa{E`xDyS)MWe;A1%;QDJUX8e^af*-PJW9D2N*R5;T*58qk~o`Yuk?p)z&j z-Fo7O2*+@st*t1}0550s*RR*CtTvxM$v7jc85*u~FL^>+H8nMX2{AD-(b?IF5)S(J zils!e#`4Tea%7~uqobp~{@1LmrJbFZTE(RQ1ILk(#dF@gd1GZ|1-1~t{W0do#^0i& zu?wZ7q?8tcR0iOHo*s5|4urlGC^2i1k(k?XT-TmLiM~jcalKUkF!j^x(1;2RMFlSp zxFy!^S^x8z8Xb;){d%_g(c19Q7wRUkI5(HNSHldT9ZVce-(P_;pQ?JtPajX>50lpm zL++tu45$eRS)jUmij)I{^lt)jAaXW+3@Bp#L}X-HTQ7%yoKAi^uh)KVKC`63&d1)Z z`s@}VDr`@dB0CP$0z^1i1Oa~j@UqnP$azpO1jEDSeon+!w|~bS4_e*Rf>O;z9$Wk8 znfyNn>>I2S5pG1DV_#@V>s$}q599g?-wxbko*p?g-wPV$8Ub!I!yx6F z3!hOU-!F7-koanL1snNBsbi9i?JDyU^DJP|&aVHrL;o-A0q3oQLkTMN60zliw}&h$ z2B28}+fbnrIg^vB5m!?oX8K0=%A;@p*j?&n4xklb!S8R25tF3Rn8SkMfMHJnm z*p23z<|YpfkR$npq3+ITX>B=zX8LjtZQ$eK2=luYm>$&v($VAPcch$8-HN;^dg#@N z`PJj@_OhNit*0mbS<-Vap^Rj*m7OPKnD?(wNFK7Dd*!)P>FFL_Yw&L=Cg}WWtx0+6 zb1gAYRf25S6z+Rl&8j}&B8x&~k^U9Ye}=cJsdwn(oscRR$q*Sl51gMq_+@Bl2-F2< z=R`#T_@8&0?Hz_%K2Vb(y2v)4W*n!MANlTf2B;fg>L{bIcwUwkk16{8UQ+H=~>F)@hmRv${=I{veV%K5&O(pOmPP9dNriI0S{gM|N}N zVq5*7lSbYy18eu=DZx)P5FwirJaByR&eoxh&vA9{pQXA72U$%Nby-mE7;)G26Y?DD zete~>_A1Csd$Rw(VA%g}-xnaa@$$Ooz3`(9S?IinE}R@DKA_@uu>j7`%EEGSagl>f zLqmfS0vhkLh{(v(APVQ_c~#%9FVxn5Qh&m%uvso(grNLWWxy&t#v~ynO$SO&TAKJf zuq9(f%Iki|5&c?s`?OV~P!jC!BJ+2(GNy>;BJ}#&?f=^ShyUIEMIGHikoZ}IiF57X zaohVT33XECr-{H5(Igd+1>m4d*~rMMns>^MQbH@naCY0Ho}W7%?EXeED&)>svFw<% zD|R5UX!%H6d3lkA&%IP(cGeh}NK(Y256SHlC@W(>F>TILu&4~SwN7QC`vQaGW7$yc z*idqJ%sHvXHKE3mnYEt!Y&4pTl$ju$%7KJ~=V*v!P)C-^#$q2)=^UU)=hp zpOUA`er|5=Np8!b5EGR&UD5*ta~A?P8xVk?Mh#V!l#sZ(xuJ&6f~Lj9#FUqi2DEsk z%Az6*KysK2s9yh*-p2gEOWq6Y?v~u6G}MEjsn?MLp&&jlFRwY&pz8I{hXF;?;ib&R zFUc1{MfevF&J9C@=R@GV-Rg< z6xGG)+1VHVqPahRJWl@(1DE2+RiJbW6=0&7xj8XKAld;URt#BW=j0S{IhbF;<_8Y} zpVhU7WhzoM)J_O(YkvY90*s6(ji~%g931fp0RaK!iP6yg!=0UugRO&up3*&r%qKZ+ zB|G+b{6}_h=US7@x^l-P4uajct=-+U%*DY#=fCakfd3XV0GZGV5JuZJ3gD+WCL7<1Y!o<#Qs8!-Dg zm}2Z8U!e3x{Uu_sP>obE+%7Qv_-JULlLK#MWx;TPK_-75Xv<%1iGcm#;J`tj|NZ-z zm8L+Xd}%>J%x>qztQoS=^Pl#6QNF$~5&6bgSlHM;vZN6TYpm%0>LF(EMnlI$x<_OT zjT$Asds;N{*#DgeUjbXkji`i1gIcVf24-gFlhf1KU@s~G&AZ5CLUw#+eKWIQo@c5c z#Np!P6ezLsiag)fVqsFp%a+m=q%l zSt@5?rYJQDe9cB9CWOK&D0qJ?*HON_X2&MQ#+C;%D^uaVgcWsw`lI7eF?Vg5Lj_jt z9g*xal9Tm0gis?e%5h`bGwU6VFQu81ZqbbS^nY1wuOH2<@zazK~rLN)- zS>=u8W#5_DHz0lH?BWufJsw|TR$mL3u(PwX*zA#%_TXnlhOxYWEqoUv={rLJ&^7(X z;8rsJkKDo^KV-fuGE&rFp`pz+D6(mbKq4^iA~B7Vsw$d+S|3BXs>+PH z(zu$>0!l_i_(GV1J`XNPkD`r}<{v)7xuc5Yq8Ikf?T6%f_;;g1&9cHjgGB&%TiwpN0C4ErOG71VwuTPbqeD)&9 zjTKDy^n3@FyByRcg%xL6bTsZ<#>f!JSAFkHx2!}NaM0{=g<+!gSxj?EC~Kr5qO3$m zaj0`J`IRv!I+JYKmO(Cv>}CIpn+?k`-DJcTFGuM2DPlYxr68YsHD zJow0I@i4WA8PFjt>-m#=r?lni!EI?B!_BKf_-`OU4${Z+>Qy^?2tSo1A$pD^f+tAs zIgd%ffIL+d=t&B)x$>&2_#Prii6*1D9iHlCx`9di3Z_@QG90@zJxt zILuG237rfOGx+$Cc!-#Q04cZJp%Bo2#?X)u-w)YZ8oYvn8G*h)q#fcOdx@6K9fHXs zEu*WOxp&5JhgL1F0v6>MrtC*8trbgCi{FMT=40dIellmUuS{xsU!)(d zqp2y17llO`O$BE-yR~J07x>L2-+vr=>T7E&MI<{q_4(D6E3*WPN=9a8&>GHHhY3ZP zT*yTe0TRL99mfeGB4P|*5EhUkXKcdI37_;n1R=QyQMQ^6g0{RH({&ek?`UbH8Y_6hIo?|WQR0u4NGRcs> zkRg8|AFD_wlbhGyvAxe)_bfORxJRAAKsw0IrjqDHsqT$pUc-$yqM;#^v5wSDO1rB{ zgFh>>deF|fEuz=kH}xU=!s)K_DY}}3j5wx>7G-rdIX!t*adhO}D0L_P4^p0&t0?{d zrIbzOe_keFZjYFRQij}%RWcPyArvJ)-})8Rgla^@WUSRVHnD0bp;*cm}qQ8f7vg%CxE ztk`BJeZETbmFaW<0e3!U^WPRPZ(S%Q7OeeIJBWUSz~?v=po-dx{j{LwP3Eb58lXQl zT}}9v_3D@=fn6)MG^8-t)rl_m_1vq@KEVmbJmz8B0I|;d8qjz({CY&BKD^3vc4q0pMPT2x!y`6FvBd!?St9=**eBQX4vPA300DL zA~f85-}CdIQoLnx$i2d?)de3dbLgC88f%@ zG;nRu_rLtdwTW%|nVnN@t7*GjL?0qg zau~|$TTv__5j9f=+0uKK!^X#5zYEqxsjRD=9(b`P`U9d*I+_cEti#W`Vqv9AH(mCq zL(Bq5J(VnrOKPsnId$&)V^&B?QiVS`3RTzGyN)VwVyf&Q+;69k27mN>)SYO4ENcLQ zb^kWSVaSVXtGQLaY+6HuUqgq!59_?+*z=sQp?@Ashli96QO$dGy{gJSeX~VF z5Po^_2Q|;ijls(&FYP8pcV|;r_EXj_t&e-pCO2mD24FlNK7LFE>5#a%_aH5YWt%rj zLReT+LqH}cFHc51XPS%{3L@2eS5Ysv=s`kn@WqSkT?p{ggRSi41`Qrl{XvQHz-)Y~ zpbLaVMD3*lI}t}x$B!R{?^DqqOSEnoCi5SoKiA5M&oqp)mv;NH3-OIlE!em3PMjLF z_6WD4;~ZukU+EZmEL?5T0yi>>nMdeI%2iw(J9hI}YLMj6<6Ck)T^hmk(#EkXqXa&2 zL61RzU+!uYYvK|?DAdb4Fa9LOdH_7wk1PuYtHWi0jX~50V1*eh2?+^KE-rhg+b|Kz zwy-C{_6c!oe?KxJLZa+wdTh*gw}~)!eRI>|^Jnk-^XVBQ?QLhuUq7p>_Kwq zV5v2_1EkGAe3$?Uu>a@^25nkxT4}WU1F8h|_~P2K4j&H}*TvuAwB6m^`7`WgNF*E1NzsoV?X)@c zgy<{wj*e#wjV_ubga~d`eps5p<1n=J^dP-r6cB*%d3TpCX`OBDc&!%*xwiXg&L3{;c@YlK@qZK-7lY6)ZDfl)$Zj}vbad?O)NLwM z@B$$m`Oe!=O{IVxXXGZEdl= ze(i71hK{kbwgx2<6cB)z=OCy;$c;lgJ%CURvSD~dAgr`T-83~e=G&L8;fiBmE+d1Q z2-F0BeZ29P7*^mQLt)8g;)?oP7Ft>a*qa)7L_tA8a5?}Vn7=W3z*YR~zW|htnBZs~ zZEX;?0U-&t=LG2Wh8`}Y2m07sJ3Bc>8Y2K+z5noG+yNdQo*B)f6X?rY!GY1y(GDDY z0hK%&s!Ow!UN&(^&D^1s7a6*`!48F@p7CeRGCywip}~%$Ys!EnW~QY0mCj@n9n1S((HcUpBP`lx{1323-F*TKFg(rnEV;n-^ z2CNT+1ISN+w)tLI6@cIt)Fg-RmbV2wpbFt}A!9vl7w>Qz-Tg=H?8mU=#k4aT=iTLv z4U@W`b#=)gU0U_?XQ%O}PcI@+;(@tK;xB=^sy`FOOGw4~ZDwgHnhOvibNGA^T@zX*~ z9B_q?XpxNs?Dl5Z9Z|2rVGv82)de8E6i*Khq8~F!k-y6W6zbKjiBbeUWY5sk_o5hq zl5ccmL<$M3ro3F=fX^AvJqn|T0#XlVY&EH&A7oeFDq9Yh*aS=jdu3!%s*u0sZeavZ z*b*EXU!OUznJ1IGE=pkOyEEoNy7-F~>gqO8fF9+ON2wntG6_MGx<6-$LT3 z!Wg3Fe~hT(prb=1s)LWzq)IFUstSW}AATg@?KnSAuJ1s=0YoI!5W91*fl?OI2aIv0 zj#5V9d$l9rrBfM7A<>|AoxNMMW$TKl)0{KLO&#s))4wL8LZ+ZxOGw#h5H4#tQ^cP; zjKb@&1upL%@;(%EWcw!cm33&z!3YsjWOITxB2`}9`A99fa3kq$BU1&%17o*W0r}~l zHS*Tt!`Z)Rd}6AEbf9s-vXIU%E@Hh20O>>H0QDF@r4?R@<~{mMVDYP~s~dw8JIf4R zjkYh*eSm5<8`&GfCnoi!x2sDV1a(h3U*jB#HA4iVd!fn7fk-1GBj8oA`G5aTZ)h>Z zlnZu&G7n$S44y^6IZmB;%8>IIgS-9Tp_KCSa-d75jEISe0o^G^l(z<5xiUAG2CX7J zjoZeMrAh+u0sT9_)-95>W0|(CJ#Eeoi-5JQmnUj!YCsheB_tyv3cU~7pj=MmS|V~3 z0ai@3fz9Q^i&tU~8VLuiNRAJmE_(Q}&%Hl-pTB7j$;mYs zMP?1V`Fw@6@ni|{RvR3G=OjhQ54&4}G$kY3)2qZ8YiT-EYc+o2?hFIU*@e3gbXlXE zaF3ESM|vB-CfkIyFK)#LMewK3dfO_MaPF$kQ!Tu_1Z6cW!`@Z^bw@`xBQ-T{p#kIg zYvdjui`YBOw~>T+s({yrB&5{--P{C6mQu`>wNzCD6DpOS4Ib|9#v|6fX5%+BAL=dy zb#!d<)3*EwA(K9;xo_)M&^xm&27)Mz4s))|wwE&vO5JlXLmFyoL0EtdArY8mb5ZM8 znPu~$nVHcYc7L+A?lFDoElvP>qS2wgi$2GZX3iy{E}0Yk_iHaqlZ_;AKC6?PobyrB zp+#o?TfIivpA4p^^#sT;&I?0ldwXZ3kD;H`-Z--!lg4@n_WVKnP)Kd9+RLNf+n^S- zz13#U%r&bzM>QeAzW)Mw7-ejk9lny1ixf?i$!nuk zfyC3FnttV7e(s!1((-&`#?bqh?vPuM@#-$+Zs&JFsy3 zDV%~F!`1X5f*jGTbui-?8rmPp4{a<$9D1g;C^d`&3o`UHmWe3{!~OG!9vo-LqL(c< z`%^;mBqu$^xtfJFssRI8TPg-Ekw5|S`EGO8?fs)_!SO*y%zEmhUu6T!NI}@yNF~Zp zHRecdZA5*+%44tZe4416Gvjf8&D$R+_$Bw}^d9~*&k>B^BkdF{n1abvN=idHiVWvp zM=o$g{u=0%EIM1Dk0J+E*-)qH*N#`7@>-tXt_`O}%kOnhd#6vV!aTKR1N! zevE`9zVW%Xz3NFXUHtpH(0wHtWL69(HQk&3h%5@?ZdFC=c82hII8UR-z36gLarq@yU{r9V!lxV5;ketJj9-pv?zOF*A(UTI z$Vi)7S~9b;d>-zuLE@@(3;D{k1=KuX8xN;(&oyXuugch1M#FSA-+A0L&nPk-heQwSb7e^qfN09&mS_44wl zwodirhzHzZ4xOk`!3*JbOTp>P=LTbO%kIhf69G9JU2*!C%rw!KYjxBekzv=<8Dg(_Qd$WWjSfpn3wKEjXLXXiHN|tFgRX ziLXe&mTmQuwOHVCZGsw+k4ovo`^asE4^D2{+wB}Q$tst(tMmJM0JJ-^?5S@y3FUAX zK0|KLjXeL(_$SsDUb#j`(bv?>8AaVrgE>5r`lQKv$xa7PmfVFZgr*k@ONuhw-p1xI zAb=vna90XF~urAj?KU>XF}XzF750Z?)k-d$PC z@B>CH+t$g!p^me<=lX1Q)!$XTk^>vI;_du-`9@u@$440o5+G_aZO?GC2wQBGLc-PR z2@on+Q39E$kKbCTTD4Up9WtHQzWPq??4XJqZ7x|=N6T2Cc-hB!-pAHoBu~K15+Y&f z7;cgMa`|nJVQYqnr3o@J$Na*=2B`oChmo;y*CGd^^+H1eI8N4D8Ta)o<=bg+*wgtL z|NqHDyMyDWeEj^4jg1~29=EFge(mkq$J;#;qlTx#&Qo~8q(mfyo_&*KwAjeO?zisy zhE=WSceB?qm#vOoov+_FH|9HRtv~?#xCr#~YtLR;tmz38nRwRwb5c19-b)ZZ`1}nC zIq{2<#>4c_kPnA=f4270O_fwKxLq9?Kd&*zo}iWJ7XKa)CyPXQ!Ro3LnEv;B9X_Qab17*meK@Z_2iV4iY2)2 z2!Q)dOiX}}3AC+ZKMsRemPTb2~4Zh1hHU~F6a@t%UgghuR zaV|m>$af@X=jRaC$|q&-n9WhRGUMmtH`oZWm!2IqxrLN%Yk$P)!n<+b zOub%DlO}LwW|r}020;b_kjh}h1KDg1EiI5X1r6Ph2lS#Img7}cxFryM2Xw2w_lWTu zpk`rlU~2)qi?Q^Qi3xxM5ad8Sc0>~R?6=!r=QCiXCbrL| zDbI1mrk)F)l)+Gk(6nP=S%3bFhJ|&J2$H8X5R_lPet~H9IH6Eb(CluKCSG_4C_`N> zjK(&RA~N3IEoFEY_61hTGRS2ttiLtxveh>kIQ|}VLy%@?F?j(#^9oppJ0 z^?n^0nAz&l5Bo2ov8Ar#Tmo>qT4<(Rr03f&OV02N0`t!A|KO?Dg>QZD}X<>=$L)nAGSS=YhYjX0omObE}} z{W_hVlj&X72NFWd<(1^ElHgOC0oz}GRHU}{^utx-hD~oOu;uCDP8Ctspj=7 zHPl&cJ+=5%N2E@uH6q;+xnFgFZ3WrGdIFTFde;FPohS4AU zFLFE^+#ZBA(;pOd! z5b70DxKv9YX`VZiY>$)m?ypex@UVIB^{Hx7=8Z7f8)2R6^`a6}FR7ATsx*rmBS0hh z@&xX=gR-7`3imzz%S-Au0;%;MFIV@SWCJLPz_|6-bSp z85kQQz#bQzunP?zz8G|~UCGDad~8`=6+TF3xu^N2_5HyGvJ ze+mRA|G`0?FM)xG-1lJ1!-HPVpqSZ3z801VL;TeQ2s$b%Uo3aQ$$k*G7|jyK#{3y4 zE)Gz61$lIDC(Jr8Fa%Bc3O{q|rLlQi&Fz)EK>QVPttBpHBUE>Fa*ryS3<=+%?XEC4S8L@1D#M@jG1n23;Ie>-sTf!|y%l-3oi zc>zZr&|O^(PBO(Ix9Ka@p(%q{0vXmqF)SfDxfIErNjzYMC>m+0sbluwXD$FUBRku` zTH%BsrK3ZvfKyPA?4WCXU;r)E;1e^OBy;!%d{tJ~8 zfs<3efA=|mr3O)9m-&;;k#}ZJB~v6ErZz*GO&pCM#7Mre+;b1Gw!Y85{tTq?IVU}{ z4Xre*w6P$cwUUM+*2wAo<6pN&DvvLsFW=w_arIp_o32*a==dzY`8D)3bu@%NjBY;V z=F{xM9KYWD-ixz)RWT{}W4QCp#Miv&TR%$w3N7St32HgHLBLtpak5v-nd8L_4Rb&{ z2l3wKX2EahAHadl@yW?IFJAQb^@Ru`0?*nRgiAo;VmA8C?97aIqw_1kg&Tm(C8la_ z&WHy5dr+}iwCi9jKpb4$NW<0EmJRL$Fw>bSlz#*TA;oV@X$6*R6rZ(2kM9GMWjlTvCinIs27hhh^W=X@{sSpFj59D>7JByqpv0cYPCErMCLOhR3Z4v~1 zG4(?AA^9U#IGu@IDS5r_F8Jjg!?@x`Hy0(UFcB zeWNc{)td=5Du)Syt-3mYUhzCEYc()xD+$PtL@kcEoHiKkWLOZS@A7bQ&`vLJfBGa@ zUej_x8ts8RY)ys{{v?#4f)gk}yrW@}(Ec+$ZDwgX6ybDxvESF%2XZKcUj(g*@$e9S z=5ztex#G1fr4fj)7=xe4PysRa-E-ta1K;8#7_JPJ0f4Rayy*P&wDVVa>FMU^&n4eD zSoWnRH{3%1P5Zz|i-Q6YKDJk7uXX4)bob%Jm%eCP9-uH`f+>`x~vDk?*C=K$@~p^+r$Q7Nl`8;9#ln@+Gbmwh}ne1OwqB z!BTWu@#`0wr_}p8$J8|JTa^N7tI%gNn!61L){ej2e34(5mzEf=Yab#rb#0R|5A0Uw zR^?OUTMx!xT8( zYi@bXKMuOk*@=9V6iF9jEa(`lZ)jqf8RzQlxJi+mM|@Fha_MT3R3~f$~t# z)aj=h672^D62cGjxbHz0?ri;RiBWho&4oDQS3E&tmV;|G9<1-b2$>upI5ZO@h$CZT zM>?$jrjE=t;MDiQxerPC*gn}iWMQIro&XbtIJ4k%7N|X$$Y!;MB|hN+lM_o33?Kbc z4UqBmzF8z-)$J)HZEq|m=vWU&^Qo_952#<(W zjC8*)GDx&mrN;7~tsb!QdXV{2N?zyzO{x23oA2Ak67S!=KlnZ@aYw>&Jvmxh_JgWe zXwnI}Lm%_&KFinnWW}fSJop*wg>6$=OHPpu$b_AA(J>*vx+u0geMK=bF{x=!vBd&R zU&zYprh%9>TklQj!#F%RG=%s8Qo}y?6oMj?zkH!G9%o`^#)uYA3`N0vQ^1Vz0mHb) zep%MQfacfl6v5DW7qC|Yx8);4P8cr%i=OG7>~xaRAKJAGG%{SOADJK zP7~XU#G8nDE}7kv^Z^C8+lxkr0gr?7_58YFS7Ezo;l3jgy>E|9ZtbK9bpiyt4!!=0 z3a2-lzji3yk*iI<(UxQ2v>z|o@n(bpE0lLr0nztvv6 zD{|XE`#vDKRd8Xw{&F6T(wsk>qxiG2#lCYr>+@c@Ir-7lW!(t~|HCMla8VJn+4Nw` z3cZ6L(%an)ffZ9kY>umjH0JSuz?VVXIHc9JB-b&n`1ZaCAl2eZU}4EBbaUOBT<#UB z{>~)i1j|oxQaH70Ny~eYC#wd!IPd9b{7m_|xe3WdgoK4D1r3uWybZtq94M;O-e>ap zi|T9H<6GC-(vn6(O4*_79AZ_A>8`OoTidN5FRm8k`Ib4N6nti)hM-c6%e@n^OMM*b z$ARSISvUlP>B7j^@Mn#KBE7X*&xqS{tMhgYRmPa#CqMVl*QxH)C=-AR?hsheErnxYWObC)& zw8Qse2TkEvyhEIo`CA*Ec}eZQw#XY%-4V|-WkyDfdBtNp`QTLu+MYhw#9nb8*<9Cr zx~buL6i1jm=F(l#+x*R7{Tu$)igrrZBQ+Dcr?EVo?%3Ql_4T_xO$Oy8w&EAM9 zMlpWa&Q%$r6DwblR5~xQRfa{f=Id~>`xw><69I8k&*-!rWH`d|>|PlQX7h$z2nK9>M^vT52>5WrX&rWpr-?9SC+!6W)F3n z_ z2fa~>`q4+8fc7%tSfulx9)i+fh0VT#_j(|FuZBEtyj?~l6d`l ztxQP040(;`e9dXDZgxI~d;j*J-3$5_q~w zrG?oDQOCyQO&5I7bITy(*Ne}6XhzqqkZ8t_qo=%+-5bh5U^I~{FuEcm6Kgd_o^@0p zyWbu3-ktmBDD}?~#0Rs~GAV5PyPehlAxn?(wT|-hw`{o2aEMpZc5=6Nk8=%-+A{-D?d$J^xUs6?4C&%$;?MuHwuLLd_)_|ZfWcr zx>mJWT&goC2aDS~TKiWuX^hEn#YlGx$xq#KoL8nPYI4y8SWdaz0xclpFIjDrtGozx0$ak&fWQe4?K>+q9693WJ*JZG-_#VKDo= zy1M$?2ACI*9Lrt$Z~P&}<|W#x-0rV&k^402IO#p<6EA8_W6HaRbx63~92#HMEicLx z-LBDG+Sc8Xi}F3Tf=Y>d1Hmg1=jgNTtp46t0 zeah&o!y5%Z-P>Nj{uZoJRcNrlHTIMyLAhC@@Vs3ANb?oO%wU*O(68hKD*5B!s+VVV z<4zQ1TEUGk?b<)61ZRf+i_2qRVm7vjr7O|mQB$dKOJrLZ^nML#Zxj!-QTS9lW6)5` z1Lmafvl~MzHrOP!&kTMi|MYsbK<07u^-mYsz&hU;VgQ6t9I?xjZM_va_YC}cgiYzl zFD92w@i$enS%t=wNl75)CcRc<;{;E`5F8THI!d! zVD|}Ijk3qya^r>#x7iCc0=wJyMSD)|pu13L@!-0(e=hmhbB?B2xuz*dKx>`J+=WL_sMH4nnxT=!_MKzO>#Sgy7TsP-2KMh)8Zj#G}Hl}uge;U%zqZ28m zbVpd#HH#m8%_5pFe;iEX10(Rb?a+AHL-N0b$6JFj)3`J4TfI%_Y$Mv91dV$UG|$I+^+c4EIi{y-|$(EO6Ve|>cF`=b@z3BkAS zF5IYpax6Z-H2t}?^@M*+xj9JoqD94xJD6Ahc2!jEqwm$IYv%Mq$CBDaM=oElQL(-L z?iXm2p_#Y5Xr@CJCO$|~f5Im1@viM=>^OMRVq*^D&nPhc8 zUf5mSUNL^t&9>e4isS@4vbxTB@X9ZSfwj`$^YinYo6Lqa6%|1;Mg}h#9+)xw8g{8w1)(nUIvH1gbEyOvij1uNr6i(=1^n^W1%503=qn9RB~z=cSvSaaw3^$ZJZnK2ThmrjYuuc_ZS ze(@r;A5Djlbds-a#b1_@cM%OOlM1KMVqpz#vnuFl60)+PerQJ`@UX#q5#%OLG45jg ziN3V*QMs#&and~kbtVe57i5K+GK+EH)G|c`c_=R`cv&(Pjg>u zi@Z8@+dp3~R&~tBJUv@Zb3w*IW2@1$z5cqM9j#t@Je8HrmY{iRwpx2y$ap>6BKOj2 z`|aGE*(1uK7Z;jrj^AUCE4?O(@Q|yo&STpz9!<}xVqZLGyF$OWIs!qgupQ*HIJ2Sq zoYQUh+3r9l6_6N#_&WDeu>(Ezrnmboe4i%G7HsqmYGkSwS++0sY9JiqQ0@?8Hs3Dg zEYA1a=;=XfoT}FFEY8VXC&PEPHQkekx5^MsI|4;=exa65%kyyV{^2nPDKZYrYCONp zhfg6B>D;W=d_|Zo%zW-$k8kT?_o6AQVW*lt$vbKN$I9pHL?H11s^{?V-Eom;p0XJO z3rlX!wDIA4&$!go`jV0sdEx&sEbQ&=3w$<5TEpNHV#%hvgCryeo8M`m-brr$3omx$ z86~m)&b5eN>bX4MF#k@{Y0Q{4lO_Ov(Q;|7mr=ElPK z1MMs0r?Q6oN@Iitw+=+DoH<6jtpxVO-bcC@Z$!X}J6+AIh)#d*ca%i|<7Tzf>ZobX z+tTkV%?yil_qKcVS2K{Ab_&?edM>k;CbIaD@0PyG-Hz&K&g&$=I_|9fljPhi*i4(( zDB0-xG1}XOTV}t=xwDLk%aUk|khfxD9UI+i4)wBLXFQty+0KR4q7xQjumn(jAi6j5 zs;Rjdju(|xp7-pCMw=4q*1c6Bg>yMof0YE5WFD4#lnXEhfKWpH`8pHE+ls+09JB!7 zG|0-ywTyoH{26dS891&W%%75ef`0(!xrWtjd@Lcf6GNF4>=X`90|mFK;h~|Z0S$qe zavV$=1PUI{YK@!lUrhN_R8r5XH`W6IUIIRR4?9KuX8y8W%?L2RtN4OYEudTjg;sl$+;S-of6HWuvGulMawQY>UrX*!0}FoXMU}4-X0Xm7Q%6QveiFS2;O3QPKY_5Tm4%V1C7s zl=dHli-4%tfGY%)LSU83kaJQ9drgBG3zL0fZjO?aG!*Y$)L+|wT=%jtf z7J*%n&8m)b_Z?)aR8$DhfkPG03nuy>`S~Vr?BjR~*{jpOU;j466Ui6WxkVl(EvLQ6 zL^`Y$yF(f1Y{E}tFO}%JmO;}f@Tk1V&_K2zi1h12zB~>)K{oO9b{}2kNe~lind7Xh z_fhFPyHOdOUwc7?TtB{fJds7PX7f(D!UCUPht>YohhWKx@})@u#?EIhUcr=hV>5!S z!%QmhhD*l(>=`h<;MH#E2LS~1A|3CmQpo>3&?RI*E^eqRpn12ky^S@K(E2`WLEzS7~BCIgo*|Jm46B(Hi0LAB18QGWxS>3F1bhvnm8mA0Yr&@7eQt< z3*4I}23B1b3tE2}F?qTa1AZwjw}H{dw6FkbY+= zq<3QP;=N!RfNdj0|3KnqoaJw&kI#RBxHtlQfxV4w5&x`!Eu7C>3=DwswkW>v?d$yF z#|y{Tav4!c<5(jO>=r{mPuxIee^8r!4_AA}%k* zm@ydqgK-D6tDVA=d5pUatqPt}Qc@PGc>tiaBZ=S%P6tFN#rSr4Bs$`(|MPU2ZoD(u zHV6RbJ27gTpf((V$i~OZ3)iU(Y$7&oiQUf--L|%lQ2Ww*uV2HG>wRTqMz8$gf8zfc z_G4NikUmTk4$9)V?uQ@7?<*#O(GFJNDr8^^F05y3f^qN576gp@5$o$tL6Uj=Xa;P8 zVd-dbURlng`Z*FNGQsCr= z;Dz`JILOs(C$X* zL_ffo&Ff0|>}mq5ZSwT&O!O`enr~B4(UTG|j&%3*NYI9;gBmPR1%y15AQ+-6q3d)g zW9m?a1s>qM?V5PXz|a9uCiIr|G`_pN>B1H;5P~%@n;0DvOCF^>N+Mqcx5uKn7oz&N`|!B*(NYvOUk*6X# zu>8YYw||j-=-gh=4Rv;*$3t$ev)%O{Zmjln{*ywU6LUC0k~;Tg-{S^8?p-4KQ3VN{ zno#$mjz%{65PssuyhG<_hZ~-yNtcdE2=As4j@-ra$J{K!+mo2~E#CHR>-JCUcyg*w z(aRQ>RmUNJS^e)C z@CV%1hmj=GQc`N9YImgV|K4e8qwR6NzH|+`D^=5Nuf1E61~xU6(Iy4B#s}@qJ0>Q|KVdHri49^W(u3p>sPi!I%|Ux1LRmmq z@w2!%CXR~jyVJAz`J5bPLtP$As!+c_x6+_7Dj00E44|a*tY1Cyf*wCcA}29Nb((Z=+cp3&eI<4Xq~M z(e3Qo4Btxsv#tD>Uw7o)DzCO9Q{-QbH|m(Sc-ePt_!WEAKl^iRaVdFie)y=`-qy>A z@82N=pg?-l4>N_Y%dek=E{J!cRw1Zs9;GBKG_>0G55mF==KBsl5cRaAdbk3St{#|tp(GpN zq@}0(pb#7gVG;foK(lLb3M%;cL8#Dw=(}Puf0iMicpvEHYDhB>()X9pqqC%%4ojnC zdHw1Y`;+%vdkIIEjA@vmlVGPTbmG<)y}{Mf*T{f~?A)!NW|-hV^6^l=|F}`7-uGof zdh-HZtG%rAw*l2|dw<)|(EST7m50upNf?`5FuWfpqHKe6JJQ>(Hd^np?*giJ$TaCB zg9Up@TIV(xB({S#~f!N)in!=LTr#jtuZl+_}>V2NP=#CPAd!2H0)mx6W zBaA$GdQ@YQM-V{E@M%DA27r}2?dR~jr^Ct5P* zm0UacU6mhU&2d}GB<9o~$;WMtU4ma>VE*U+tn3^ z3;;NQzptmrnXg7SLZ#j*Ih&e6%IDdr8O^<^@)afw_g^k{7$}z?J9EK)i_Hxbx$e z`zwKP9m-(lH&wGYi9baCni|c1!I=_DkwkLb!H%9?5c;FYS&@h0a}-%GDoJ)XIv9xW z-N)WjWlgs=Tln+Ymd*UpaY8M>8d4y^Z8#aNvZA6uW6%d;2~Wv@F-+Vc=tG2qL&eX= z(*DtQH*apjb}<<#ckCC)qCaoka@(?j9U#_;?4|RrYjqXD3w=>L_;$v360!4VC$2+L z*9c$sfq*CKJHgXdW7QMG#?0dA)V2PU7lrD5j>M6iHv40uhRkD|GBSy-2NU_oV@?T^ zt?T1$rm7`O=N^wl83^2+*{dmpI5`(rRv@A89}Uh0aq(uLFu*aDoIDxkpb+Da1^7Ti ze^A`S!B}Lb8&*oOi^=$DZWmL&TvC0p=@F}kCXgz9Hjup)RrXimmh{vhGI{S>jLG!LaAwv*dd#DIEvr-d1@xN^exgTGBhM#IlQ+HXdkI#Z=NvBKBl@t>&p)5 z3yqJ|z&DE8Tp1z2G z2$%{_o;-o=3~txpJX7*D0!Ff{n_JV+$jJW5e5X<)@AyKp-B39bYyA^bhBLjK4^lSq zKkEhb4@aq|iE>k~@4a*HIzX%)X2W>m9r;!P>}Oo-_pc7;x=W|&KlnQey<&v%jc{EjUHZfbqkMg- z_XV|(Cm7TwtK+_^h1c!+$3{lnOh zZWPWf2fw5Jelg~!V>mzmzbg2*CH0*M5WJBw$1coyE;gQ?uF27XWLkVWWd|+%a(UC@SgC^m;tV{dcxoI=^L!eDW zQe8kz#{P9U9UN9Dd)jgcCUlcjy1 zk2ItfZT=q#oD_0%teeqBe_rX^6-bvAnncK0rq}D5rDQ8T`#*r^#6cq{+T!BkQF{gZ zjY(g&8Gip7aPyp$8!(Ac^L1O*)oFdG8&BKKtrZJzD&KZbhY&}mnb<+I&wr=vurOWK;U6sBgaXs6#MB-Er zr34G2TnA3|4Q)q4`nZF?dtviGD#};=Kt25@SEnJKR+p5}D$A<0WM|6LRfqe1q|%LF z>Pn5~Mb_~&`|;3SvWA{8f7Cf4`Q62Q>{veaaB|F!je?uUok;UXp7gFZuLey(d5{*X z^yuCiWZXH4tgcZV&@Onaz095BLaioh-iP+`lKi@-wD-TNTD`H=SIioSNBrXXjJ#~o z|D-LJUQOKKO4d!Jfe=&EnmMMKhgpZlrk`?6s$6fLCzu+sg}$-}H`j#t4}aMV5TJWE z8V9KoO)gdDN_nKhDpd)st#-5gji*#q3uq>|@FBEIag872!t!9qQf9H%bWbBEyIml|c)vgVDdlb)&HRf2$G4m^ylZ`lpny=J2M9HY3 z3#Vvm)z6ha+9W2ckEXVp(-r**1vg)qGdERZqpCp!x%1h`i9$W!_T>f>$gEW0PxH($ ziP5%nIw2(|;lVu}y)eg?PRcQyaQdKafjK<4CHS`5c{kH%FR!Sq`VDyimlk%$wyTDe zc41fz*~guiGjILHl#e3HgxfPofGTKTkg+-1NHaM1H}Q$PwC>S%?Aa7b05bL;9=@y{ z`9ay!&5~8*bv;V6M_x|P77RLF*G?6wjX|8EwcicxW%Yivk$+;CyF3}WeVvk1`>et> zjjvYV@%P6<-}!{tyi2-I(W{P56Y`4ati$F`-9HzVvSzG4>do}^pbL?3#gN) zt%j;&esp>AjXv;c!U@x8w`2%*BJ^ zy8367r_~^H&+m||p~vEXNqAO~vz%ut*>kJO6@(4PljNLw4m{uetDGST&tT<6oRqNE z8WZ~RlmO$u@y+Y#LT1fBRcY+qiUAf`kC|Cng|5QO6!pD==lCZ_yDfIeJ(*?D?}@oB zt(^hH6OgRfP@3~Xhe9C3BTV7ZrhG>cjf~>C!gDb>_qy zx%v5-q@-QQPT{t0hEzl4G+kAkqfYI^1SWH2F1fF+=p;(ORj_JZqvg4l`oN<^iFM3= zY8cmQCSj%W>1dx&^vd=6j23pp#bN9!GKz0$j8OH1tKcO!+v!4>MCENgZgZ;)f24hf z_GTM$=rcQpMzi=?6Hm|AFr<@2e*BvnuECQ7yMtexv+aE2uSzeRDQZEC&Clz3$Vda; zb_@bLN-lq-fByBox^fuH1bFiFHBlL$1AQMh%+_REg5|AK`vtQBM1099$jFqJ-kN`W zK0GxQdaRM)M+dSW`E`CYW2j%;O-jy8QDK?7`+=fW!p(+%XA=3kw}zFQrQ_Ruw{^jW zJY%Gd>5QTNfH9dpSSg!$MdyhhqYd?-Y~>zJF(Uol3i$R z%yaMTdhgEr`1y%v;q&m6gK;=dUkCWs&?3|HsOIYpBb7S8!wOtt2|&0##{i%vI=Ta} z7Xd(j-WLL#Vi3VH0Tk?_p+U;jf(O4Pn|2K^2S=kU7AEk>i=GN8?YPuzc3H?%5D`+8 zIee`~ZXOvDsviitQDa(ro!del%{@u$;nsG-V{+w{O>qo&l)W<%&OeD+mxXQnjBBrN zT{^BeRq=HSMdLTgNLrQsG3H%TE03&>|MP%VXI={l9Y z>iO~W=UYwYXW{Mdizo2(DMo`@UGF>x#}+zCHFn1$omYD8VzmIP0?XiyGqZ^GhmW~yD!Cq^RW4y(kTRSRjB#5Fchc8$EjF( zI5__7x#aB1q#+hK0&J!#L?C`=b@js=T_$#G5&v*cUn&i5rwLqu#1z&&Hb1IVcmGp= zv{w7ddHcrlolxbf!@$7{&aYOL6C)hX<_pdWrKl4lg?#^cKU=%XX2PXRJw7Y_wo`AS zB6)j!bV5B4GVM*#Qa%Jz8lLTLGrOQ&1o_h(UG>hQ`>WG%XGsxByCu9TJUZgySaI5fX%f#yMWRThn5s%9(=`1}Cftm;=+--qb)+0<_=+b(nW9d6?0UN!=z zk`sNA$U}HQ?o>_q>O@_p{kO}F(>r6}3I;tIin~9!;u%b2^%T$OhgwxceGPHUfZFTJ zxHyJrmw`Zdvjcz8z9h24fsdy@3uZu@c#QheF4_P5uW+S9{7(lUtYFW7g5U!Jc;rlB zfD*wU$fBgdi?twJBKi*HWjfk7W+tW>R?GX_{+hUJ4;$dF0Ia#zDy5*uEu)a_$suVn zlE}s(R^}5B=s_bA#?N4i0pP(#(X#28Qo1b2ZA9f_wt9vzg)p zYZipwK+f|1*2YG&S7Stjm-2t#&Kzhw$-h?Z99di~!j1oG@Wu40`7$du&#;vt_Hxu9y&2Kqvxp=y|Ry$5)|qqw7GUYbi8Znc@(t zp;y?w`m3Qv+I$3}#=_RShlXnF?zPnd&Thu>8wiEuypM|zudM&MV!elRQM=K$%MBRlNVrI?=b}yVR_>T z3g26tU@C$?rG}nKNst-=S1fSu1=-mf&`4n1WQy8L^PtXU?_o(T*Qmb)yM9Mk*TT2* z_v}P}7z6JCPeP3*K1?Bl>`z5u;T~wAxc31GY%qoE0i@K-7)vQjX19p+JA}W%9@{et zW?g3}Wl{;?rJzAHyE0Z)CDN=r@;Ds=|nQmb`2 z;a8XtnMc%9PM%18Kz}r*{!vtrcgspjK6Kr&Z;=Miwu3^QkkGT=t9|w?C<`1}SSg=V zz9c>%|4c^mWr;DGLLoA|WXT`ys3)`BKlVnp9(R68nHL=0L^U(iHMew8x8DeVchqvf z;pN^ZGR+LEwd>pc(5=aHK#hEun1J9O&Eesp$QRfEd4JKr@?KI zIm6-H3}7d+!l7y^`q7jzer9O83HUs4tN!p^#UX<`E{rgnGGUpBB2h1U?lY3M4la3^ z137&EGL2DddOI=ajW9yKD&kM6q-KSE-{<*w_=})cYW6!{sn7js zKnhFrN_+Dhm!wcFOiZFAk=$4kbwLt^l;nNd{XK@wd#Z(ZptF>Nit2qbpA-vW1X4dc zJ;%y(1qEYt*DnB6APjD5EMTnGfIKE~rcYub@!c*-Ny(z2VHCwbE{6U0haZZx>kr^v z0U*o7ikO|Js@=NB3k_D?oS0ot*ck|e1e{)&m^^YqS#UYL%P(P<8tsQ2wcMHR_F?g> z>YU~AD;=`61zGHr&dS1WFP$IKmnz^z>3&(yzjL+M5xZ1{F1pEPkrDR|WuuS*j2JT_ zK??3wl(o#FuEeS2jAp%zW|gl8KQpB&jmPuX7KryqlOg<1Ci<1ljaB#8dQvX8+M|V= zw+4G`*)P03`?o|O_2bZVrTQ85|H7?ftil__=1c1+`Z}LX^MCCRTJDehK&_}_mlYTE z9Vfs2&*}Xr-rw&YqPMxtCvdrEuQv(zypzrQNQSVnVd3L!*>~z;%du4c-E;2bcMY|A z+!uE0AWxGY`wD*fDymV|we_>gL|51BqMKN-B~pJ`d1G3~<+f$yGtx&Nrk$&F!)Tjg#X1R@A+k^a>LQ0GgGx@!R$G~jIFtXe2 zz}~SOS0X6jaeqC{#CBzn)F!Nway9ka)FRf-5gAoTD&4e`@$F66%|!x@P?OHo-SF1s zvtH>#EF^tzS6X#-OAM~0V9vLFrIctx7Bc${Cn?#q$JpBTf+$G|kNnf7Y?W3I{l@mo&liXLoW^5-rTpap|Y9|9!6FGN&Z{ zy)aj#dLFsxCZfRXUp3EP-r0Qw+Dk`n`AjVLIy3LT)}$*`{Qs9Fs8M--xVgL(Fs#WD z%b(YN>;CkWUSsZrd-5! z41anOQHCjhgr)GVTrh_;@vm5&b53s3SWgnkbXq%4@RhNdc^21%gI3Lkb0gl}Jvl7n zd<9Dz89OrclS;tL^@rw?xcdH+bq7~!Q)czW2K!(#e_Rp8}-T{vIe9h zx{`8>3h2;Rn_Dz7--{7G4}kL+zTOVj_VzaLgCe2HDi#4#{41pN;5YeyMKzw(W-c-MTB^O@YNiZd5eU(nA+`L(5cj!+0>yTy z$JO|n53wswzsR?5WMxBuP6DJiOG{=Z8ClsX#|^^n?!t@2v>RJxqfY)KiG1#cg6vJs z4vk6?`Qf%cWE<&P&GWU-8v~zSr_QRix{*sm{#(Nwe7un7h66v$E8$!Kzh)GJdpm8m zyn@0pbZG4Df%#vL&NNUaK0$ot7E9*wry_s$C6o<+E6=M~7!=;?omGRcGUrTV+2kf~ zL$vMmY3eO_jFQ)-B0u|Kf63p`pOeI^FE1C#Q|H&=A%|O}4c2xpb|klQchL;J(X4VP z$4k=nj(_ZCLB89J3AAHCKd$9qOAB;f(?IjJfWViyhIaTm0-SNtit*sa3P?uyiRk(y zLy1<+U)B*VD<+`wb6TjRf*LRD2Wu22rVY2c?%U8=;XyIZgFe$1exEECe)-jEx^g zL9ny|sFm=TySedk$1qJ!lMxf^CQXkzjT2#>{MGefXU_v`o3ym_+qa*7{xk#Ahl$B| zA0JV0q->&#ADnqel%srvHv@7wpc-&=_TCsM@52s0rlFH@5ZW{Z8qK=KQ13Je0z64A z&{oy>|Fu=I>?uTY$8JYmH6b8>pHt38k0vJaHbRXl^)WY_dZxxq2uCph8ZEEG;*ouIX>^?OjAX7Q!;m@i?KR*D`r|ZCDn#oiYjv zK-U6jP2fJ{_0(9nNn(gG8Lq!!zSE7wnw3`WYXl?-vpklnc|E`7EtRp)WlRT@;{D5J z?pWwc6QfgGi7cnBdgG?KRdv7YvB$#BF3yKOYx1!1;f{_U-@YN8ftgU^13O{Khk4?a z7jkm`@8R@UKmo? zw!5R8BXFn!yAt$l+(zU!3Jsky@sQA9=>`+k4>3gMVz|*|8my+iY@z@}s%U$`7bexb zhL*q2xXqz~BRdekLkxiukB;`A3!AB9gBzc!)%z9)3g#K(S4C zDlvH^T_|!IRtjT;=gfEAV(ukiyz3bqb+WR;Eb>RG9HjJPm~LxBLSOy%Rb+}74KPk8 zWDtq2yWH=tzg%VmzKPl-l=HQQ5`jU2!9-N14LA=n zK>=l;pvj;Ff&T^yhH?2bMjIQcSy<$OeJ203`7xF7Urg#JOon&w-P7|SCevjhW)kta zwf@}06(GDml~l~xj!_hnc^;+7u(q|;>ViOr;tj5zc`t_hFAN?B9I@%tF>_i2tiKHz zwn*ZD0z6$Hm^_x8|vDtDQ+(TJk>N%hV`6V!xpKYa@K{{p-_2aR4H>ceZhLt`r(B~b~uc?ppLYtvVvf*BueVq^o}5D@kB7#bdQ!@||}9DxQAgAHc@@F=iO6g~b+ zX3@x;SO_i@y1&G3t%RqvVA)~ryt=`8rtjt>V*lzsR$$`WFPH^+fCP!3!@ccA@@7ZE z>dhy5`}6EUFlRTHBa=im(=uB_D}F$!7y${9i+{^JTP}Zwb*} zc9uR&A^E$$rs9HEi}{i<-aM|({7qeSeUX1B8f7UyQ)xQZnMo&(1I?zN@%*o_Fbw}N zFo7{h{0)xUgZ&l7c7jW}CDdS$=r?qu!})~D?=3scBjotlDH#(v2O*M7%H)) z%=417zO{&(Ztl)M!jC4dOtcj#ZXsx)O1K{Mp%!|`65;HS>?fkfec!~f`Go~*#?Np1 zVgO2k2ENtRr6db~$ekeX(6zUR*elI~f>Vl3rQW*T(h6A={~=U|HDcmuzpZ2Y_5 zM;}Wc)4tyyX!@n|3kJc(yIKD6k?`F^UMOiHsD@54<)qHCki0KZ5dP(&=J}<`R(56) zSFLFpRJ2n|G?eUKUC%DcJbsj!+Hze~^t6@IVj;5BGU4;tVy`~+qvs3HfQ^izKh}fk z7_Pj!x4s?DlMu!&NSxC{V!=pm@mQ+!xx5g-LjOLa^BpJo|5cXUmb3v@egKGU#TOZR z3s69ru2gYbqF=T?YFaMm)Q?Fgz7G9yiY-iJ2PmB(DWHbnEs`AW)1{HAK zFTAa!y1etRtMp&xU-2{b=^@BajAHK7tPbX1$?k*WBDZkSc=0gEqmCrnyC!pHQnm z^z5X;@*?2bf2x2n^;j+(C*K3Wg* z40CbzuCAjjkU-~*8IaKGShPQ^JI~?u5y5ks97?b3_m!Zr-!S#L z+)MPm%TJp*KlcaCv7VZuRney+9A$gHJ4MXZe7$h?uOU)Nv~BXS#?{liKM8%6y8~Ec zo_w;;oKUo=D*pt)7h@BXi>!{>>ulOI1En|K-Z#*H1hrSHRRL>jW|Cfm;H@yA9v3;L zHwaW>P_{k3`d5OP?i*IFT6)iv&14dV(<-5yRxf_*RiNXG_uKDu(8u1P!)X?tWpLSm z83>NDptb^61pz%iE^cd`?*#glVBe37R5Ua+gv-hFjx&^3fR{S?nS-%(oScFJ7;S-9 z#?QnW0VP_PE!3eC$N1>f91X?|NFlMY{(g@rkyN=&K{8#Lz z95urSwe&E)SY28wxZK}=!h{T3G{iMgL~bW1wg=1I3Al9at*xID6Gi$=Uu$W30$>Ex zEDen*IH<%@0f{U&D(cP)y}}=8aQ`hX_WKbX69W($m}($zi01*P9lZD`avbOqbtNTt zXENvv8DArQhNb`-d&xPqP8IlZ=5gaIj}&|D^~mFfcISpi2Dwc>(%3;MFYqQd{uf z47~JIhPKFET16Vj;^9FwpZsr)y3adcEvy4L^J7V};C(nzs+mB8F_L6d2wuhgE*~z4 z{^N9KfTbQ^Rvd{gNdDu0O8DJr1w}>nMn=m3v+K#nVHxf=AE2O@QuElJuDrbTQ0Zt$ zY?zoJDQn}s!{>b|zC*0p(mDUS)~YRdk4Lw2ZM~j z=sTZtt2Md6Es-PI6(8zjnl(TnKzReBm2|=J6DY3;3WRnwOCCYNaN{7hbUm_KV2wa{ zB{L%fhf&P^$8ELgr!4d-e|@D;*Yw-2A_fvrHX|PM64-HD!~@2~l;9()`Gnbed!ySQ zn`h#PvBKNB@AX=wDLwsd$y_bb&z}Kf7#5(KxVSemGQl9%H;t~W7{e6|_K=CG&$ttr zeZ+bltfYtlpaY7HVS$<@6~D%NCDH(5Lf&W3^oT%WSDaL#zReg(?BOoFZdAn-x?NL= zc?F7y-<8AZFe(pTAb_Rt)K;R#5fTtIW(N5IO#z0TI2IY4C=BULgijuZNNS?^iR9T5 zOg5OX-}l$o)7zVGL@a51j^O0)_A=C{$!b^7S7GHvOWp35+ra=k9p4>fgQx7bV*yI! z|85(}dG-)3G4@W45lxU<{0YmXJ z^kPeL#KuNwpXq=(plJD~J||(sfM1E%eST4C>Ff$P@TYZ`n9 zA5)jB0+R+C#QB`(gWoCPI$7y`Bg7Xt@#i-v)IT0j^H%w*ze7bAcHY)BGNMC5vm|_P zOA?;G3g`?tB8oVS6P}Waa$ANdC0abHUAvtF@P9@@482wA(`^5KStI%Q4$e;?u)z@Q zA2_-&wB+nJ_**C`Yi^%YcjKDejIL!5llLmp^9GC}#a&wq?`-bF;@nSwAJBk5!1ASC zp{Gd>#?2@UxLa_?ZTM*F7yrXo6desM$_F?7X-T7wlQbUw)W}Ex#(UmB-7uy_2}}0P z%g;YKI50qxWHFZTgSofd!!Rk4o{TpnDBr-&2Jgv0*u8$SbR2a_Lp{Cp zO)sV&xOzNK{>m5{((*;t=~0_H!DKRbwD}Z~Y396Tw@jC{gM#EaCy*(%PFk%S?;!Bs zZBBrTS(tz!`S?drw?+Y=fGoosPmsv|)y{o4OR#x%O_4QxCcZQpYfR&k9Cm?}76%PH4{NENYD9T=Z zOCDAUj7X>_j{0DIu)nWXnV)Y1;3s{3m3!86bz6V_H16AXY=@>KCHX~ubRdo~%X*P{bix(m|7A*o3k6D- zJv}`&Y!2y^!%Q4)fhMKdy$?HO(T5C}px-VHwY3KN`f4&_VhHqr&}?ahuLszRpbbI1 zT;ksWY=LJ2PddWHeisVU%gUVKhLZHo&JNnk^j(jusZo6O^i_Nl)l`^}wQeg{ss5kB zzB(w%uy5BOrIGGN8bP|GTe_uFkQR_!X^@gG0Vx6LZg2tVlF8LKErn*?X8k9_6nuUAhrsoN43eOtqeBSFs90Fg^fm-=Xxtn5pwqMZKVheqU;Qsp z{=vuNXOD2pk0NB#{~y!v?D7&sIV%7{z~JD?BT!@jjj*UzrbJ~z00P0I0Q)f5iP&F* zkUi*QaGzuJ|0Eg%DqbWhSO=6}(``!i=^o0BHh2A2L}taQmpG2H&avStaxG3;MRXFdhXT{RgW-G2(}0& z_HZCXtmy%)^!Fpi{{?I`=!4v{R<4Rxj`CLbHh%G|Der4sj&^pem6gANI&MK6$a%d` zz4NyG@BtZR@i_2W5BLPOem*t<8dC6dJvCUh%IoXP%b(tY3^K_1xE7d|AW9%af(i_D zP}TgH2CRvJ;rwHr4HOBD&2i9CQOgn@vDK8NX2Pbt^LsV%YWa$^K>12wUxgXmM@I5J zE)LA&rz(!4s?E!X!2Zpo1LUs(QG-I;4`AXILJiap%Pb$nk(G79(Az71YNZSemD1A} z=I0|Qa0!_+o0~~BtXyGNjt~gsf=LNUoKkCyn}^2~yRa}n|LtRyde1Wav5s(dc9f`S zXATmX;kzbF4ZE`HR2jDD^;SDNIzX})m;zvCPK!Nz{#;y4?A!EBXDg|1+0(XTAoU8T z1UBWXD=SBd<0i3SEC72j+{=Or-lVQoKmil!62`o3`=w2=d!D<^V?9AXuF$F(=Ju#9?xeCc&MzyrjnVAu|mJyYv{ zRt)f6yAmra>oAKPn5~q8Rs`h?B%!p_x?pPjZi{a9IA?4U2EMSM)XshezH@DK6SX3I zCLza_fV4Ey6C?<2+U#71+z_xnS~nv3Qc}@Yj0E>gMt2bUXrx7%F?0!Hr`959vu7Pd zf=~cBRR-(A8=@Z~V7nn;a;Ow~qzr+<^9i+YWO(>@KCOtz!%Vf!6lOnqn(2d?g~fj) zegUeyp8?P!e}40uOi4^Zfkcun&w}`uv;BAF(@6~!t{52C?YrU%`qP23jiw{=iS);h$f! zJGd_z)cn#2s~BJb;FkD345t@CYbyDzyecyb^sdXJw|Iml!#{nK)&{qnkf0TWIJ-CY zV7VD)eeYp?<$2on@McP{wTgKK#C?{_JH##SJoz&%PJ$ZM)-qQ$#sl=NK&%~zWxv>h zmP|>(`s&r&M59KK-diO~ffRZH_&Ft#KSH@fc)_wyfdd!FED^NxLkSQn-WWw61A73t zPSzH1n90e_m7S=q4`s)Po`IRuX3m#t_ouhlx^SKlB#RljkV9aO;Ph|;?g6P9APhQs z`f?YfkP&C#n*LK&`{880uR`s33Kzin$37J*U;DxW*|GqKLm6PcG;-}t6zgsAafCc3 zQkCa^^!@tSC%jZ}{hPtN^Cm%Z+VD=KXz)I&wgh%~{>S*=ghp{@4{sds9vPTj#3uz& zX=r_eXBBE4K#zKa$Mh7Sin7v@5>|ov7qz15-R%W}WJ(hVV!l~F9271tF49FHWL@rS zAnN?ruU|h{lg+{MlIhy>@oy4AdJw#MP(t}RBUi$AKqNr@7;%+^OV$79J^SlavmcmP z> z=)}Cblh)lpXgcgF6nLMVIx6-{Z_PZ*|IKo+3%z$=$$QXS;ORD@2=s#J|2ku z?`}jY9#O*3xuBCEJblt5Fxy5wUSt*F^45gDqk5#)hrN|p2B_ejN+=ud2Ol6>FI6EhyJO8-@7pnuyQvBwz-3mDU2JheR zZEtS_V@w_Zii40%l#V(($uBNzaLudc9M<+vhSC;bgul!j%qJe1zNF4i8 znxgy)C_3dx6elKmK>D;vQ;V$_%j5xtjzN;`3$8-0`#R{}DpA)c3>pb`fRad%2lT(P zkG;mGwGDBRH~%m_lf`B!DSn~#r|+X`RmB(Gl6g@M)pSk!vqtzu`^0CFZn|E7@yrJ_ zz`ebqeY{P!8yRYBRx?R!1YHP@HH3L?J50N@RBT@))ZseOVN>J>&G1Hccv&G+U*l)# z-i56J^Z<`QQF`!OisU|bMClgG!~uXHb5M`@SIo-xKi7|N^UynV0#VdpNJY zGS@P7wcl+n`T2g~?S5y_nrOpw^NQTM-nH1*nR5zIdVt(h=3a`G?+_ea!D! ziAyQ1(aq0XJB(PhZui!BKW|)KQ}GJ#2$+mfAkj)OkT7E+0ahzGEnRutlQ^1TAtiV; zS{D!AFV3+R!t1L!w`RGnjxBzwPC&*>tj7z6!kUb*kRR4xAb|!(cGjNxlYkviD6}}l zAR{6Ydm{+;U?~#C&MtswEDrJnroTTtXs4@I3O_tFBzmCGf>gT4@Ml+KP)me&|IZN7 z)?PaPJXHR?d*#AQn01Z3vK^7N9czKaZUrNU;8!v20Kn$hd z6tgdXWDDE%?8~kE`pfNYOK(%g+8A z><=6d@`R#aiDt01LH_MdHOmp*_ac9rW~I_>tnD?>X>D!=u0 z3h>^}oZ_{t50-f-)=v?v2NTCWvfa1lb$J38@;s44*VJigO!mL+dWLV{w?sTX>t++IfJ9APZ>6J@-ZcnE|pMr>ftB4C4Cz9Y^!S=OwcnGN5!}IejOvoTa2OS-x zWSh}~6N1$jt2$6OjTc1c)Bf|SdDX7?-YxWL9y%W?{HecfaWuCgwA0k(vMx(plm>4> z?r%l+{b06OJMX#tVG(eY+kHO|^}mCaaTN$ZY-lfL+Hr|u4s`?Piq^+xw`;Rf^-Z4V zoy-FHM|V{g+O55rl#oIJR5HakLRRRn?M^1WwFzp=>8|IK+C`ffon%J1hG3n|uwN=C zhA^ihZuAi-3&tL{U4E|KFIwFP5rmXF0e0{O`gB7(e5fw(jZWLWAxG*qAF8i6{cC-O zoMDq5u^6|9aL%~FV%~(hc9+$)0RA z9A~~-%i&#H8!i@6Z!}mNQWzRwb6`Oycuc&vZ*NWsKY(6HLb0_xhWptRlp=EL@6>!_ zb;ZkcBa3zIj`B{Q?KyaOS9}Eo4S8_MM>oB*d!un9FE0}h3vRZN-o1_oBNwTGy{pB! zP|l3>9sWa|MkGJ@eeAu4s==8>D%-f&Cj zYV4?UG465!`h#9Ypl;Bt$iuXWtxCb%ge5l^yM3QWRXMb<-|lF_>Zookb-k4i+X{wJfkf>bmAdt~mm?!-)e)pgVJZcIos=F7 zB;LbP+d)`FV^9jPizgToAwQ^;9f~+V=PFg;Y|r`EG`mBXBRG{auw)=$AbHcr2h@7qOpUNUA)f;Gg;YEq*v(*jM^W z^#D%`Z)_OX0cqx)9pa)z5@P_AXCT%2^%Uat`@Z*K#YghQbL2p49Gr7D3(8qb-i^za zh7U*G$LiehAVeGDaa%g&BKF^;IGF06S((~e=f7b)nhbOHkK)!;sc5P36Dz?I#q9kG zYAzQau@w}C=ooNczKk7(U2iAzN&cPl%P%hI*qD2u@U)K^C#?RN(s=r;{Cyui-M!#M zcd_TtlE9}|O5(Qg^JJu?ij1hvUt81l6Tb9>`X4^$b~Z8bFfp;VmKvUS;+Z|v5`SJC zJ31At_KG|sX=MgWnvet+l+E3WXw=bj0eu8012gg#@s#m4Hu1?WYS-vyXacSB<|bxe z=LQjjzfSAlJc;vmc0O0kqeMu0M?%$XwW@q9QgerHf$V{GeESa79m(U~*@_HJ$ z&;0%Tup(1yRA*}I?rY=mEnwcQ9`BNVwrSKu1)@-hx+;f(a<4t#Jd7bJ|8njP7~W5v z*pJ^dq#n+EPZZoH&MyVl$YR70q3YDlF*|*A=Sg+vI+`9PUN&sqneS@5R^7`J#RR)d z@Kt@C<&z z6Umeyu9l7yaw)OM);}6tO*oyxN=Q*BB>POBLTq)0<9Eg#SF_`nVySu#B_CP_PfvQ= z!aqA+j6ioCY`q5BO4Pa-BKw`v2CSGwP# z)1@OgvuEk?V!!kDc+v86gQ*##Pf>ip(C}pPq$(vUG6#ruYhtm7Uk2Wc|_^r=!9Hgt}OREJi z^51M`bTVS%RXQZ|ti1K~6?F9B#4SAE(gD8h_@zo~vJ`94Nt*RX!^D1QT7+Aj%VBzi z#z?zg5@X>*e)U}iCsdX>X`K;0Z02BP)}3`<{Cw^#lR`IL*6n_=uW3xTee6J>U>zQ2 zV(Rb197_?2@V|3fk#mi`?^HbRNa0CIj40|+_nahS+|;!y`RT921m*1Xm1Wxdp)6d$ z+h)>VpVDCdx7&xR*1y{yBl0@crE%%BCMW78=A#m?3{wVBat*?SE-p7v$>Z$LD=FoSj9diNp44 zIh#dh1ismzuvDIxm-pYqRo^INb0aT5LrqNY(_m>se8q2#WfEt^BWlRJPe zX;llwv5!pK-SBSaVsfs}u4<88(oyb*sp+_^keu7v(XZJJ9<%P$f*_6U3lIPF$or)A z)3DEB4-7nKm(BWUO(V!9k$}UR&nqG_^xw>Ba3}#qD^TSF(T40>)NuhI2e+nyq(?~S zZ*2e3)~H%YrbKOL7cCY$T^g(W30X?aN%25>93Z0=j+PsgAT}Ditg2`QK^mtI14QXH z{glvWd<-^=%c-y(#}PX_Z?XrZQ~TP?Z)x^Z|K4WVn|W_0f2e7xDG%K;H+{KWvGt|V z_go>0dmaAH)jhhkrJOPXxcd{N> z&P;?_3=#n(y0-Nd1F*idZEM2I8*fOt@Dci)!`!@ZRqJ(Fy6N3&+j^{`mxJ4~1hCU; znz>!l75=7)OLLNl)WYSG97Y&4p-z2rGB1d!{sUk=Jo|Sn)#cm%P;cY7VgGRmI1Dnz zkc`ph{TO(cPv}j5ZR07bN;SD5i)`atBS3uVV|cbx@q=@uz84nu0P%Dq!jVkbcnaGO zO-fFiPnu$K>_7nX_o#;WK z#KEodTRS+uH7QoUxNMYHzw)2=@_+FYyOiZ{sfH^M3#{<+IfjeA-iW2)9zWkK?(f|> ztND!SEGtBB#Jv|Hdz^2-aG7{@+y1pw7DwQQXI;Y3)pv;Pw7IAF2PEybJeg1uDOs@J z=!~xa)*sE2g}*1+U1<7_mkZ;9SG3NufQLcl5W}bV`aJ8>JN1%oPBsDwdtp;ZnwlQ93@O6eCAc>oF1}|CkaE5Y+=8qkp|+zWI)@j#h!j zD*{NpZDkhcmF)sKGqJVJWknKd+4mP!drr5XviJk1%c!L+Z|dvuOL9nFFgEa0ryIB+RYElsHLS;82>KC{X#w%Yl@J90fW(ZS60DQgmX)ItL$ExCQ-9+0-sm z&u&wG4IfV8532Ua&2!vTZ%l>_E|qL}@v@%2BoHsqA$b)-aB=e~86wu`Q`&n`W{$zI5}LL(c^_zI4|O*1SZ@BMsM+x4`_xS zG6G}g<;JPPIZ3ykBeu%H=4d!Aun83)KI|}5&|GDw#G@Leh-RH@O*LP-_0Pmk%OCB8 z;^%Wh_eRH1MnpH0U-o#U5#xCa*A>vAMfSnqIx&0jq=>#Y>flu_PsDUnKi?Db))B3A z=2)&FQ*mD5+y1V=LC=+AhJAf@7H4=Mnei(Yt9a2f(HqxbkDES$;GXn{8grJg@050B zrO9$p{z;G|;bCm&E2q9o`g3>u4s7^)h#B{i4i<=a4o{XqXkYYrRB@)+;X@FrD6 zK22JMaih{hMNv20_s(6P3JX8z#hIpz$B(t+ud zwf_o9-R8xgC!VDo_e_c_$FCpm&?fKy_VN#RPS`KxFca&Gyc{zhksh)OaqOu@{~$;{ zceI~?>vY&OMC#dXbeI)uJh14#Hlx3+cde2B+RJV8BU94r(O^5aYu5I=P4~Hs4M&KD z%=#@%aPhMAub@ndK+h2kyiaTQsqg&xEO$YMg$HcKSPjYBDqt9W)(1hv2gWNbd=JvH zL9-3iaL$ZC=>r)40UZYOFf~v}ml5IPPfktAL^YvvPMHzLLzVllmsZCLhmW{E-+7f8 z3|ZtRLSr&rlSaO_qYvrV;YRAWdnNyvIUeKt~6i z5Ky%mx!r-Ha_eM!!goP#xgK&goZ`w2~rn4NEU7Vw!UvAR2V(8!KkI9X)AC##QZ7)dV2q&Oo{E;?*)dQMrutc+?S zpX0ue-qD`Xd`|1@6aa{b4b!&`(+SOUcXz_KjoPc^JbaMPke?Yq9a8w*#@R{|UwF_2_Rtv$ z8)D7L8yxL6>+eUBG%0Y<6tsCeAd5#9g$@ThD*RzDv!{U#LtFN~WXl#8VlSDjH-@S# zX*)>l)MeENE3P*O4ftpNKzt!q+hcm@)&E*Ci&P;bbutkjEeTE>DtHw=w2%&al_^7o z^Yv;SDl#{9m~tL(Gf~dc$Ff;yvn@^OG4H(Z#WdK4#N22`;?l=$<(4lGyQ_D*UeVbO zSAL&np|>NiXl88PXfCR!^8~lO{-f%S(#e$ilXj;&7shyELlAamwZl=;sW%xwMF^|d zHst4Ec;;(lZ0ze^B4J^9ONbgf3G`}!6Y;1N|MEoJyj&Y}>CPr%VqyT(G9)AfpVL%k z7xeQzbTG`0Kzgmd*CY=bRyjALXYkA8J~g zKZ#}rff=bNCq*hx<=ZZ|j$&%dwZC8(2~U!OR6~R@(?BO)8swM#$rEP&gIAMLOD6YZtyj5LZ1!6x3KVT~@jd0`AmUhhV}j4xi$(q)2k#|r zB@M=Pg5j9D4}Uk<8xVTJJGBHuo0G-eC_Wx7rmTSxQCFlkYbjei-SS zo;<8<9s1%|V{mZ)Zlc9vsQGfP+7wwIXgWbR#=f~S!nfj5}=g7m#pF;nBomUu1Bl-8Bn@=UzdTUwPo zmoTq_(cj7GV*yt+U4Ba*tN`hLLzT@o|Ivou;l>N)~%y2qSBpLVY^=vo| z;Q{-R7rXwi&jMF7e-^Yn_nluQVS@E8|7E_Y_zTy(K}3;OI;KM5PQFVAqr3Vq4W+fe zoSRZAecgtxHPT!ZYU*(yQ+($k5VY!^)(z&5-qr5@e%_><7|ov{Wh#WIlrvaLY11s) zB0}Hy6<_f6lW3JXw`XzI9kLq41`Z!g`5Iyo%bdi`Wpgm6qQ>qeEFs zonex#X{KlkE-;_$LA*9UN72Neq3kV&4;uj!O!;@Io)5Q@@ z?#`95`(w@M&kh+CYYGSnp$YV^_ZJ8L1{r)H7Ol_sg)ESE(PB1jkB+_eALyK!*+~m8 zoZ}SP^j5695Mh$P6RrJaUPIV( zoP{))NP@%((KAyvPHVw!r1N_taSnnNH4?|Q%tc?HjOSnvFw%&%;=%h=mukz`A#i0H z!WF&+cE8tzP4iI#@AdRhUNvnBN-W?@Xs%&5hS5e?njFHB}g7*O3C zLa;aQ43+RY*atrmDAZo4znQWgyEZa!N)x;xQ1AlZtw()=tpQ$}1F?+e9~-cvr9q<@ zV_eu1c~a~YFXIexmr^W=l|2Xf`uIy-86kxIn2@fO(tjVSFv=>-mwh=v!*TWJ)_=JxDLp+%P>P%?T6<#T{mKVv zZ;uBw{GGyEmA^CJ=&}2f(ftQPXfTKm2|N`O-t4^cwn0zAtabP1BegIcu;=O2XYMuvKO_(L^7@nzu($Kr1kY8%Hh0o9ijF3hy zKJQ4yv%Jm`N&dP_MQ#CG2kXsDFHFYtm@8ApZm*SSAN8}Q`YW7%XIc&cx@f3et||rQ zTWmH!7h+>;4pS?p08bj=_W&*G75~D*F{$i|m+s-52?Jhvyu1+~GL4 z9II@#wwgj-syosRg?vYioI8dQt}*Wrqu9;T!4dJ;tBemzupwjXR65~~tvwAQz}Gfc zX-G}jN?~{yVbixvskov}=`+is<| z`0sn|->I@OB&$$EAA&fHCuQ_t!*}`1Kx(9A^ARF$Bz#CtT%yKisD&82G7KTl;{LPc zW~VOB5*@{FCm0>h9xRQt&kQOd=tWjsitCh;vWpAvuG33S6uK(H`_7!O9=uF-zPV1< zC7P{grwybV*0_6(NX=in?^<8hSh+rACE74Vmc>hu5?+WP71|njp3f{OM+`!~7s*

lwSo6~D` zIp^v>=Q_)+kmAi?qfHw=Q9^pgEa0~RaKODWq&y?^M%KM4E*g}F=;C8j+Xv^p{JF`Y0G-LkwA%`|- z?&MC^c4NDI1d&~sdrp+61R_b!_*pZ6z#^R~dir%JYLGO6;MgaAU?)ZdBS0dI^g$Xy zQL-R&3C4SY$RWIZU>7<>Z#)0Ih| zy%<9I$>-XH1>^Qbk_HpdxjE-I%yp>sF)xS0Zf#;8oKnS!+GR6&J}?Moe?x^{y`0{v z%(GEo66>ZhM##pPRh$3yF<)a!m+GK^uouN+>DtmgCxU9DoBg)(V2j*BfGN;6*LnnQ z)b?lG$?;9Nf2}ygvvsS;)zSCAWjixr&BQTrzNh;Jo&wDm7ZTp3>8U2%UL;jvpS6qw zgxQmz-9>`l4L@-rSzx?5dfW#I6iAd+rvMI!A!W`RV-pssGj?@$0`i~))d&gr+2)dt zN-_5Vne*0ju+afN2|5N>s05Wb66M)U79WR+I`e--^48x?rkFeTM!5;yxh!*T( z;C%)D=Y1Io!!z_lFvYe^O~IQ82^Ei9YiVh@fR`FngeeVfd2@!MY8I$RkqHrzljDO! za;F;jzX@n%mYA;_C70g6p^NSFc?g&*hRJ!M7>>zN;clwF!aAXow( zI7Jrb=79kL!+^E$ors7C@Q4AeU>j?zzo#cN@qFp}znAJYN;(9p8BhfPsk-gIKqXyK z5v`d)SeWc*>+q9N6OT1e{V+B*KC2+hRpopA`swJ_^|gDqDHpgTI6zs0i~RSXB*@N= ziGu@J=m?JTL;m2XNJLD$T?~AC%DAYgp3!xk$pDdTR9AN5`PQcfK$uBfqzcCrLjpt& zXn(-J_edoy8nFTtd_caZ;JSmsN(@_tL3HKm5>QJuJjLb#w+$jsA}zng#saRgI9n@v zWDBrFgB*yGiI-3ZU}n7@is>e?<@DEJ#O?oN9GRMywhwUQ%F5r7k*AdlYini=z5^DM zKyV@hoT)~sf%chgqXT@Om@^g#t;}!U#6>PZp`zWZ;Is!U8~{-rh=KrD6pRR@RY2ax z3xh8_V|{$R2O=SArT{zpTQ+f2Kn!Zb(P73LeJlvE0|D2m2^@Hd*b=GP<5&x*dCE!f zcnPq-fPW1i{QiHAL|?+khp~?ih5$DOCKBKjCEHya#V7L%3onC{IR{skzq-JvP|IH>oKKCHDni;QecDAv#)v$1!11$Gj`t7JvTe#1B zDFg%>f%exbO}E&Bn<8MiG3ft(TuiaY0v~w%VvV4T{{O#Is9D)t3L^w?x0F?C6p)^| ux$k(7&r1O1B(d9!1Nrfpxh5#k-HM3Q_Xlv#9JM|HzhoufNtB2g`TZX^(BVh` literal 0 HcmV?d00001 diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md b/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md new file mode 100644 index 0000000..0822b39 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md @@ -0,0 +1,53 @@ +# Performance tests + +## Setup + +Tested on a PC with the following specs: + +* Intel I7-7700K CPU @ 4.20 Ghz +* Ram 48.0 GB, Speed 2400 Mhz +* 100 Tests +* 1.000.000 UUID Amount + +## Benchmark Code + +Each test has been done with the following code: + +```csharp +public static void Test(Int32 Version, Int32 Variant, Int32 TestCount = 100, Int32 Count = 1000000) { + Stopwatch stopwatch = new Stopwatch(); + + for (Int32 I = 0; I < TestCount; I++) { + stopwatch.Start(); + + UUID[] Temp = UUIDFactory.CreateUUIDs(Count, Version, Variant); + + stopwatch.Stop(); + + Temp = null; + GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, true); + Console.Title = $"V{Version}.{Variant}\t-\t{I}/{TestCount}"; + } + + Console.WriteLine($"=== Version {Version}\tVariant {Variant} ==="); + Output(stopwatch, Version, Variant, TestCount, Count); +} +``` + +## Results + +|Platform|Version |Variant |milli seconds per test |ticks per test | +|--------|--------|--------|---|---| +|x64 |3 |1 |925.57|9255725.31| +|x86 |3 |1 |902.71|9027142.91| +|x64 |4 |1 |533.32|5333294.43| +|x86 |4 |1 |495.67|4956702.14| +|x64 |4 |2 |506.01|5060131.24| +|x86 |4 |2 |494.99|4949900.86| +|x64 |5 |1 |910.46|9104612.2| +|x86 |5 |1 |950.05|9500552.11| + +### Distribution Graph + +![Graph](Data/Graph.png) + diff --git a/contrib/DaanV2.UUID.Net-master/LICENSE.txt b/contrib/DaanV2.UUID.Net-master/LICENSE.txt new file mode 100644 index 0000000..2e35280 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/LICENSE.txt @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec b/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec new file mode 100644 index 0000000..379fd82 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec @@ -0,0 +1,36 @@ + + + + + DaanV2.UUID.Net + 1.0.1 + Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4, and 5. Compliant with rfc4122. + Daan Verstraten + + + false + LICENSE.txt + https://github.com/DaanV2/DaanV2.UUID.Net + Daan Verstraten 2019 + UUID UUID3 UUID4 UUID5 rfc4122 .Net + + images\icon.png + + + + + + + + + + + + + + + + + + + diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/build.bat b/contrib/DaanV2.UUID.Net-master/Nuget/build.bat new file mode 100644 index 0000000..021dbd0 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Nuget/build.bat @@ -0,0 +1,2 @@ +nuget.exe pack +PAUSE \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png b/contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bceb685b8da7e94e82f3802e9cac4bfa1a87b873 GIT binary patch literal 16529 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 z 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 IM6N<$f=ec&yZ`_I literal 0 HcmV?d00001 diff --git a/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml b/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml new file mode 100644 index 0000000..fbba706 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Overview.dgml b/contrib/DaanV2.UUID.Net-master/Overview.dgml new file mode 100644 index 0000000..b7a6c04 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Overview.dgml @@ -0,0 +1,470 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/README.md b/contrib/DaanV2.UUID.Net-master/README.md new file mode 100644 index 0000000..8d7e828 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/README.md @@ -0,0 +1,59 @@ +# UUID.Net + +Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4 and 5. + +**Table of Contents** +- [UUID.Net](#uuidnet) + - [Implicit Casting](#implicit-casting) + - [Usage Example](#usage-example) + - [Generating UUIDs](#generating-uuids) + - [Generate a UUID](#generate-a-uuid) + - [Generate a batch of UUIDs](#generate-a-batch-of-uuids) + - [Generating through a Generator](#generating-through-a-generator) + - [UUIDs Version](#uuids-version) + - [Performance](#performance) + +### Implicit Casting + +This API contains pre-made casting methods that convert UUID to strings, char arrays or vice versa. + +## Usage Example + +Below are two examples of generating UUIDs and usage + +### Generating UUIDs + +#### Generate a UUID + +```csharp +UUID Temp = UUIDFactory.CreateUUID(4, 2); //Version 4, Variant 2 +String UUID = UUIDFactory.CreateUUID(3, 1); //Version 3, Variant 1. auto cast to string +``` + +#### Generate a batch of UUIDs + +```csharp +UUID[] UUIDs = UUIDFactory.CreateUUIDs(100000, 4, 1); //Version 4, Variant 1, Amount of 100000 +``` + +#### Generating through a Generator + +```csharp +IUUIDGenerator Generator = UUIDFactory.CreateGenerator(4, 1); //Get the version 4, variant 1 generator +IUUIDGenerator GeneratorV4 = new DaanV2.UUID.Generators.Version4.GeneratorVariant1(); //Get the version 4, variant 1 generator + +UUID Out = GeneratorV4.Generate(); +``` + +## UUIDs Version + +|Version |Variant |Description |Context Needed |Context Type | +|-----------|-----------|---------------|---------------|---------------| +|3 |1 |A UUID generated from a string using MD5 hashing bits, 122 bits |Yes |String | +|4 |1 |A random generated UUID of 122 bits |No |Int32 | +|4 |2 |A random generated UUID of 121 bits |No |Int32 | +|5 |1 |A UUID generated from a string using SHA1 hashing bits, 122 bits |Yes |String | + +## Performance + +See [Performance](Documentation/Performance.md) \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/UUID.code-workspace b/contrib/DaanV2.UUID.Net-master/UUID.code-workspace new file mode 100644 index 0000000..362d7c2 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/UUID.code-workspace @@ -0,0 +1,7 @@ +{ + "folders": [ + { + "path": "." + } + ] +} \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs new file mode 100644 index 0000000..1d710b5 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs @@ -0,0 +1,33 @@ +using System; +using DaanV2.UUID; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Unit_Test { + ///DOLATER

add description for class: GeneratorTests + [TestClass] + public partial class GeneratorTests { + [TestMethod] + public void TestAllGenerators() { + Int32[] Versions = UUIDFactory.GetAvailableVersion(); + Int32 CurVersion; + Int32 CurVariant; + + for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { + CurVersion = Versions[VersionIndex]; + Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); + + for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { + CurVariant = Variants[VariantIndex]; + IUUIDGenerator Generator = UUIDFactory.CreateGenerator(CurVersion, CurVariant); + + if (Generator.NeedContext) { + Assert.IsFalse(Generator.ContextType == null, $"{CurVersion}:{CurVariant} if context text is needed then context type cannot be null"); + } + + Assert.IsTrue(Generator.Version == CurVersion, "Wrong version of generator"); + Assert.IsTrue(Generator.Variant == CurVariant, "Wrong variant of generator"); + } + } + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs new file mode 100644 index 0000000..b17650c --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs @@ -0,0 +1,13 @@ +using DaanV2.UUID; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Unit_Test { + ///DOLATER add description for class: NillTest + [TestClass] + public partial class NillTest { + [TestMethod] + public void ValidNill() { + Assert.IsTrue(UUID.Nill.ToString() == "00000000-0000-0000-0000-000000000000", "Nill UUID is not an proper nill uuid"); + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs new file mode 100644 index 0000000..9c6baf4 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs @@ -0,0 +1,41 @@ +using System; +using DaanV2.UUID; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Unit_Test { + public partial class VersionTests { + /// + /// + /// + [TestMethod()] + public void TestCasting() { + Int32[] Versions = UUIDFactory.GetAvailableVersion(); + Int32 CurVersion; + Int32 CurVariant; + + for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { + CurVersion = Versions[VersionIndex]; + Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); + + for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { + CurVariant = Variants[VariantIndex]; + + UUID ID = UUIDFactory.CreateUUID(CurVersion, CurVariant); + String Temp = ID; + UUID New = Temp; + + Assert.IsTrue(ID == New, "UUID casting to string failed"); + Assert.IsTrue(New.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); + Assert.IsTrue(New.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); + + Char[] Test = ID; + New = Test; + + Assert.IsTrue(ID == New, "UUID casting to char array failed"); + Assert.IsTrue(New.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); + Assert.IsTrue(New.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); + } + } + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs new file mode 100644 index 0000000..4338916 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs @@ -0,0 +1,66 @@ +using System; +using DaanV2.UUID; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Unit_Test { + ///DOLATER add description for class: VersionTests + [TestClass] + public partial class VersionTests { + /// + /// + /// + [TestMethod()] + public void TestAll() { + Int32[] Versions = UUIDFactory.GetAvailableVersion(); + Int32 CurVersion; + Int32 CurVariant; + + for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { + CurVersion = Versions[VersionIndex]; + Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); + + for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { + CurVariant = Variants[VariantIndex]; + + UUID ID = UUIDFactory.CreateUUID(CurVersion, CurVariant); + + Assert.IsTrue(ID.GetVersion() == CurVersion, $"Tried to generate {CurVersion}:{CurVariant} but got version {ID.GetVersion()}"); + Assert.IsTrue(ID.GetVariant() == CurVariant, $"Tried to generate {CurVersion}:{CurVariant} but got variant {ID.GetVariant()}"); + } + } + } + + /// + /// + /// + [TestMethod()] + public void TestAllArray() { + Int32[] Versions = UUIDFactory.GetAvailableVersion(); + Int32 CurVersion; + Int32 CurVariant; + Int32 Amount = 100; + + for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { + CurVersion = Versions[VersionIndex]; + Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); + + for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { + CurVariant = Variants[VariantIndex]; + + UUID[] IDs = UUIDFactory.CreateUUIDs(Amount, CurVersion, CurVariant); + + Assert.IsTrue(IDs.Length == Amount, $"{CurVersion}:{CurVariant} didn't generate {Amount} UUIDs"); + + foreach (UUID ID in IDs) { + if (ID == (Object)null) { + Assert.Fail($"Generated null {CurVersion}:{CurVariant}"); + } + + Assert.IsTrue(ID.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); + Assert.IsTrue(ID.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); + } + } + } + } + } +} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1a1b2fb --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Unit Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Unit Test")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("9b94e9b5-d328-47ec-a487-8bf61e969ef6")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.1.0")] +[assembly: AssemblyFileVersion("1.0.1.0")] diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj b/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj new file mode 100644 index 0000000..7ad4141 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj @@ -0,0 +1,117 @@ + + + + + + Debug + AnyCPU + {9B94E9B5-D328-47EC-A487-8BF61E969EF6} + Library + Properties + Unit_Test + Unit Test + v4.8 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + + + + + + + + + + + + + + + {C419E0C7-2D37-433E-AD0D-44A319047DDF} + DaanV2.UUID.Net + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config b/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config new file mode 100644 index 0000000..28e3f78 --- /dev/null +++ b/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/smarty.sln b/smarty.sln index 03676b6..422f527 100644 --- a/smarty.sln +++ b/smarty.sln @@ -3,22 +3,62 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29709.97 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "smarty.core", "src\core\smarty.core.csproj", "{DA1CF614-7D2E-49BA-B27F-4334B964C2E0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Core", "src\core\Smarty.Core.csproj", "{DA1CF614-7D2E-49BA-B27F-4334B964C2E0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Contrib", "Contrib", "{EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "DaanV2.UUID.Net Source", "contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.shproj", "{72DE337F-6F32-4E42-9CA3-3F4759275E1E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaanV2.UUID.Net Core", "contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Core\DaanV2.UUID.Net Core.csproj", "{4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}" EndProject Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{72de337f-6f32-4e42-9ca3-3f4759275e1e}*SharedItemsImports = 13 + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x64.Build.0 = Debug|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x86.ActiveCfg = Debug|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x86.Build.0 = Debug|Any CPU {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|Any CPU.Build.0 = Release|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x64.ActiveCfg = Release|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x64.Build.0 = Release|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.ActiveCfg = Release|Any CPU + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.Build.0 = Release|Any CPU + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x64.ActiveCfg = Debug|x64 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x64.Build.0 = Debug|x64 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x86.ActiveCfg = Debug|x86 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x86.Build.0 = Debug|x86 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|Any CPU.Build.0 = Release|Any CPU + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x64.ActiveCfg = Release|x64 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x64.Build.0 = Release|x64 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.ActiveCfg = Release|x86 + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {DA1CF614-7D2E-49BA-B27F-4334B964C2E0} = {9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106} + {72DE337F-6F32-4E42-9CA3-3F4759275E1E} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} + {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} EndGlobalSection diff --git a/src/core/Accessory/Accessory.cs b/src/core/Accessory/Accessory.cs new file mode 100644 index 0000000..4a19320 --- /dev/null +++ b/src/core/Accessory/Accessory.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using DaanV2.UUID; +using Smarty.Core.Bridge; + +namespace Smarty.Core.Accessory +{ + public class Accessory : IAccessory + { + /// + public UUID Id { get; } + + /// + public bool IsBridged { get; } + + /// + public bool IsReacheable { get; } + + /// + public IBridge ParentBridge { get; } + + public Accessory() + { + + } + } +} diff --git a/src/core/Accessory/AccessoryCategory.cs b/src/core/Accessory/AccessoryCategory.cs new file mode 100644 index 0000000..9a9056c --- /dev/null +++ b/src/core/Accessory/AccessoryCategory.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.Accessory +{ + public enum AccessoryCategory + { + Other = 1, + Bridge = 2, + Fan = 3, + GarageDoorOpener = 4, + LightBulb = 5, + DoorLock = 6, + Outlet = 7, + Switch = 8, + Thermostat = 9, + Sensor = 10, + AlarmSystem = 11, + SecuritySystem = 11, //Added to conform to HAP naming + Door = 12, + Window = 13, + WindowCovering = 14, + ProgrammableSwitch = 15, + RangeExtender = 16, + Camera = 17, + IpCamera = 17, //Added to conform to HAP naming + VideoDoorbell = 18, + AirPurifier = 19, + AirHeater = 20, //Not in HAP Spec + AirConditioner = 21, //Not in HAP Spec + AirHumidifier = 22, //Not in HAP Spec + AirDehumidifier = 23, // Not in HAP Spec + AppleTv = 24, + HomePod = 25, // HomePod + Speaker = 26, + Airport = 27, + Sprinkler = 28, + Faucet = 29, + ShowerHead = 30, + Television = 31, + TargetController = 32, // Remote Control + Router = 33 // HomeKit enabled router + } +} diff --git a/src/core/Accessory/IAccessory.cs b/src/core/Accessory/IAccessory.cs new file mode 100644 index 0000000..fb4e05e --- /dev/null +++ b/src/core/Accessory/IAccessory.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Smarty.Core.Bridge; + +namespace Smarty.Core.Accessory +{ + /// + /// Accessory interface. + /// + public interface IAccessory : IAccessoryBase + { + /// + /// if accessory is bridged, this property points to the bridge which bridges this accessory + /// + public IBridge ParentBridge { get; } + } +} diff --git a/src/core/Accessory/IAccessoryBase.cs b/src/core/Accessory/IAccessoryBase.cs new file mode 100644 index 0000000..e87f139 --- /dev/null +++ b/src/core/Accessory/IAccessoryBase.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; +using DaanV2.UUID; +using Smarty.Core.Bridge; + +namespace Smarty.Core.Accessory +{ + /// + /// Base accessory interface. + /// + public interface IAccessoryBase + { + /// + /// UUID of the accessory. + /// + public UUID Id { get; } + + /// + /// true if we are hosted "behind" a Bridge Accessory + /// + public bool IsBridged { get; } + + /// + /// Is accessory reachable? + /// + public bool IsReacheable { get; } + } +} diff --git a/src/core/Bridge/Bridge.cs b/src/core/Bridge/Bridge.cs new file mode 100644 index 0000000..0ff07f3 --- /dev/null +++ b/src/core/Bridge/Bridge.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using DaanV2.UUID; +using Smarty.Core.Accessory; + +namespace Smarty.Core.Bridge +{ + public class Bridge : IBridge + { + const int MaxAccessories = 149; // Maximum number of bridged accessories per bridge. + + /// + public UUID Id { get; } + + /// + public bool IsBridged { get; } + + /// + public bool IsReacheable { get; } + + /// + public IReadOnlyList Accessories { get; } + + /// + /// internal list of accessories. + /// + private List _accessories; + + public Bridge() + { + this.IsBridged = false; // a bridge can not be bridged again. + _accessories = new List(); + Accessories= new ReadOnlyCollection(_accessories); + } + } +} diff --git a/src/core/Bridge/IBridge.cs b/src/core/Bridge/IBridge.cs new file mode 100644 index 0000000..e5d2a19 --- /dev/null +++ b/src/core/Bridge/IBridge.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Smarty.Core.Accessory; + +namespace Smarty.Core.Bridge +{ + /// + /// Bridge interface. + /// + public interface IBridge : IAccessoryBase + { + /// + /// List of accessories we are bridging. + /// + IReadOnlyList Accessories { get; } + } +} diff --git a/src/core/Class1.cs b/src/core/Class1.cs deleted file mode 100644 index d5c5edb..0000000 --- a/src/core/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace smarty -{ - public class Class1 - { - } -} diff --git a/src/core/smarty.core.csproj b/src/core/smarty.core.csproj index cb63190..3e4f638 100644 --- a/src/core/smarty.core.csproj +++ b/src/core/smarty.core.csproj @@ -2,6 +2,12 @@ netcoreapp3.1 + Smarty.Core + Smarty.Core + + + + From fbfbd1d5374823281f2b760fdd98e71c8b72ba73 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 15:12:45 +0300 Subject: [PATCH 002/152] more accessory & bridge work. --- src/core/Accessory/Accessory.cs | 28 --------- src/core/Accessory/AccessoryCategory.cs | 45 ------------- src/core/Accessory/IAccessoryBase.cs | 29 --------- src/core/Bridge/Bridge.cs | 38 ----------- src/core/HomeKit/Accessory/Accessory.cs | 54 ++++++++++++++++ .../HomeKit/Accessory/AccessoryCategory.cs | 47 ++++++++++++++ .../{ => HomeKit}/Accessory/IAccessory.cs | 7 +-- src/core/HomeKit/Accessory/IAccessoryBase.cs | 42 +++++++++++++ src/core/HomeKit/Bridge/Bridge.cs | 63 +++++++++++++++++++ src/core/{ => HomeKit}/Bridge/IBridge.cs | 8 +-- src/core/HomeKit/Service/IService.cs | 9 +++ 11 files changed, 220 insertions(+), 150 deletions(-) delete mode 100644 src/core/Accessory/Accessory.cs delete mode 100644 src/core/Accessory/AccessoryCategory.cs delete mode 100644 src/core/Accessory/IAccessoryBase.cs delete mode 100644 src/core/Bridge/Bridge.cs create mode 100644 src/core/HomeKit/Accessory/Accessory.cs create mode 100644 src/core/HomeKit/Accessory/AccessoryCategory.cs rename src/core/{ => HomeKit}/Accessory/IAccessory.cs (71%) create mode 100644 src/core/HomeKit/Accessory/IAccessoryBase.cs create mode 100644 src/core/HomeKit/Bridge/Bridge.cs rename src/core/{ => HomeKit}/Bridge/IBridge.cs (68%) create mode 100644 src/core/HomeKit/Service/IService.cs diff --git a/src/core/Accessory/Accessory.cs b/src/core/Accessory/Accessory.cs deleted file mode 100644 index 4a19320..0000000 --- a/src/core/Accessory/Accessory.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using DaanV2.UUID; -using Smarty.Core.Bridge; - -namespace Smarty.Core.Accessory -{ - public class Accessory : IAccessory - { - /// - public UUID Id { get; } - - /// - public bool IsBridged { get; } - - /// - public bool IsReacheable { get; } - - /// - public IBridge ParentBridge { get; } - - public Accessory() - { - - } - } -} diff --git a/src/core/Accessory/AccessoryCategory.cs b/src/core/Accessory/AccessoryCategory.cs deleted file mode 100644 index 9a9056c..0000000 --- a/src/core/Accessory/AccessoryCategory.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Smarty.Core.Accessory -{ - public enum AccessoryCategory - { - Other = 1, - Bridge = 2, - Fan = 3, - GarageDoorOpener = 4, - LightBulb = 5, - DoorLock = 6, - Outlet = 7, - Switch = 8, - Thermostat = 9, - Sensor = 10, - AlarmSystem = 11, - SecuritySystem = 11, //Added to conform to HAP naming - Door = 12, - Window = 13, - WindowCovering = 14, - ProgrammableSwitch = 15, - RangeExtender = 16, - Camera = 17, - IpCamera = 17, //Added to conform to HAP naming - VideoDoorbell = 18, - AirPurifier = 19, - AirHeater = 20, //Not in HAP Spec - AirConditioner = 21, //Not in HAP Spec - AirHumidifier = 22, //Not in HAP Spec - AirDehumidifier = 23, // Not in HAP Spec - AppleTv = 24, - HomePod = 25, // HomePod - Speaker = 26, - Airport = 27, - Sprinkler = 28, - Faucet = 29, - ShowerHead = 30, - Television = 31, - TargetController = 32, // Remote Control - Router = 33 // HomeKit enabled router - } -} diff --git a/src/core/Accessory/IAccessoryBase.cs b/src/core/Accessory/IAccessoryBase.cs deleted file mode 100644 index e87f139..0000000 --- a/src/core/Accessory/IAccessoryBase.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using DaanV2.UUID; -using Smarty.Core.Bridge; - -namespace Smarty.Core.Accessory -{ - /// - /// Base accessory interface. - /// - public interface IAccessoryBase - { - /// - /// UUID of the accessory. - /// - public UUID Id { get; } - - /// - /// true if we are hosted "behind" a Bridge Accessory - /// - public bool IsBridged { get; } - - /// - /// Is accessory reachable? - /// - public bool IsReacheable { get; } - } -} diff --git a/src/core/Bridge/Bridge.cs b/src/core/Bridge/Bridge.cs deleted file mode 100644 index 0ff07f3..0000000 --- a/src/core/Bridge/Bridge.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Text; -using DaanV2.UUID; -using Smarty.Core.Accessory; - -namespace Smarty.Core.Bridge -{ - public class Bridge : IBridge - { - const int MaxAccessories = 149; // Maximum number of bridged accessories per bridge. - - /// - public UUID Id { get; } - - /// - public bool IsBridged { get; } - - /// - public bool IsReacheable { get; } - - /// - public IReadOnlyList Accessories { get; } - - /// - /// internal list of accessories. - /// - private List _accessories; - - public Bridge() - { - this.IsBridged = false; // a bridge can not be bridged again. - _accessories = new List(); - Accessories= new ReadOnlyCollection(_accessories); - } - } -} diff --git a/src/core/HomeKit/Accessory/Accessory.cs b/src/core/HomeKit/Accessory/Accessory.cs new file mode 100644 index 0000000..2bc73b7 --- /dev/null +++ b/src/core/HomeKit/Accessory/Accessory.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using DaanV2.UUID; +using Smarty.Core.HomeKit.Bridge; +using Smarty.Core.HomeKit.Service; + +namespace Smarty.Core.HomeKit.Accessory +{ + public class Accessory : IAccessory + { + /// + public UUID Uuid { get; } + + /// + public string DisplayName { get; } + + /// + public bool IsBridged { get; } + + /// + public bool IsReacheable { get; } + + /// + public AccessoryCategory Category { get; } + + /// + public IReadOnlyList Services { get; } + + /// + public IBridge ParentBridge { get; } + + /// + /// internal list of services. + /// + private List _services; + + public Accessory(string uuid, string displayName) + { + Uuid = uuid ?? throw new ArgumentException("Accessories must be created with a valid UUID.", nameof(uuid)); + if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); + + if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; + else throw new ArgumentException("Accessories must be created with a non-empty displayName.", nameof(displayName)); + + IsBridged = false; + IsReacheable = true; + Category = AccessoryCategory.Other; + + _services = new List(); + Services = new ReadOnlyCollection(_services); + } + } +} diff --git a/src/core/HomeKit/Accessory/AccessoryCategory.cs b/src/core/HomeKit/Accessory/AccessoryCategory.cs new file mode 100644 index 0000000..fe2b800 --- /dev/null +++ b/src/core/HomeKit/Accessory/AccessoryCategory.cs @@ -0,0 +1,47 @@ +namespace Smarty.Core.HomeKit.Accessory +{ + /// + /// Accessory categories + /// + /// Note: An accessory with support for multiple categories should advertise the primary category. An accessory for which a primary + /// category cannot be determined or the primary category isnʼt among the well defined categories(2-9) falls in the Other category. + /// See: HomeKit Accessory Protocol Specification Non-Commercial Version Release R2, Section 13. + /// + /// + public enum AccessoryCategory + { + Other = 1, + Bridge = 2, + Fan = 3, + GarageDoorOpener = 4, + Lightning = 5, + Lock = 6, + Outlet = 7, + Switch = 8, + Thermostat = 9, + Sensor = 10, + SecuritySystem = 11, + Door = 12, + Window = 13, + WindowCovering = 14, + ProgrammableSwitch = 15, + RangeExtender = 16, + IpCamera = 17, + VideoDoorbell = 18, + AirPurifier = 19, + Heater = 20, + AirConditioner = 21, + Humidifier = 22, + Dehumidifier = 23, + AppleTv = 24, // AppleTv + HomePod = 25, // Apple HomePod + Speaker = 26, + Airport = 27, + Sprinkler = 28, + Faucet = 29, + ShowerHead = 30, + Television = 31, + Remote = 32, // Remote Control + Router = 33 // HomeKit enabled router + } +} diff --git a/src/core/Accessory/IAccessory.cs b/src/core/HomeKit/Accessory/IAccessory.cs similarity index 71% rename from src/core/Accessory/IAccessory.cs rename to src/core/HomeKit/Accessory/IAccessory.cs index fb4e05e..bd908d3 100644 --- a/src/core/Accessory/IAccessory.cs +++ b/src/core/HomeKit/Accessory/IAccessory.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Smarty.Core.Bridge; +using Smarty.Core.HomeKit.Bridge; -namespace Smarty.Core.Accessory +namespace Smarty.Core.HomeKit.Accessory { /// /// Accessory interface. diff --git a/src/core/HomeKit/Accessory/IAccessoryBase.cs b/src/core/HomeKit/Accessory/IAccessoryBase.cs new file mode 100644 index 0000000..309a43b --- /dev/null +++ b/src/core/HomeKit/Accessory/IAccessoryBase.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using DaanV2.UUID; +using Smarty.Core.HomeKit.Service; + +namespace Smarty.Core.HomeKit.Accessory +{ + /// + /// Base accessory interface. + /// + public interface IAccessoryBase + { + /// + /// UUID of the accessory. + /// + public UUID Uuid { get; } + + /// + /// Display name of the accessory. + /// + public string DisplayName { get; } + + /// + /// true if we are hosted "behind" a Bridge Accessory + /// + public bool IsBridged { get; } + + /// + /// Is accessory reachable? + /// + public bool IsReacheable { get; } + + /// + /// Accessory category. + /// + public AccessoryCategory Category { get; } + + /// + /// Services exposed by accessory. + /// + public IReadOnlyList Services { get; } + } +} diff --git a/src/core/HomeKit/Bridge/Bridge.cs b/src/core/HomeKit/Bridge/Bridge.cs new file mode 100644 index 0000000..c4b8591 --- /dev/null +++ b/src/core/HomeKit/Bridge/Bridge.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using DaanV2.UUID; +using Smarty.Core.HomeKit.Accessory; +using Smarty.Core.HomeKit.Service; + +namespace Smarty.Core.HomeKit.Bridge +{ + public class Bridge : IBridge + { + const int MaxAccessories = 149; // Maximum number of bridged accessories per bridge. + + /// + public UUID Uuid { get; } + + /// + public string DisplayName { get; } + + /// + public bool IsBridged { get; } + + /// + public bool IsReacheable { get; } + + /// + public AccessoryCategory Category { get; } + + /// + public IReadOnlyList Accessories { get; } + + /// + public IReadOnlyList Services { get; } + + /// + /// internal list of accessories. + /// + private List _accessories; + + /// + /// internal list of services. + /// + private List _services; + + public Bridge(string uuid, string displayName) + { + Uuid = uuid ?? throw new ArgumentException("Accessories must be created with a valid UUID.", nameof(uuid)); + if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); + + if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; + else throw new ArgumentException("Accessories must be created with a non-empty displayName.", nameof(displayName)); + + IsBridged = false; // a bridge can not be bridged again. + Category = AccessoryCategory.Bridge; // set category. + + _accessories = new List(); + _services = new List(); + + Accessories = new ReadOnlyCollection(_accessories); + Services = new ReadOnlyCollection(_services); + } + } +} diff --git a/src/core/Bridge/IBridge.cs b/src/core/HomeKit/Bridge/IBridge.cs similarity index 68% rename from src/core/Bridge/IBridge.cs rename to src/core/HomeKit/Bridge/IBridge.cs index e5d2a19..b2f5557 100644 --- a/src/core/Bridge/IBridge.cs +++ b/src/core/HomeKit/Bridge/IBridge.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Smarty.Core.Accessory; +using System.Collections.Generic; +using Smarty.Core.HomeKit.Accessory; -namespace Smarty.Core.Bridge +namespace Smarty.Core.HomeKit.Bridge { /// /// Bridge interface. diff --git a/src/core/HomeKit/Service/IService.cs b/src/core/HomeKit/Service/IService.cs new file mode 100644 index 0000000..f4f364f --- /dev/null +++ b/src/core/HomeKit/Service/IService.cs @@ -0,0 +1,9 @@ +namespace Smarty.Core.HomeKit.Service +{ + /// + /// Interface for HomeKit services. + /// + public interface IService + { + } +} From 9f9c2a9bfe39bca3e9ce159741385079086137d6 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 15:58:19 +0300 Subject: [PATCH 003/152] initial characteristics work. --- .../{Accessory => Accessories}/Accessory.cs | 8 ++-- .../AccessoryCategory.cs | 2 +- .../{Accessory => Accessories}/IAccessory.cs | 4 +- .../IAccessoryBase.cs | 4 +- .../HomeKit/{Bridge => Bridges}/Bridge.cs | 10 ++--- .../HomeKit/{Bridge => Bridges}/IBridge.cs | 4 +- .../HomeKit/Characteristics/Characteristic.cs | 24 ++++++++++++ .../Characteristics/CharacteristicFormat.cs | 17 +++++++++ .../CharacteristicPermission.cs | 38 +++++++++++++++++++ .../Characteristics/CharacteristicUnit.cs | 15 ++++++++ .../Characteristics/ICharacteristic.cs | 38 +++++++++++++++++++ src/core/HomeKit/Events/EventEmitter.cs | 10 +++++ src/core/HomeKit/Events/IEventEmitter.cs | 10 +++++ src/core/HomeKit/Service/IService.cs | 9 ----- src/core/HomeKit/Services/IService.cs | 20 ++++++++++ src/core/HomeKit/Services/Service.cs | 23 +++++++++++ 16 files changed, 212 insertions(+), 24 deletions(-) rename src/core/HomeKit/{Accessory => Accessories}/Accessory.cs (87%) rename src/core/HomeKit/{Accessory => Accessories}/AccessoryCategory.cs (96%) rename src/core/HomeKit/{Accessory => Accessories}/IAccessory.cs (80%) rename src/core/HomeKit/{Accessory => Accessories}/IAccessoryBase.cs (92%) rename src/core/HomeKit/{Bridge => Bridges}/Bridge.cs (82%) rename src/core/HomeKit/{Bridge => Bridges}/IBridge.cs (80%) create mode 100644 src/core/HomeKit/Characteristics/Characteristic.cs create mode 100644 src/core/HomeKit/Characteristics/CharacteristicFormat.cs create mode 100644 src/core/HomeKit/Characteristics/CharacteristicPermission.cs create mode 100644 src/core/HomeKit/Characteristics/CharacteristicUnit.cs create mode 100644 src/core/HomeKit/Characteristics/ICharacteristic.cs create mode 100644 src/core/HomeKit/Events/EventEmitter.cs create mode 100644 src/core/HomeKit/Events/IEventEmitter.cs delete mode 100644 src/core/HomeKit/Service/IService.cs create mode 100644 src/core/HomeKit/Services/IService.cs create mode 100644 src/core/HomeKit/Services/Service.cs diff --git a/src/core/HomeKit/Accessory/Accessory.cs b/src/core/HomeKit/Accessories/Accessory.cs similarity index 87% rename from src/core/HomeKit/Accessory/Accessory.cs rename to src/core/HomeKit/Accessories/Accessory.cs index 2bc73b7..3c26228 100644 --- a/src/core/HomeKit/Accessory/Accessory.cs +++ b/src/core/HomeKit/Accessories/Accessory.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Core.HomeKit.Bridge; -using Smarty.Core.HomeKit.Service; +using Smarty.Core.HomeKit.Bridges; +using Smarty.Core.HomeKit.Services; -namespace Smarty.Core.HomeKit.Accessory +namespace Smarty.Core.HomeKit.Accessories { public class Accessory : IAccessory { @@ -49,6 +49,8 @@ public Accessory(string uuid, string displayName) _services = new List(); Services = new ReadOnlyCollection(_services); + + // create our initial "Accessory Information" Service that all Accessories are expected to have. } } } diff --git a/src/core/HomeKit/Accessory/AccessoryCategory.cs b/src/core/HomeKit/Accessories/AccessoryCategory.cs similarity index 96% rename from src/core/HomeKit/Accessory/AccessoryCategory.cs rename to src/core/HomeKit/Accessories/AccessoryCategory.cs index fe2b800..bc0a9e2 100644 --- a/src/core/HomeKit/Accessory/AccessoryCategory.cs +++ b/src/core/HomeKit/Accessories/AccessoryCategory.cs @@ -1,4 +1,4 @@ -namespace Smarty.Core.HomeKit.Accessory +namespace Smarty.Core.HomeKit.Accessories { /// /// Accessory categories diff --git a/src/core/HomeKit/Accessory/IAccessory.cs b/src/core/HomeKit/Accessories/IAccessory.cs similarity index 80% rename from src/core/HomeKit/Accessory/IAccessory.cs rename to src/core/HomeKit/Accessories/IAccessory.cs index bd908d3..63422bf 100644 --- a/src/core/HomeKit/Accessory/IAccessory.cs +++ b/src/core/HomeKit/Accessories/IAccessory.cs @@ -1,6 +1,6 @@ -using Smarty.Core.HomeKit.Bridge; +using Smarty.Core.HomeKit.Bridges; -namespace Smarty.Core.HomeKit.Accessory +namespace Smarty.Core.HomeKit.Accessories { /// /// Accessory interface. diff --git a/src/core/HomeKit/Accessory/IAccessoryBase.cs b/src/core/HomeKit/Accessories/IAccessoryBase.cs similarity index 92% rename from src/core/HomeKit/Accessory/IAccessoryBase.cs rename to src/core/HomeKit/Accessories/IAccessoryBase.cs index 309a43b..d689df8 100644 --- a/src/core/HomeKit/Accessory/IAccessoryBase.cs +++ b/src/core/HomeKit/Accessories/IAccessoryBase.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using DaanV2.UUID; -using Smarty.Core.HomeKit.Service; +using Smarty.Core.HomeKit.Services; -namespace Smarty.Core.HomeKit.Accessory +namespace Smarty.Core.HomeKit.Accessories { /// /// Base accessory interface. diff --git a/src/core/HomeKit/Bridge/Bridge.cs b/src/core/HomeKit/Bridges/Bridge.cs similarity index 82% rename from src/core/HomeKit/Bridge/Bridge.cs rename to src/core/HomeKit/Bridges/Bridge.cs index c4b8591..8cbc2a1 100644 --- a/src/core/HomeKit/Bridge/Bridge.cs +++ b/src/core/HomeKit/Bridges/Bridge.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Core.HomeKit.Accessory; -using Smarty.Core.HomeKit.Service; +using Smarty.Core.HomeKit.Accessories; +using Smarty.Core.HomeKit.Services; -namespace Smarty.Core.HomeKit.Bridge +namespace Smarty.Core.HomeKit.Bridges { public class Bridge : IBridge { @@ -44,11 +44,11 @@ public class Bridge : IBridge public Bridge(string uuid, string displayName) { - Uuid = uuid ?? throw new ArgumentException("Accessories must be created with a valid UUID.", nameof(uuid)); + Uuid = uuid ?? throw new ArgumentException("Bridges must be created with a valid UUID.", nameof(uuid)); if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; - else throw new ArgumentException("Accessories must be created with a non-empty displayName.", nameof(displayName)); + else throw new ArgumentException("Bridges must be created with a non-empty displayName.", nameof(displayName)); IsBridged = false; // a bridge can not be bridged again. Category = AccessoryCategory.Bridge; // set category. diff --git a/src/core/HomeKit/Bridge/IBridge.cs b/src/core/HomeKit/Bridges/IBridge.cs similarity index 80% rename from src/core/HomeKit/Bridge/IBridge.cs rename to src/core/HomeKit/Bridges/IBridge.cs index b2f5557..e3fe471 100644 --- a/src/core/HomeKit/Bridge/IBridge.cs +++ b/src/core/HomeKit/Bridges/IBridge.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using Smarty.Core.HomeKit.Accessory; +using Smarty.Core.HomeKit.Accessories; -namespace Smarty.Core.HomeKit.Bridge +namespace Smarty.Core.HomeKit.Bridges { /// /// Bridge interface. diff --git a/src/core/HomeKit/Characteristics/Characteristic.cs b/src/core/HomeKit/Characteristics/Characteristic.cs new file mode 100644 index 0000000..55fdc00 --- /dev/null +++ b/src/core/HomeKit/Characteristics/Characteristic.cs @@ -0,0 +1,24 @@ +using System; +using DaanV2.UUID; +using Smarty.Core.HomeKit.Events; + +namespace Smarty.Core.HomeKit.Characteristics +{ + public class Characteristic : EventEmitter, ICharacteristic + { + /// + public UUID Uuid { get; } + + /// + public string DisplayName { get; } + + public Characteristic(string uuid, string displayName) + { + Uuid = uuid ?? throw new ArgumentException("Characteristics must be created with a valid UUID.", nameof(uuid)); + if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); + + if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; + else throw new ArgumentException("Characteristics must be created with a non-empty displayName.", nameof(displayName)); + } + } +} diff --git a/src/core/HomeKit/Characteristics/CharacteristicFormat.cs b/src/core/HomeKit/Characteristics/CharacteristicFormat.cs new file mode 100644 index 0000000..67ee26d --- /dev/null +++ b/src/core/HomeKit/Characteristics/CharacteristicFormat.cs @@ -0,0 +1,17 @@ +namespace Smarty.Core.HomeKit.Characteristics +{ + // Data presentation formats. + public enum CharacteristicFormat + { + Bool, // unsigned 8-bit; 0 = false, 1 = true + Int, // signed 32-bit integer + Float, // IEEE-754 32-bit floating point + String, // UTF-8 string + Uint8, // unsigned 8-bit integer + Uint16, // unsigned 16-bit integer + Uint32, // unsigned 32-bit integer + Uint64, // unsigned 64-bit integer + Data, // Opaque structure + Tlv8 // Opaque structure + } +} diff --git a/src/core/HomeKit/Characteristics/CharacteristicPermission.cs b/src/core/HomeKit/Characteristics/CharacteristicPermission.cs new file mode 100644 index 0000000..d9393d3 --- /dev/null +++ b/src/core/HomeKit/Characteristics/CharacteristicPermission.cs @@ -0,0 +1,38 @@ +namespace Smarty.Core.HomeKit.Characteristics +{ + /// + /// Characteristic permissions + /// + public enum CharacteristicPermission + { + /// + /// This characteristic can only be read by paired controllers. + /// + PairedRead, + /// + /// This characteristic can only be written by paired controllers. + /// + PairedWrite, + /// + /// This characteristic supports events. The HAP Characteristic object + /// must contain the ”ev” key if it supports events. + /// + Events, + /// + /// This characteristic supports additional authorization data + /// + AdditionalAuthorization, + /// + /// This characteristic allows only timed write procedure + /// + TimedWrite, + /// + /// This characteristic is hidden from the user + /// + Hidden, + /// + /// This characteristic supports write response + /// + WriteResponse + } +} diff --git a/src/core/HomeKit/Characteristics/CharacteristicUnit.cs b/src/core/HomeKit/Characteristics/CharacteristicUnit.cs new file mode 100644 index 0000000..514e691 --- /dev/null +++ b/src/core/HomeKit/Characteristics/CharacteristicUnit.cs @@ -0,0 +1,15 @@ +namespace Smarty.Core.HomeKit.Characteristics +{ + /// + /// Data units. + /// + public enum CharacteristicUnit + { + Unitless, + Celsius, + Percentage, + ArcDegree, + Lux, + Seconds + } +} diff --git a/src/core/HomeKit/Characteristics/ICharacteristic.cs b/src/core/HomeKit/Characteristics/ICharacteristic.cs new file mode 100644 index 0000000..64f2cd3 --- /dev/null +++ b/src/core/HomeKit/Characteristics/ICharacteristic.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using DaanV2.UUID; + +namespace Smarty.Core.HomeKit.Characteristics +{ + /// + /// A characteristic is a feature that represents data or an associated behavior of a service. The characteristic is defined + /// by a universally unique type, and has additional properties that determine how the value of the characteristic can be + /// accessed. + /// + public interface ICharacteristic + { + /// + /// UUID of the characteristic. + /// + public UUID Uuid { get; } + + /// + /// Display name of the characteristic. + /// + public string DisplayName { get; } + + /// + /// Format + /// + public CharacteristicFormat Format { get; } + + /// + /// Unit. + /// + public CharacteristicUnit Unit { get; } + + /// + /// Permissions + /// + public IReadOnlyList Permissions { get; } + } +} diff --git a/src/core/HomeKit/Events/EventEmitter.cs b/src/core/HomeKit/Events/EventEmitter.cs new file mode 100644 index 0000000..21220ee --- /dev/null +++ b/src/core/HomeKit/Events/EventEmitter.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.HomeKit.Events +{ + public class EventEmitter : IEventEmitter + { + } +} diff --git a/src/core/HomeKit/Events/IEventEmitter.cs b/src/core/HomeKit/Events/IEventEmitter.cs new file mode 100644 index 0000000..f925271 --- /dev/null +++ b/src/core/HomeKit/Events/IEventEmitter.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.HomeKit.Events +{ + public interface IEventEmitter + { + } +} diff --git a/src/core/HomeKit/Service/IService.cs b/src/core/HomeKit/Service/IService.cs deleted file mode 100644 index f4f364f..0000000 --- a/src/core/HomeKit/Service/IService.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Smarty.Core.HomeKit.Service -{ - /// - /// Interface for HomeKit services. - /// - public interface IService - { - } -} diff --git a/src/core/HomeKit/Services/IService.cs b/src/core/HomeKit/Services/IService.cs new file mode 100644 index 0000000..55f7ed9 --- /dev/null +++ b/src/core/HomeKit/Services/IService.cs @@ -0,0 +1,20 @@ +using DaanV2.UUID; + +namespace Smarty.Core.HomeKit.Services +{ + /// + /// Interface for HomeKit services. + /// + public interface IService + { + /// + /// UUID of the service. + /// + public UUID Uuid { get; } + + /// + /// Display name of the service. + /// + public string DisplayName { get; } + } +} diff --git a/src/core/HomeKit/Services/Service.cs b/src/core/HomeKit/Services/Service.cs new file mode 100644 index 0000000..947fe88 --- /dev/null +++ b/src/core/HomeKit/Services/Service.cs @@ -0,0 +1,23 @@ +using System; +using DaanV2.UUID; + +namespace Smarty.Core.HomeKit.Services +{ + public class Service : IService + { + /// + public UUID Uuid { get; } + + /// + public string DisplayName { get; } + + public Service(string uuid, string displayName) + { + Uuid = uuid ?? throw new ArgumentException("Service must be created with a valid UUID.", nameof(uuid)); + if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); + + if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; + else throw new ArgumentException("Services must be created with a non-empty displayName.", nameof(displayName)); + } + } +} From 47b7d0aaf3d2a03423407e5f2dd3b3be6b60198e Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 16:50:10 +0300 Subject: [PATCH 004/152] implemented initial characteristics. --- .../HomeKit/Characteristics/Characteristic.cs | 95 ++++++++++++++++++- .../Definitions/AccessoryFlags.cs | 21 ++++ .../Characteristics/Definitions/Name.cs | 20 ++++ .../Characteristics/ICharacteristic.cs | 16 +--- .../Characteristics/ICharacteristicProps.cs | 83 ++++++++++++++++ 5 files changed, 221 insertions(+), 14 deletions(-) create mode 100644 src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs create mode 100644 src/core/HomeKit/Characteristics/Definitions/Name.cs create mode 100644 src/core/HomeKit/Characteristics/ICharacteristicProps.cs diff --git a/src/core/HomeKit/Characteristics/Characteristic.cs b/src/core/HomeKit/Characteristics/Characteristic.cs index 55fdc00..607373a 100644 --- a/src/core/HomeKit/Characteristics/Characteristic.cs +++ b/src/core/HomeKit/Characteristics/Characteristic.cs @@ -1,10 +1,11 @@ using System; +using System.Collections.Generic; using DaanV2.UUID; using Smarty.Core.HomeKit.Events; namespace Smarty.Core.HomeKit.Characteristics { - public class Characteristic : EventEmitter, ICharacteristic + public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProps { /// public UUID Uuid { get; } @@ -12,13 +13,103 @@ public class Characteristic : EventEmitter, ICharacteristic /// public string DisplayName { get; } - public Characteristic(string uuid, string displayName) + /// + public dynamic Value { get; } + + /// + public IReadOnlyList Permissions { get; } + + /// + public bool EventNotificationsEnabled { get; } + + /// + public string Description { get; } + + /// + public CharacteristicFormat Format { get; } + + /// + public CharacteristicUnit Unit { get; } + + /// + public dynamic MinValue { get; } + + /// + public dynamic MaxValue { get; } + + /// + public dynamic MinStep { get; } + + /// + public int MaxLength { get; } + + /// + public int MaxDataLength { get; } + + /// + public IList ValidValues { get; } + + /// + public dynamic[] ValidValuesRange { get; } + + + protected Characteristic(string uuid, string displayName, CharacteristicFormat format, IReadOnlyList permissions, + CharacteristicUnit unit = CharacteristicUnit.Unitless, bool eventNotificationsEnabled = false, string description = null, + dynamic minValue = null, dynamic maxValue = null, dynamic minStep = null, int maxLength = 64, int maxDataLength = 2097152, + IList validValues = null, dynamic[] validValuesRange = null) { Uuid = uuid ?? throw new ArgumentException("Characteristics must be created with a valid UUID.", nameof(uuid)); if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; else throw new ArgumentException("Characteristics must be created with a non-empty displayName.", nameof(displayName)); + + Value = GetDefaultValue(); + + Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions)); + if (Permissions.Count == 0) throw new ArgumentException("Characteristics must have permissions defined.", nameof(displayName)); + + Format = format; + Unit = unit; + + EventNotificationsEnabled = eventNotificationsEnabled; + Description = description; + MinValue = minValue; + MaxValue = maxValue; + MinStep = minStep; + MaxLength = maxLength; + MaxDataLength = maxDataLength; + ValidValues = validValues; + ValidValuesRange = validValuesRange; + } + + private dynamic GetDefaultValue() + { + switch (Format) + { + case CharacteristicFormat.Bool: + return false; + case CharacteristicFormat.Int: + return 0; + case CharacteristicFormat.Float: + return 0; + case CharacteristicFormat.String: + return ""; + case CharacteristicFormat.Uint8: + return 0; + case CharacteristicFormat.Uint16: + return 0; + case CharacteristicFormat.Uint32: + return 0; + case CharacteristicFormat.Uint64: + return 0; + case CharacteristicFormat.Data: + return null; + case CharacteristicFormat.Tlv8: + return null; + default: + throw new ArgumentOutOfRangeException(); + } } } } diff --git a/src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs b/src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs new file mode 100644 index 0000000..693bcd9 --- /dev/null +++ b/src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.HomeKit.Characteristics.Definitions +{ + public class AccessoryFlags : Characteristic + { + public AccessoryFlags() : base( + "000000A6-0000-1000-8000-0026BB765291", + "Accessory Flags", + CharacteristicFormat.Uint32, + new List() + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events + }) + { + } + } +} diff --git a/src/core/HomeKit/Characteristics/Definitions/Name.cs b/src/core/HomeKit/Characteristics/Definitions/Name.cs new file mode 100644 index 0000000..95fe316 --- /dev/null +++ b/src/core/HomeKit/Characteristics/Definitions/Name.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.HomeKit.Characteristics.Definitions +{ + public class Name : Characteristic + { + public Name() : base( + "00000023-0000-1000-8000-0026BB765291", + "Name", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/core/HomeKit/Characteristics/ICharacteristic.cs b/src/core/HomeKit/Characteristics/ICharacteristic.cs index 64f2cd3..03b9772 100644 --- a/src/core/HomeKit/Characteristics/ICharacteristic.cs +++ b/src/core/HomeKit/Characteristics/ICharacteristic.cs @@ -21,18 +21,10 @@ public interface ICharacteristic public string DisplayName { get; } /// - /// Format + /// The value of the characteristic, which must conform to the ”format” property.The literal value null may also be used + /// if the characteristic has no value.This property must be present if and only if the characteristic contains the + /// Paired Read permission, see Table 6-4 (page 56). /// - public CharacteristicFormat Format { get; } - - /// - /// Unit. - /// - public CharacteristicUnit Unit { get; } - - /// - /// Permissions - /// - public IReadOnlyList Permissions { get; } + public dynamic Value { get; } } } diff --git a/src/core/HomeKit/Characteristics/ICharacteristicProps.cs b/src/core/HomeKit/Characteristics/ICharacteristicProps.cs new file mode 100644 index 0000000..874de07 --- /dev/null +++ b/src/core/HomeKit/Characteristics/ICharacteristicProps.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Smarty.Core.HomeKit.Characteristics +{ + public interface ICharacteristicProps + { + /// + /// Array of permission strings describing the capabilities of the characteristic. + /// + public IReadOnlyList Permissions { get; } + + /// + /// (Optional) + /// Boolean indicating if event notifications are enabled for this characteristic. + /// + public bool EventNotificationsEnabled { get; } + + /// + /// (Optional) + /// String describing the characteristic on a manufacturer-specific basis, such as an indoor versus outdoor temperature reading. + /// + public string Description { get; } + + /// + /// Format of the value, e.g. ”float”. + /// + public CharacteristicFormat Format { get; } + + /// + /// Unit of the value, e.g. ”celsius” + /// + public CharacteristicUnit Unit { get; } + + /// + /// (Optional) + /// Minimum value for the characteristic, which is only appropriate for characteristics that have a format of ”int” or ”float”. + /// + public dynamic MinValue { get; } + + /// + /// (Optional) + /// Maximum value for the characteristic, which is only appropriate for characteristics that have a format of ”int” or ”float”. + /// + public dynamic MaxValue { get; } + + /// + /// (Optional) + /// Minimum step value for the characteristic, which is only appropriate for characteristics that have a format of ”int” or ”float”. + /// For example, if this were 0.15, the characteristic value can be incremented from the minimum value in multiples of 0.15. + /// For “float”, the “Value” needs to be rounded on the accessory side to the closest allowed value per the ”Step Value” + /// (e.g.a value of 10.150001 received on the accessory side with a ”Step Value” of 0.15 and a ”Minimum Value” of 10.0 needs + /// to be interpreted as 10.15). + /// + public dynamic MinStep { get; } + + /// + /// (Optional default: 64) + /// Maximum number of characters if the format is ”string”. If this property is omitted for ”string” formats, then the default value is 64. + /// The maximum value allowed is 256. + /// + public int MaxLength { get; } + + /// + /// (Optional default: 2097152) + /// Maximum number of characters if the format is ”data”. If this property is omitted for ”data” formats, then the default value is 2097152. + /// + public int MaxDataLength { get; } + + /// + /// (Optional) + /// An array of numbers where each element represents a valid value. + /// + public IList ValidValues { get; } + + /// + /// (Optional) + /// A 2 element array representing the starting value and ending value of the range of valid values. + /// + public dynamic[] ValidValuesRange { get; } + } +} From 109543a4458d8810ca4e499b9af50625e494d9e5 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 16:54:47 +0300 Subject: [PATCH 005/152] seperated homekit logic to new project. --- smarty.sln | 17 +++++++++++++++++ src/core/HomeKit/Events/EventEmitter.cs | 10 ---------- src/core/HomeKit/Events/IEventEmitter.cs | 10 ---------- src/core/smarty.core.csproj | 4 ---- .../homekit}/Accessories/Accessory.cs | 6 +++--- .../homekit}/Accessories/AccessoryCategory.cs | 2 +- .../homekit}/Accessories/IAccessory.cs | 4 ++-- .../homekit}/Accessories/IAccessoryBase.cs | 4 ++-- .../homekit}/Bridges/Bridge.cs | 6 +++--- .../homekit}/Bridges/IBridge.cs | 4 ++-- .../homekit}/Characteristics/Characteristic.cs | 4 ++-- .../Characteristics/CharacteristicFormat.cs | 2 +- .../Characteristics/CharacteristicPermission.cs | 2 +- .../Characteristics/CharacteristicUnit.cs | 2 +- .../Definitions/AccessoryFlags.cs | 6 ++---- .../Characteristics/Definitions/Name.cs | 6 ++---- .../homekit}/Characteristics/ICharacteristic.cs | 5 ++--- .../Characteristics/ICharacteristicProps.cs | 6 ++---- src/platforms/homekit/Events/EventEmitter.cs | 6 ++++++ src/platforms/homekit/Events/IEventEmitter.cs | 6 ++++++ .../homekit}/Services/IService.cs | 2 +- .../homekit}/Services/Service.cs | 2 +- .../homekit/Smarty.Platform.HomeKit.csproj | 11 +++++++++++ 23 files changed, 68 insertions(+), 59 deletions(-) delete mode 100644 src/core/HomeKit/Events/EventEmitter.cs delete mode 100644 src/core/HomeKit/Events/IEventEmitter.cs rename src/{core/HomeKit => platforms/homekit}/Accessories/Accessory.cs (93%) rename src/{core/HomeKit => platforms/homekit}/Accessories/AccessoryCategory.cs (96%) rename src/{core/HomeKit => platforms/homekit}/Accessories/IAccessory.cs (78%) rename src/{core/HomeKit => platforms/homekit}/Accessories/IAccessoryBase.cs (91%) rename src/{core/HomeKit => platforms/homekit}/Bridges/Bridge.cs (93%) rename src/{core/HomeKit => platforms/homekit}/Bridges/IBridge.cs (78%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/Characteristic.cs (97%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/CharacteristicFormat.cs (90%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/CharacteristicPermission.cs (95%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/CharacteristicUnit.cs (79%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/Definitions/AccessoryFlags.cs (77%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/Definitions/Name.cs (73%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/ICharacteristic.cs (90%) rename src/{core/HomeKit => platforms/homekit}/Characteristics/ICharacteristicProps.cs (96%) create mode 100644 src/platforms/homekit/Events/EventEmitter.cs create mode 100644 src/platforms/homekit/Events/IEventEmitter.cs rename src/{core/HomeKit => platforms/homekit}/Services/IService.cs (90%) rename src/{core/HomeKit => platforms/homekit}/Services/Service.cs (94%) create mode 100644 src/platforms/homekit/Smarty.Platform.HomeKit.csproj diff --git a/smarty.sln b/smarty.sln index 422f527..466beb2 100644 --- a/smarty.sln +++ b/smarty.sln @@ -13,6 +13,10 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "DaanV2.UUID.Net Source", "c EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaanV2.UUID.Net Core", "contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Core\DaanV2.UUID.Net Core.csproj", "{4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED96F7FE-6FF3-4C84-9976-46D2C8557E8A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Platform.HomeKit", "src\platforms\homekit\Smarty.Platform.HomeKit.csproj", "{75D7361A-EEC0-489C-AA21-3B0511668D9D}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{72de337f-6f32-4e42-9ca3-3f4759275e1e}*SharedItemsImports = 13 @@ -50,6 +54,18 @@ Global {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x64.Build.0 = Release|x64 {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.ActiveCfg = Release|x86 {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.Build.0 = Release|x86 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.ActiveCfg = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.Build.0 = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.ActiveCfg = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.Build.0 = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|Any CPU.Build.0 = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.ActiveCfg = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.Build.0 = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.ActiveCfg = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -58,6 +74,7 @@ Global {DA1CF614-7D2E-49BA-B27F-4334B964C2E0} = {9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106} {72DE337F-6F32-4E42-9CA3-3F4759275E1E} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} + {75D7361A-EEC0-489C-AA21-3B0511668D9D} = {ED96F7FE-6FF3-4C84-9976-46D2C8557E8A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} diff --git a/src/core/HomeKit/Events/EventEmitter.cs b/src/core/HomeKit/Events/EventEmitter.cs deleted file mode 100644 index 21220ee..0000000 --- a/src/core/HomeKit/Events/EventEmitter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Smarty.Core.HomeKit.Events -{ - public class EventEmitter : IEventEmitter - { - } -} diff --git a/src/core/HomeKit/Events/IEventEmitter.cs b/src/core/HomeKit/Events/IEventEmitter.cs deleted file mode 100644 index f925271..0000000 --- a/src/core/HomeKit/Events/IEventEmitter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Smarty.Core.HomeKit.Events -{ - public interface IEventEmitter - { - } -} diff --git a/src/core/smarty.core.csproj b/src/core/smarty.core.csproj index 3e4f638..a1831f9 100644 --- a/src/core/smarty.core.csproj +++ b/src/core/smarty.core.csproj @@ -6,8 +6,4 @@ Smarty.Core - - - - diff --git a/src/core/HomeKit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs similarity index 93% rename from src/core/HomeKit/Accessories/Accessory.cs rename to src/platforms/homekit/Accessories/Accessory.cs index 3c26228..dee33e0 100644 --- a/src/core/HomeKit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Core.HomeKit.Bridges; -using Smarty.Core.HomeKit.Services; +using Smarty.Platform.HomeKit.Bridges; +using Smarty.Platform.HomeKit.Services; -namespace Smarty.Core.HomeKit.Accessories +namespace Smarty.Platform.HomeKit.Accessories { public class Accessory : IAccessory { diff --git a/src/core/HomeKit/Accessories/AccessoryCategory.cs b/src/platforms/homekit/Accessories/AccessoryCategory.cs similarity index 96% rename from src/core/HomeKit/Accessories/AccessoryCategory.cs rename to src/platforms/homekit/Accessories/AccessoryCategory.cs index bc0a9e2..08fccc3 100644 --- a/src/core/HomeKit/Accessories/AccessoryCategory.cs +++ b/src/platforms/homekit/Accessories/AccessoryCategory.cs @@ -1,4 +1,4 @@ -namespace Smarty.Core.HomeKit.Accessories +namespace Smarty.Platform.HomeKit.Accessories { /// /// Accessory categories diff --git a/src/core/HomeKit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs similarity index 78% rename from src/core/HomeKit/Accessories/IAccessory.cs rename to src/platforms/homekit/Accessories/IAccessory.cs index 63422bf..ccd341e 100644 --- a/src/core/HomeKit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -1,6 +1,6 @@ -using Smarty.Core.HomeKit.Bridges; +using Smarty.Platform.HomeKit.Bridges; -namespace Smarty.Core.HomeKit.Accessories +namespace Smarty.Platform.HomeKit.Accessories { /// /// Accessory interface. diff --git a/src/core/HomeKit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs similarity index 91% rename from src/core/HomeKit/Accessories/IAccessoryBase.cs rename to src/platforms/homekit/Accessories/IAccessoryBase.cs index d689df8..5ab6492 100644 --- a/src/core/HomeKit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using DaanV2.UUID; -using Smarty.Core.HomeKit.Services; +using Smarty.Platform.HomeKit.Services; -namespace Smarty.Core.HomeKit.Accessories +namespace Smarty.Platform.HomeKit.Accessories { /// /// Base accessory interface. diff --git a/src/core/HomeKit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs similarity index 93% rename from src/core/HomeKit/Bridges/Bridge.cs rename to src/platforms/homekit/Bridges/Bridge.cs index 8cbc2a1..a252900 100644 --- a/src/core/HomeKit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Core.HomeKit.Accessories; -using Smarty.Core.HomeKit.Services; +using Smarty.Platform.HomeKit.Accessories; +using Smarty.Platform.HomeKit.Services; -namespace Smarty.Core.HomeKit.Bridges +namespace Smarty.Platform.HomeKit.Bridges { public class Bridge : IBridge { diff --git a/src/core/HomeKit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs similarity index 78% rename from src/core/HomeKit/Bridges/IBridge.cs rename to src/platforms/homekit/Bridges/IBridge.cs index e3fe471..8306a59 100644 --- a/src/core/HomeKit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using Smarty.Core.HomeKit.Accessories; +using Smarty.Platform.HomeKit.Accessories; -namespace Smarty.Core.HomeKit.Bridges +namespace Smarty.Platform.HomeKit.Bridges { /// /// Bridge interface. diff --git a/src/core/HomeKit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs similarity index 97% rename from src/core/HomeKit/Characteristics/Characteristic.cs rename to src/platforms/homekit/Characteristics/Characteristic.cs index 607373a..f847fdc 100644 --- a/src/core/HomeKit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using DaanV2.UUID; -using Smarty.Core.HomeKit.Events; +using Smarty.Platform.HomeKit.Events; -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProps { diff --git a/src/core/HomeKit/Characteristics/CharacteristicFormat.cs b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs similarity index 90% rename from src/core/HomeKit/Characteristics/CharacteristicFormat.cs rename to src/platforms/homekit/Characteristics/CharacteristicFormat.cs index 67ee26d..7d21ee4 100644 --- a/src/core/HomeKit/Characteristics/CharacteristicFormat.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs @@ -1,4 +1,4 @@ -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { // Data presentation formats. public enum CharacteristicFormat diff --git a/src/core/HomeKit/Characteristics/CharacteristicPermission.cs b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs similarity index 95% rename from src/core/HomeKit/Characteristics/CharacteristicPermission.cs rename to src/platforms/homekit/Characteristics/CharacteristicPermission.cs index d9393d3..db76ce6 100644 --- a/src/core/HomeKit/Characteristics/CharacteristicPermission.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs @@ -1,4 +1,4 @@ -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { /// /// Characteristic permissions diff --git a/src/core/HomeKit/Characteristics/CharacteristicUnit.cs b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs similarity index 79% rename from src/core/HomeKit/Characteristics/CharacteristicUnit.cs rename to src/platforms/homekit/Characteristics/CharacteristicUnit.cs index 514e691..125f065 100644 --- a/src/core/HomeKit/Characteristics/CharacteristicUnit.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs @@ -1,4 +1,4 @@ -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { /// /// Data units. diff --git a/src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs similarity index 77% rename from src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs rename to src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs index 693bcd9..50ef76d 100644 --- a/src/core/HomeKit/Characteristics/Definitions/AccessoryFlags.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; -namespace Smarty.Core.HomeKit.Characteristics.Definitions +namespace Smarty.Platform.HomeKit.Characteristics.Definitions { public class AccessoryFlags : Characteristic { diff --git a/src/core/HomeKit/Characteristics/Definitions/Name.cs b/src/platforms/homekit/Characteristics/Definitions/Name.cs similarity index 73% rename from src/core/HomeKit/Characteristics/Definitions/Name.cs rename to src/platforms/homekit/Characteristics/Definitions/Name.cs index 95fe316..89edd35 100644 --- a/src/core/HomeKit/Characteristics/Definitions/Name.cs +++ b/src/platforms/homekit/Characteristics/Definitions/Name.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; -namespace Smarty.Core.HomeKit.Characteristics.Definitions +namespace Smarty.Platform.HomeKit.Characteristics.Definitions { public class Name : Characteristic { diff --git a/src/core/HomeKit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs similarity index 90% rename from src/core/HomeKit/Characteristics/ICharacteristic.cs rename to src/platforms/homekit/Characteristics/ICharacteristic.cs index 03b9772..d5d91f9 100644 --- a/src/core/HomeKit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -1,7 +1,6 @@ -using System.Collections.Generic; -using DaanV2.UUID; +using DaanV2.UUID; -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { /// /// A characteristic is a feature that represents data or an associated behavior of a service. The characteristic is defined diff --git a/src/core/HomeKit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs similarity index 96% rename from src/core/HomeKit/Characteristics/ICharacteristicProps.cs rename to src/platforms/homekit/Characteristics/ICharacteristicProps.cs index 874de07..519e75d 100644 --- a/src/core/HomeKit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; -namespace Smarty.Core.HomeKit.Characteristics +namespace Smarty.Platform.HomeKit.Characteristics { public interface ICharacteristicProps { diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/src/platforms/homekit/Events/EventEmitter.cs new file mode 100644 index 0000000..071bfe8 --- /dev/null +++ b/src/platforms/homekit/Events/EventEmitter.cs @@ -0,0 +1,6 @@ +namespace Smarty.Platform.HomeKit.Events +{ + public class EventEmitter : IEventEmitter + { + } +} diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/src/platforms/homekit/Events/IEventEmitter.cs new file mode 100644 index 0000000..7ff9d38 --- /dev/null +++ b/src/platforms/homekit/Events/IEventEmitter.cs @@ -0,0 +1,6 @@ +namespace Smarty.Platform.HomeKit.Events +{ + public interface IEventEmitter + { + } +} diff --git a/src/core/HomeKit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs similarity index 90% rename from src/core/HomeKit/Services/IService.cs rename to src/platforms/homekit/Services/IService.cs index 55f7ed9..a4cf931 100644 --- a/src/core/HomeKit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -1,6 +1,6 @@ using DaanV2.UUID; -namespace Smarty.Core.HomeKit.Services +namespace Smarty.Platform.HomeKit.Services { /// /// Interface for HomeKit services. diff --git a/src/core/HomeKit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs similarity index 94% rename from src/core/HomeKit/Services/Service.cs rename to src/platforms/homekit/Services/Service.cs index 947fe88..a00fc48 100644 --- a/src/core/HomeKit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -1,7 +1,7 @@ using System; using DaanV2.UUID; -namespace Smarty.Core.HomeKit.Services +namespace Smarty.Platform.HomeKit.Services { public class Service : IService { diff --git a/src/platforms/homekit/Smarty.Platform.HomeKit.csproj b/src/platforms/homekit/Smarty.Platform.HomeKit.csproj new file mode 100644 index 0000000..d388950 --- /dev/null +++ b/src/platforms/homekit/Smarty.Platform.HomeKit.csproj @@ -0,0 +1,11 @@ + + + + netcoreapp3.1 + + + + + + + From 4135980c39d01889288af977fb7491eee59fb89c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 17:07:54 +0300 Subject: [PATCH 006/152] added build project. added github workflow support. --- .github/workflows/dotnetcore.yml | 21 + GitVersion.yml | 5 + build.cmd | 2 + build.ps1 | 2 + build.sh | 3 + build/Build.cs | 98 ++++ build/Smarty.Build.csproj | 31 ++ changelog.md | 1 + contrib/DaanV2.UUID.Net-master/.gitattributes | 63 --- contrib/DaanV2.UUID.Net-master/.gitignore | 265 ---------- .../DaanV2.UUID.Net - Standard 2.0.csproj | 20 - .../DaanV2.UUID.Net Core.csproj | 69 --- .../DaanV2.UUID.Net Source.projitems | 55 -- .../DaanV2.UUID.Net Source.shproj | 13 - .../DaanV2.UUID.Net.sln | 120 ----- .../DaanV2.UUID.Net/DaanV2.UUID.Net.csproj | 119 ----- .../Properties/AssemblyInfo.cs | 35 -- .../Debugger.Net Core/Benchmark.cs | 85 ---- .../Classes/Logger/Logger - Function.cs | 37 -- .../Classes/Logger/Logger - Initialize.cs | 19 - .../Classes/Logger/Logger - Variables.cs | 8 - .../Debugger.Net Core.csproj | 12 - .../Debugger.Net Core/Program.cs | 33 -- .../Documentation/Data/Data-x64.csv | 401 --------------- .../Documentation/Data/Data-x86.csv | 401 --------------- .../Documentation/Data/Data.xlsx | Bin 115428 -> 0 bytes .../Documentation/Data/Graph.png | Bin 49250 -> 0 bytes .../Documentation/Performance.md | 53 -- contrib/DaanV2.UUID.Net-master/LICENSE.txt | 15 - .../Nuget/DaanV2.UUID.Net.nuspec | 36 -- .../DaanV2.UUID.Net-master/Nuget/build.bat | 2 - .../Nuget/images/icon.png | Bin 16529 -> 0 bytes .../Overview - Messy.dgml | 458 ----------------- contrib/DaanV2.UUID.Net-master/Overview.dgml | 470 ------------------ contrib/DaanV2.UUID.Net-master/README.md | 59 --- .../UUID.code-workspace | 7 - .../Classes/GeneratorTests/GeneratorTests.cs | 33 -- .../Unit Test/Classes/NillTest/NillTest.cs | 13 - .../VersionTests/VersionTests - Casting.cs | 41 -- .../VersionTests/VersionTests - Generic.cs | 66 --- .../Unit Test/Properties/AssemblyInfo.cs | 19 - .../Unit Test/Unit Test.csproj | 117 ----- .../Unit Test/packages.config | 5 - .../Classes/UUID/UUID - Get.cs | 0 .../Classes/UUID/UUID - Initialize.cs | 0 .../Classes/UUID/UUID - Nill.cs | 0 .../Classes/UUID/UUID - Operator.cs | 0 .../Classes/UUID/UUID - Overrides.cs | 0 .../Classes/UUID/UUID - Properties.cs | 0 .../Classes/UUID/UUID - Variables.cs | 0 .../Generator Base - IUUIDGenerator.cs | 0 .../Generator Info - Initialize.cs | 0 .../Generator Info - Properties.cs | 0 .../Generator Info - Variables.cs | 0 .../Converter/Converter - Initialize.cs | 0 .../Converter/Converter - Load.cs | 0 .../Converter/Converter - To Byte Array.cs | 0 .../Converter/Converter - To Char Array.cs | 0 .../Converter/Converter - Variables.cs | 0 .../Generator Variant 1 - GeneratorBase.cs | 0 .../Generator Variant 1 - Initialize.cs | 0 .../Generator Variant 1 - Properties.cs | 0 .../Generator Variant 1 - Variable.cs | 0 .../Random Generator Base - GeneratorBase.cs | 0 .../Random Generator Base - Initialize.cs | 0 .../Random Generator Base - Properties.cs | 0 .../Random Generator Base - Variables.cs | 0 .../Generator Variant 1 - Initialize.cs | 0 ...nerator Variant 1 - RandomGeneratorBase.cs | 0 .../Generator Variant 2 - Initialize.cs | 0 ...nerator Variant 2 - RandomGeneratorBase.cs | 0 .../Generator Variant 1 - GeneratorBase.cs | 0 .../Generator Variant 1 - Initialize.cs | 0 .../Generator Variant 1 - Properties.cs | 0 .../Generator Variant 1 - Variables.cs | 0 .../IUUID Generator/IUUID Generator.cs | 0 .../UUID Factory/UUID Factory - Context.cs | 0 .../UUID Factory - Create Generator.cs | 0 .../UUID Factory - Create UUID.cs | 0 .../UUID Factory/UUID Factory - Get.cs | 0 .../UUID Factory/UUID Factory - Initialize.cs | 0 .../UUID Factory/UUID Factory - Load.cs | 0 .../UUID Factory/UUID Factory - Variables.cs | 0 .../UUID Validator - Initialize.cs | 0 .../UUID Validator - Validate.cs | 0 contrib/uuid.net/uuid.net.csproj | 7 + global.json | 5 + renovate.json | 5 + smarty.sln | 50 +- src/core/smarty.core.csproj | 4 + .../homekit/Smarty.Platform.HomeKit.csproj | 2 +- 91 files changed, 214 insertions(+), 3171 deletions(-) create mode 100644 .github/workflows/dotnetcore.yml create mode 100644 GitVersion.yml create mode 100644 build.cmd create mode 100644 build.ps1 create mode 100644 build.sh create mode 100644 build/Build.cs create mode 100644 build/Smarty.Build.csproj create mode 100644 changelog.md delete mode 100644 contrib/DaanV2.UUID.Net-master/.gitattributes delete mode 100644 contrib/DaanV2.UUID.Net-master/.gitignore delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj delete mode 100644 contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj delete mode 100644 contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv delete mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv delete mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx delete mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Data/Graph.png delete mode 100644 contrib/DaanV2.UUID.Net-master/Documentation/Performance.md delete mode 100644 contrib/DaanV2.UUID.Net-master/LICENSE.txt delete mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec delete mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/build.bat delete mode 100644 contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png delete mode 100644 contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml delete mode 100644 contrib/DaanV2.UUID.Net-master/Overview.dgml delete mode 100644 contrib/DaanV2.UUID.Net-master/README.md delete mode 100644 contrib/DaanV2.UUID.Net-master/UUID.code-workspace delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj delete mode 100644 contrib/DaanV2.UUID.Net-master/Unit Test/packages.config rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Get.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Nill.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Operator.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Overrides.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Properties.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Classes/UUID/UUID - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Classes/Generator Info/Generator Info - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Classes/Generator Info/Generator Info - Properties.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Classes/Generator Info/Generator Info - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Static Classes/Converter/Converter - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Static Classes/Converter/Converter - Load.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Static Classes/Converter/Converter - To Byte Array.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Static Classes/Converter/Converter - To Char Array.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Static Classes/Converter/Converter - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Interfaces/IUUID Generator/IUUID Generator.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Context.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Create Generator.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Create UUID.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Get.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Load.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Factory/UUID Factory - Variables.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Validator/UUID Validator - Initialize.cs (100%) rename contrib/{DaanV2.UUID.Net-master/DaanV2.UUID.Net Source => uuid.net}/Static Classes/UUID Validator/UUID Validator - Validate.cs (100%) create mode 100644 contrib/uuid.net/uuid.net.csproj create mode 100644 global.json create mode 100644 renovate.json diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml new file mode 100644 index 0000000..6310b9d --- /dev/null +++ b/.github/workflows/dotnetcore.yml @@ -0,0 +1,21 @@ +name: build + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: install dotnet core 3.1 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.100 + #- name: run mongodb + # run: sudo docker run --name mongo -d -p 27017:27017 mongo + - name: build + run: ./build.sh + - name: test + run: dotnet test diff --git a/GitVersion.yml b/GitVersion.yml new file mode 100644 index 0000000..5fb0fc3 --- /dev/null +++ b/GitVersion.yml @@ -0,0 +1,5 @@ +assembly-versioning-scheme: MajorMinorPatch +mode: ContinuousDelivery +branches: {} +ignore: + sha: [] \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..66bf373 --- /dev/null +++ b/build.cmd @@ -0,0 +1,2 @@ +@echo Off +dotnet run --project build -- %* \ No newline at end of file diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..8c950bd --- /dev/null +++ b/build.ps1 @@ -0,0 +1,2 @@ +$ErrorActionPreference = "Stop"; +dotnet run --project build -- $args \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..bb8ef5b --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +dotnet run --project build -- "$@" \ No newline at end of file diff --git a/build/Build.cs b/build/Build.cs new file mode 100644 index 0000000..3eb3b79 --- /dev/null +++ b/build/Build.cs @@ -0,0 +1,98 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +using System.IO; +using System.Runtime.CompilerServices; +using McMaster.Extensions.CommandLineUtils; +using static Bullseye.Targets; +using static SimpleExec.Command; + +namespace HypeEngine.Build +{ + [Command(ThrowOnUnexpectedArgument = false)] + [SuppressDefaultHelpOption] + public class Build + { + static void Main(string[] args) => CommandLineApplication.Execute(args); + + [Option("-h|-?|--help", "Show help message", CommandOptionType.NoValue)] + public bool ShowHelp { get; } = false; + + [Option("-c|--configuration", "The configuration to build", CommandOptionType.SingleValue)] + public string Configuration { get; } = "Release"; + + [Option("-f|--framework", "The framework to target", CommandOptionType.SingleValue)] + public string Framework { get; } = "netcoreapp3.1"; + + public string[] RemainingArguments { get; } = null; + + private static string GetSolutionDirectory() => Path.GetFullPath(Path.Combine(GetScriptDirectory(), @"..")); + + private static string GetScriptDirectory([CallerFilePath] string filename = null) => Path.GetDirectoryName(filename); + + public void OnExecute(CommandLineApplication app) + { + if (ShowHelp) + { + app.ShowHelp(); + app.Out.WriteLine("Bullseye help:"); + app.Out.WriteLine(); + RunTargetsAndExit(new[] { "-h" }); + return; + } + + Directory.SetCurrentDirectory(GetSolutionDirectory()); + + var artifactsDir = Path.GetFullPath("bin"); + var logsDir = Path.Combine(artifactsDir, "logs"); + var buildLogFile = Path.Combine(logsDir, "build.binlog"); + + var projects = new [] + { + "contrib/uuid.net/uuid.net.csproj", + "src/platforms/homekit/Smarty.Platform.HomeKit.csproj", + "src/core/Smarty.Core.csproj" + }; + + var testProjects = new string[] + { + }; + + Target( + "artifactDirs", + () => + { + Directory.CreateDirectory(artifactsDir); + Directory.CreateDirectory(logsDir); + }); + + Target( + "clean", + DependsOn("artifactDirs"), + forEach: projects, + action: project => Run("dotnet", $"clean {project} -c {Configuration} -f {Framework} -o \"{artifactsDir}\" /p:Platform=x64 /bl:\"{buildLogFile}\"")); + + Target( + "build", + DependsOn("clean"), + forEach: projects, + action: project => Run("dotnet", $"build {project} -c {Configuration} -f {Framework} -o \"{artifactsDir}\" /p:Platform=x64 /bl:\"{buildLogFile}\"")); + + Target( + "test", + () => Run("dotnet", "test")); + + + Target("default", DependsOn("build")); + + RunTargetsAndExit(RemainingArguments); + } + } +} diff --git a/build/Smarty.Build.csproj b/build/Smarty.Build.csproj new file mode 100644 index 0000000..f519159 --- /dev/null +++ b/build/Smarty.Build.csproj @@ -0,0 +1,31 @@ + + + + Exe + netcoreapp3.1 + AnyCPU;x64 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..825c32f --- /dev/null +++ b/changelog.md @@ -0,0 +1 @@ +# Changelog diff --git a/contrib/DaanV2.UUID.Net-master/.gitattributes b/contrib/DaanV2.UUID.Net-master/.gitattributes deleted file mode 100644 index 1ff0c42..0000000 --- a/contrib/DaanV2.UUID.Net-master/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/contrib/DaanV2.UUID.Net-master/.gitignore b/contrib/DaanV2.UUID.Net-master/.gitignore deleted file mode 100644 index 8fba2ef..0000000 --- a/contrib/DaanV2.UUID.Net-master/.gitignore +++ /dev/null @@ -1,265 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -Nuget/runtimes -Nuget/lib -nuget.exe - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -project.fragment.lock.json -artifacts/ - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -#*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignoreable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -node_modules/ -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj deleted file mode 100644 index d43b8ee..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net - Standard 2.0/DaanV2.UUID.Net - Standard 2.0.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - netstandard2.0 - DaanV2.UUID - DaanV2.UUID.Net - AnyCPU;x64;x86 - - - - - - - - - - - - - diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj deleted file mode 100644 index 940efbe..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Core/DaanV2.UUID.Net Core.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - netcoreapp3.1 - DaanV2.UUID - AnyCPU;x64;x86 - false - Daan Verstraten - Daan Verstraten - UUID.Net - UUID.Net - Provides a base class that can handle UUIDs as an object but also the generators to generate any version. - Daan Verstraten 2019 - LICENSE.txt - https://github.com/DaanV2/DaanV2.UUID.Net - https://github.com/DaanV2/DaanV2.UUID.Net.git - git - UUID;UUID3;UUID4;UUID5 - DaanV2.UUID.Net - - - - TRACE;NETCORE - none - false - - - - TRACE;NETCORE - none - false - - - - TRACE;NETCORE - none - false - - - - TRACE;NETCORE - - - - TRACE;NETCORE - - - - TRACE;NETCORE - - - - - True - - - - - - - - - - - - - - - diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems deleted file mode 100644 index b5c71a6..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.projitems +++ /dev/null @@ -1,55 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - 72de337f-6f32-4e42-9ca3-3f4759275e1e - - - DaanV2.UUID - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj deleted file mode 100644 index 0b5273c..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/DaanV2.UUID.Net Source.shproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - 72de337f-6f32-4e42-9ca3-3f4759275e1e - 14.0 - - - - - - - - diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln deleted file mode 100644 index c71b993..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net.sln +++ /dev/null @@ -1,120 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29411.108 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{11DEC96A-31A7-414B-9858-86815C90CF13}" - ProjectSection(SolutionItems) = preProject - LICENSE.txt = LICENSE.txt - Overview - Messy.dgml = Overview - Messy.dgml - Overview.dgml = Overview.dgml - Performance.md = Performance.md - README.md = README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{898452FA-EE0A-48F2-A101-055E150A8D03}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Debugger.Net Core", "Debugger.Net Core\Debugger.Net Core.csproj", "{248BA48A-4504-4CB3-97CA-918D0B250310}" -EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "DaanV2.UUID.Net Source", "DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.shproj", "{72DE337F-6F32-4E42-9CA3-3F4759275E1E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaanV2.UUID.Net Core", "DaanV2.UUID.Net Core\DaanV2.UUID.Net Core.csproj", "{DF1C4870-9749-451B-8888-1F9D57FB0CBD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DaanV2.UUID.Net", "DaanV2.UUID.Net\DaanV2.UUID.Net.csproj", "{C419E0C7-2D37-433E-AD0D-44A319047DDF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unit Test", "Unit Test\Unit Test.csproj", "{9B94E9B5-D328-47EC-A487-8BF61E969EF6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D323591A-620B-4526-9524-759A264CC403}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DaanV2.UUID.Net - Standard 2.0", "DaanV2.UUID.Net - Standard 2.0\DaanV2.UUID.Net - Standard 2.0.csproj", "{1EE541B7-156C-4F01-AD1E-C23184E8245E}" -EndProject -Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{72de337f-6f32-4e42-9ca3-3f4759275e1e}*SharedItemsImports = 13 - DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{c419e0c7-2d37-433e-ad0d-44a319047ddf}*SharedItemsImports = 4 - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|Any CPU.Build.0 = Debug|Any CPU - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x64.ActiveCfg = Debug|x64 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x64.Build.0 = Debug|x64 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x86.ActiveCfg = Debug|x86 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Debug|x86.Build.0 = Debug|x86 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|Any CPU.ActiveCfg = Release|Any CPU - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|Any CPU.Build.0 = Release|Any CPU - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x64.ActiveCfg = Release|x64 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x64.Build.0 = Release|x64 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x86.ActiveCfg = Release|x86 - {248BA48A-4504-4CB3-97CA-918D0B250310}.Release|x86.Build.0 = Release|x86 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x64.ActiveCfg = Debug|x64 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x64.Build.0 = Debug|x64 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x86.ActiveCfg = Debug|x86 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Debug|x86.Build.0 = Debug|x86 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|Any CPU.Build.0 = Release|Any CPU - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x64.ActiveCfg = Release|x64 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x64.Build.0 = Release|x64 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x86.ActiveCfg = Release|x86 - {DF1C4870-9749-451B-8888-1F9D57FB0CBD}.Release|x86.Build.0 = Release|x86 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x64.ActiveCfg = Debug|x64 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x64.Build.0 = Debug|x64 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x86.ActiveCfg = Debug|x86 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Debug|x86.Build.0 = Debug|x86 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|Any CPU.Build.0 = Release|Any CPU - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x64.ActiveCfg = Release|x64 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x64.Build.0 = Release|x64 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x86.ActiveCfg = Release|x86 - {C419E0C7-2D37-433E-AD0D-44A319047DDF}.Release|x86.Build.0 = Release|x86 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x64.ActiveCfg = Debug|x64 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x64.Build.0 = Debug|x64 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x86.ActiveCfg = Debug|x86 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Debug|x86.Build.0 = Debug|x86 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|Any CPU.Build.0 = Release|Any CPU - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x64.ActiveCfg = Release|x64 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x64.Build.0 = Release|x64 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x86.ActiveCfg = Release|x86 - {9B94E9B5-D328-47EC-A487-8BF61E969EF6}.Release|x86.Build.0 = Release|x86 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x64.ActiveCfg = Debug|x64 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x64.Build.0 = Debug|x64 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x86.ActiveCfg = Debug|x86 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Debug|x86.Build.0 = Debug|x86 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|Any CPU.Build.0 = Release|Any CPU - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x64.ActiveCfg = Release|x64 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x64.Build.0 = Release|x64 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x86.ActiveCfg = Release|x86 - {1EE541B7-156C-4F01-AD1E-C23184E8245E}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {248BA48A-4504-4CB3-97CA-918D0B250310} = {898452FA-EE0A-48F2-A101-055E150A8D03} - {72DE337F-6F32-4E42-9CA3-3F4759275E1E} = {898452FA-EE0A-48F2-A101-055E150A8D03} - {DF1C4870-9749-451B-8888-1F9D57FB0CBD} = {898452FA-EE0A-48F2-A101-055E150A8D03} - {C419E0C7-2D37-433E-AD0D-44A319047DDF} = {898452FA-EE0A-48F2-A101-055E150A8D03} - {9B94E9B5-D328-47EC-A487-8BF61E969EF6} = {D323591A-620B-4526-9524-759A264CC403} - {1EE541B7-156C-4F01-AD1E-C23184E8245E} = {898452FA-EE0A-48F2-A101-055E150A8D03} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A1F15161-4DBA-4D04-9D21-9E7834457610} - EndGlobalSection -EndGlobal diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj deleted file mode 100644 index d8185e5..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/DaanV2.UUID.Net.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - - Debug - AnyCPU - {C419E0C7-2D37-433E-AD0D-44A319047DDF} - Library - Properties - DaanV2.UUID - DaanV2.UUID.Net - v4.8 - 512 - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - none - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - none - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Release\ - TRACE - true - none - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - - - if $(ConfigurationName) == Release ( - if not exist "$(SolutionDir)Releases\" mkdir "$(SolutionDir)Releases\" - if not exist "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" mkdir "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" - copy "$(TargetDir)*" "$(SolutionDir)Releases\$(ProjectName)\$(PlatformName)\" -) - -set Framework=net48 -if '$(ConfigurationName)' == 'Release' ( - if '$(PlatformName)' == 'AnyCPU' ( - mkdir "$(SolutionDir)Nuget\lib\%25Framework%25\" - copy "$(TargetDir)*" "$(SolutionDir)Nuget\lib\%25Framework%25\" - ) ELSE ( - mkdir "$(SolutionDir)Nuget\runtimes\win10-$(PlatformName)\lib\%25Framework%25\" - copy "$(TargetDir)*" "$(SolutionDir)Nuget\runtimes\win10-$(PlatformName)\lib\%25Framework%25\" - ) -) - - - rd /s /q "$(TargetDir)" -if not exist "$(TargetDir)" mkdir "$(TargetDir)" -if $(ConfigurationName) == Release ( - rd /s /q "$(SolutionDir)Releases\$(ProjectName)-$(PlatformName)\" - if exist "$(SolutionDir)LICENSE.txt" copy "$(SolutionDir)LICENSE.txt" "$(TargetDir)LICENSE.txt" - if exist "$(SolutionDir)README.md" copy "$(SolutionDir)README.md" "$(TargetDir)README.md" - if exist "$(SolutionDir)Include\" copy "$(SolutionDir)Include\" "$(TargetDir)" - if exist "$(ProjectDir)Include\" copy "$(ProjectDir)Include\" "$(TargetDir)" -) - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs b/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs deleted file mode 100644 index 1c2b430..0000000 --- a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("DaanV2.UUID.Net")] -[assembly: AssemblyDescription("Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4 and 5.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DaanV2.UUID.Net")] -[assembly: AssemblyCopyright("Copyright © Daan Verstraten 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c419e0c7-2d37-433e-ad0d-44a319047ddf")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.1.0")] -[assembly: AssemblyFileVersion("1.0.1.0")] diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs deleted file mode 100644 index 03848db..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Benchmark.cs +++ /dev/null @@ -1,85 +0,0 @@ -/*ISC License - -Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -using System; -using System.Diagnostics; -using DaanV2.UUID; - -namespace Debugger.Net_Core { - /// A class that bench marks all the generators - public partial class Benchmark { - /// Tests the version inside the on amount - /// The version of the generator to test - /// The variant of the generator to test - /// The amount of tests conducted - /// The amount of items per test to generate - public static void Test(Int32 Version, Int32 Variant, Logger dataRecorder, Int32 TestCount = 100, Int32 Count = 1000000) { - Stopwatch stopwatch = new Stopwatch(); - Int64 PreviousMS = 0; - Int64 PreviousTicks = 0; - - - for (Int32 I = 0; I < TestCount; I++) { - stopwatch.Start(); - //Create Alot of UUIDs - UUID[] Temp = UUIDFactory.CreateUUIDs(Count, Version, Variant); - - stopwatch.Stop(); - - //Dispose - Temp = null; - dataRecorder.Add(Version, Variant, stopwatch.ElapsedMilliseconds - PreviousMS, stopwatch.ElapsedTicks - PreviousTicks, Count); - PreviousMS = stopwatch.ElapsedMilliseconds; - PreviousTicks = stopwatch.ElapsedTicks; - GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, true); - Console.Title = $"V{Version}.{Variant}\t-\t{I}/{TestCount}"; - } - - dataRecorder.Flush(); - Benchmark.Output(stopwatch, Version, Variant, TestCount, Count); - } - - /// Tests all possible generators and variants inside this library - public static void TestAll(String Folder) { - Int32[] Versions = UUIDFactory.GetAvailableVersion(); - - String Platform = IntPtr.Size == 4 ? "x86" : "x64"; - Logger dataRecorder = new Logger(Folder + $"Data-{Platform}.csv"); - - for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { - Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); - - for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { - Test(Versions[VersionIndex], Variants[VariantIndex], dataRecorder); - } - } - - dataRecorder.Done(); - } - - /// Outputs the test result of a test onto the console - /// The stopwatch that has recorded the timing - /// The amount of tests conducted - /// The amount of items used per tests - public static void Output(Stopwatch sw, Int32 Version, Int32 Variant, Int32 TestCount, Int32 ItemCount = -1) { - Double MSPerTest = sw.ElapsedMilliseconds / (Double)TestCount; - Double TicksPerTest = sw.ElapsedTicks / (Double)TestCount; - Double MSPerTestPerItem = MSPerTest / ItemCount; - Double TicksPerTestPerItem = TicksPerTest / ItemCount; - - Console.WriteLine($"|{Version:G2} |{Variant:G2} |{MSPerTest:G2} |{TicksPerTest:G2} |{MSPerTestPerItem:G2} |{TicksPerTestPerItem:G2} |"); - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs deleted file mode 100644 index ac1f525..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Function.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Diagnostics; -using DaanV2.UUID; - -namespace Debugger.Net_Core { - public partial class Logger { - /// - /// - /// - /// - /// - /// - /// - public void Add(Int32 Version, Int32 Variant, Int64 Millisseconds, Int64 Ticks, Int32 ItemCount) { - this._Writer.WriteLine($"{Version}|{Variant}|{Millisseconds}|{Ticks}|{ItemCount}"); - } - - /// - /// - /// - /// - /// - /// - public void Add(IUUIDGenerator Generator, Stopwatch sw, Int32 ItemCount) { - this.Add(Generator.Version, Generator.Variant, sw.ElapsedMilliseconds, sw.ElapsedTicks, ItemCount); - } - - public void Done() { - this._Writer.Flush(); - this._Writer.Close(); - } - - public void Flush() { - this._Writer.Flush(); - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs deleted file mode 100644 index 0f4cff8..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Initialize.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.IO; - -namespace Debugger.Net_Core { - ///DOLATER add description for class: Logger - public partial class Logger { - /// Creates a new instance of - public Logger(String Filepath) { - this._Writer = new StreamWriter(Filepath, false); - this._Writer.WriteLine("Version|Variant|Milliseconds|Ticks|ItemCount"); - } - - /// - ~Logger() { - this._Writer.Flush(); - this._Writer.Close(); - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs deleted file mode 100644 index f8c378a..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Classes/Logger/Logger - Variables.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.IO; - -namespace Debugger.Net_Core { - public partial class Logger { - /// - private StreamWriter _Writer; - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj deleted file mode 100644 index 20692dd..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Debugger.Net Core.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - netcoreapp3.0 - Debugger.Net_Core - AnyCPU;x64;x86 - - - - - diff --git a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs b/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs deleted file mode 100644 index 40632cd..0000000 --- a/contrib/DaanV2.UUID.Net-master/Debugger.Net Core/Program.cs +++ /dev/null @@ -1,33 +0,0 @@ -/*ISC License - -Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -using System; - -namespace Debugger.Net_Core { - internal class Program { - private static String _Folder = AppDomain.CurrentDomain.BaseDirectory; - - private static void Main(String[] args) { - if (!_Folder.EndsWith("\\")) { - _Folder += "\\"; - } - - Benchmark.TestAll(_Folder); - - Console.WriteLine("Done"); - Console.ReadLine(); - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv deleted file mode 100644 index 66201a8..0000000 --- a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x64.csv +++ /dev/null @@ -1,401 +0,0 @@ -Version|Variant|Milliseconds|Ticks|ItemCount -3|1|972|9729994|1000000 -3|1|997|9962707|1000000 -3|1|809|8088348|1000000 -3|1|945|9453207|1000000 -3|1|790|7904149|1000000 -3|1|951|9504784|1000000 -3|1|851|8516288|1000000 -3|1|969|9683684|1000000 -3|1|899|8988836|1000000 -3|1|970|9706743|1000000 -3|1|911|9106555|1000000 -3|1|979|9784706|1000000 -3|1|930|9306945|1000000 -3|1|976|9755178|1000000 -3|1|900|9006955|1000000 -3|1|1045|10449591|1000000 -3|1|1026|10251681|1000000 -3|1|974|9742712|1000000 -3|1|917|9171229|1000000 -3|1|1001|10009384|1000000 -3|1|911|9114430|1000000 -3|1|982|9814484|1000000 -3|1|898|8983345|1000000 -3|1|974|9743419|1000000 -3|1|924|9238430|1000000 -3|1|981|9804244|1000000 -3|1|898|8987352|1000000 -3|1|992|9920588|1000000 -3|1|942|9410120|1000000 -3|1|993|9938542|1000000 -3|1|919|9190353|1000000 -3|1|987|9866377|1000000 -3|1|930|9302129|1000000 -3|1|963|9631009|1000000 -3|1|905|9048294|1000000 -3|1|909|9087240|1000000 -3|1|787|7869615|1000000 -3|1|851|8513293|1000000 -3|1|789|7889173|1000000 -3|1|850|8501445|1000000 -3|1|828|8280087|1000000 -3|1|930|9295004|1000000 -3|1|852|8520853|1000000 -3|1|948|9483229|1000000 -3|1|852|8516103|1000000 -3|1|1018|10183932|1000000 -3|1|869|8691865|1000000 -3|1|860|8595725|1000000 -3|1|793|7928279|1000000 -3|1|858|8581694|1000000 -3|1|858|8585415|1000000 -3|1|1031|10304741|1000000 -3|1|986|9861706|1000000 -3|1|973|9729376|1000000 -3|1|920|9199603|1000000 -3|1|1057|10568590|1000000 -3|1|1080|10802615|1000000 -3|1|1025|10253514|1000000 -3|1|992|9911381|1000000 -3|1|1050|10506716|1000000 -3|1|951|9510232|1000000 -3|1|1021|10210978|1000000 -3|1|920|9193728|1000000 -3|1|1015|10152138|1000000 -3|1|967|9673604|1000000 -3|1|1050|10494338|1000000 -3|1|959|9587029|1000000 -3|1|1021|10215701|1000000 -3|1|945|9449413|1000000 -3|1|945|9449721|1000000 -3|1|795|7947455|1000000 -3|1|890|8899893|1000000 -3|1|844|8445315|1000000 -3|1|891|8903766|1000000 -3|1|917|9178504|1000000 -3|1|906|9059814|1000000 -3|1|798|7972638|1000000 -3|1|845|8451708|1000000 -3|1|788|7878431|1000000 -3|1|846|8467569|1000000 -3|1|786|7851717|1000000 -3|1|845|8457112|1000000 -3|1|790|7898620|1000000 -3|1|905|9047875|1000000 -3|1|908|9076984|1000000 -3|1|1360|13602071|1000000 -3|1|911|9113616|1000000 -3|1|980|9798557|1000000 -3|1|920|9198881|1000000 -3|1|966|9663308|1000000 -3|1|908|9079845|1000000 -3|1|1009|10089359|1000000 -3|1|923|9226517|1000000 -3|1|978|9776452|1000000 -3|1|915|9153633|1000000 -3|1|858|8576093|1000000 -3|1|815|8150439|1000000 -3|1|852|8519143|1000000 -3|1|784|7841402|1000000 -3|1|853|8530946|1000000 -4|1|483|4835531|1000000 -4|1|531|5306884|1000000 -4|1|490|4902179|1000000 -4|1|540|5396387|1000000 -4|1|490|4906409|1000000 -4|1|523|5228443|1000000 -4|1|487|4871142|1000000 -4|1|530|5300458|1000000 -4|1|529|5287021|1000000 -4|1|554|5542524|1000000 -4|1|484|4836087|1000000 -4|1|508|5080324|1000000 -4|1|480|4798597|1000000 -4|1|515|5153183|1000000 -4|1|489|4891993|1000000 -4|1|505|5044195|1000000 -4|1|500|5005189|1000000 -4|1|561|5603503|1000000 -4|1|546|5461488|1000000 -4|1|559|5595668|1000000 -4|1|538|5382356|1000000 -4|1|555|5546908|1000000 -4|1|551|5512089|1000000 -4|1|559|5582190|1000000 -4|1|551|5519124|1000000 -4|1|558|5575370|1000000 -4|1|543|5425974|1000000 -4|1|573|5730146|1000000 -4|1|542|5422328|1000000 -4|1|563|5627104|1000000 -4|1|541|5415422|1000000 -4|1|564|5642688|1000000 -4|1|538|5377115|1000000 -4|1|565|5651540|1000000 -4|1|539|5387318|1000000 -4|1|572|5718458|1000000 -4|1|541|5413817|1000000 -4|1|571|5704227|1000000 -4|1|536|5361061|1000000 -4|1|563|5635074|1000000 -4|1|539|5384644|1000000 -4|1|558|5584605|1000000 -4|1|540|5396464|1000000 -4|1|559|5593043|1000000 -4|1|534|5333963|1000000 -4|1|557|5577697|1000000 -4|1|538|5379234|1000000 -4|1|507|5071794|1000000 -4|1|491|4902940|1000000 -4|1|505|5052265|1000000 -4|1|497|4970806|1000000 -4|1|510|5101874|1000000 -4|1|504|5042470|1000000 -4|1|513|5126066|1000000 -4|1|536|5356427|1000000 -4|1|550|5498589|1000000 -4|1|504|5039890|1000000 -4|1|514|5143374|1000000 -4|1|487|4876102|1000000 -4|1|508|5074465|1000000 -4|1|491|4914693|1000000 -4|1|513|5130506|1000000 -4|1|492|4916211|1000000 -4|1|516|5160615|1000000 -4|1|483|4833194|1000000 -4|1|510|5091100|1000000 -4|1|488|4880596|1000000 -4|1|510|5106769|1000000 -4|1|482|4813416|1000000 -4|1|509|5097465|1000000 -4|1|485|4847649|1000000 -4|1|513|5124393|1000000 -4|1|525|5254807|1000000 -4|1|583|5825052|1000000 -4|1|574|5743914|1000000 -4|1|544|5444434|1000000 -4|1|541|5401538|1000000 -4|1|550|5504208|1000000 -4|1|627|6271674|1000000 -4|1|633|6324211|1000000 -4|1|531|5317509|1000000 -4|1|561|5604158|1000000 -4|1|491|4911207|1000000 -4|1|553|5530928|1000000 -4|1|499|4987019|1000000 -4|1|545|5448543|1000000 -4|1|596|5966522|1000000 -4|1|624|6236801|1000000 -4|1|660|6603834|1000000 -4|1|627|6266103|1000000 -4|1|533|5328909|1000000 -4|1|584|5845200|1000000 -4|1|525|5251847|1000000 -4|1|533|5327989|1000000 -4|1|481|4808144|1000000 -4|1|523|5225583|1000000 -4|1|469|4697758|1000000 -4|1|588|5875590|1000000 -4|1|503|5033889|1000000 -4|1|519|5191239|1000000 -4|2|515|5156935|1000000 -4|2|566|5659265|1000000 -4|2|520|5203539|1000000 -4|2|498|4980121|1000000 -4|2|481|4807668|1000000 -4|2|514|5140875|1000000 -4|2|480|4795324|1000000 -4|2|498|4983284|1000000 -4|2|491|4905563|1000000 -4|2|528|5278922|1000000 -4|2|496|4967465|1000000 -4|2|539|5389765|1000000 -4|2|490|4896876|1000000 -4|2|516|5158542|1000000 -4|2|561|5611559|1000000 -4|2|502|5023623|1000000 -4|2|479|4787247|1000000 -4|2|504|5040088|1000000 -4|2|477|4767852|1000000 -4|2|516|5155945|1000000 -4|2|492|4925260|1000000 -4|2|519|5187261|1000000 -4|2|552|5519359|1000000 -4|2|502|5020664|1000000 -4|2|494|4941461|1000000 -4|2|500|5004103|1000000 -4|2|477|4769491|1000000 -4|2|504|5034255|1000000 -4|2|485|4849182|1000000 -4|2|510|5104296|1000000 -4|2|506|5054447|1000000 -4|2|507|5076615|1000000 -4|2|476|4761847|1000000 -4|2|505|5045889|1000000 -4|2|475|4748321|1000000 -4|2|505|5052335|1000000 -4|2|490|4899885|1000000 -4|2|512|5124288|1000000 -4|2|493|4924711|1000000 -4|2|501|5006964|1000000 -4|2|489|4889083|1000000 -4|2|525|5252320|1000000 -4|2|474|4741192|1000000 -4|2|493|4928720|1000000 -4|2|482|4819461|1000000 -4|2|502|5024128|1000000 -4|2|484|4842306|1000000 -4|2|493|4921860|1000000 -4|2|475|4756575|1000000 -4|2|500|4997301|1000000 -4|2|515|5151007|1000000 -4|2|587|5864991|1000000 -4|2|517|5177546|1000000 -4|2|504|5036418|1000000 -4|2|483|4827039|1000000 -4|2|500|5008534|1000000 -4|2|486|4856242|1000000 -4|2|510|5102544|1000000 -4|2|498|4973887|1000000 -4|2|512|5123517|1000000 -4|2|504|5035533|1000000 -4|2|510|5105602|1000000 -4|2|504|5038067|1000000 -4|2|498|4984788|1000000 -4|2|490|4899796|1000000 -4|2|500|4996361|1000000 -4|2|505|5051642|1000000 -4|2|515|5147071|1000000 -4|2|541|5414960|1000000 -4|2|519|5183183|1000000 -4|2|484|4838753|1000000 -4|2|504|5044951|1000000 -4|2|511|5107806|1000000 -4|2|520|5201064|1000000 -4|2|494|4940912|1000000 -4|2|495|4949355|1000000 -4|2|500|4998528|1000000 -4|2|514|5144916|1000000 -4|2|490|4898725|1000000 -4|2|502|5020220|1000000 -4|2|505|5045230|1000000 -4|2|508|5081754|1000000 -4|2|480|4796760|1000000 -4|2|488|4883577|1000000 -4|2|508|5082045|1000000 -4|2|501|5009923|1000000 -4|2|490|4897567|1000000 -4|2|523|5227151|1000000 -4|2|483|4832563|1000000 -4|2|512|5115868|1000000 -4|2|505|5055350|1000000 -4|2|509|5086258|1000000 -4|2|475|4748505|1000000 -4|2|744|7448062|1000000 -4|2|487|4868121|1000000 -4|2|523|5231351|1000000 -4|2|525|5251037|1000000 -4|2|517|5165433|1000000 -4|2|476|4758016|1000000 -4|2|537|5370557|1000000 -5|1|870|8703205|1000000 -5|1|829|8295593|1000000 -5|1|845|8444012|1000000 -5|1|891|8916214|1000000 -5|1|1165|11647834|1000000 -5|1|1021|10210256|1000000 -5|1|958|9575625|1000000 -5|1|951|9511772|1000000 -5|1|902|9022252|1000000 -5|1|915|9149388|1000000 -5|1|874|8736285|1000000 -5|1|891|8908042|1000000 -5|1|919|9190553|1000000 -5|1|934|9346489|1000000 -5|1|863|8625503|1000000 -5|1|944|9441811|1000000 -5|1|804|8037824|1000000 -5|1|1115|11151823|1000000 -5|1|1262|12621406|1000000 -5|1|929|9288229|1000000 -5|1|781|7807092|1000000 -5|1|839|8390698|1000000 -5|1|836|8358503|1000000 -5|1|938|9381348|1000000 -5|1|800|8005972|1000000 -5|1|878|8781028|1000000 -5|1|805|8042157|1000000 -5|1|874|8746871|1000000 -5|1|834|8340769|1000000 -5|1|957|9567008|1000000 -5|1|1007|10068500|1000000 -5|1|876|8765447|1000000 -5|1|800|7995427|1000000 -5|1|894|8942675|1000000 -5|1|776|7756646|1000000 -5|1|898|8976171|1000000 -5|1|780|7801446|1000000 -5|1|859|8597681|1000000 -5|1|793|7929718|1000000 -5|1|973|9729965|1000000 -5|1|828|8278043|1000000 -5|1|896|8958811|1000000 -5|1|842|8419836|1000000 -5|1|900|8999093|1000000 -5|1|868|8683337|1000000 -5|1|927|9270043|1000000 -5|1|855|8546766|1000000 -5|1|995|9947363|1000000 -5|1|931|9317315|1000000 -5|1|974|9737587|1000000 -5|1|868|8679289|1000000 -5|1|993|9925689|1000000 -5|1|881|8814523|1000000 -5|1|899|8986936|1000000 -5|1|825|8249745|1000000 -5|1|1017|10168802|1000000 -5|1|857|8574630|1000000 -5|1|966|9662828|1000000 -5|1|843|8423362|1000000 -5|1|1348|13485863|1000000 -5|1|1014|10131278|1000000 -5|1|910|9108060|1000000 -5|1|870|8696195|1000000 -5|1|1004|10038147|1000000 -5|1|838|8381722|1000000 -5|1|943|9435498|1000000 -5|1|932|9319286|1000000 -5|1|897|8970383|1000000 -5|1|807|8065512|1000000 -5|1|1277|12772153|1000000 -5|1|1122|11214054|1000000 -5|1|1003|10034306|1000000 -5|1|995|9948299|1000000 -5|1|925|9247187|1000000 -5|1|858|8586313|1000000 -5|1|983|9827453|1000000 -5|1|825|8252433|1000000 -5|1|929|9292372|1000000 -5|1|785|7848971|1000000 -5|1|860|8598279|1000000 -5|1|800|7993300|1000000 -5|1|843|8434166|1000000 -5|1|771|7712424|1000000 -5|1|909|9090436|1000000 -5|1|859|8585875|1000000 -5|1|930|9304338|1000000 -5|1|873|8727873|1000000 -5|1|930|9296881|1000000 -5|1|803|8032559|1000000 -5|1|933|9326784|1000000 -5|1|970|9699083|1000000 -5|1|1176|11764044|1000000 -5|1|846|8456880|1000000 -5|1|1004|10044266|1000000 -5|1|811|8110867|1000000 -5|1|872|8715358|1000000 -5|1|804|8043067|1000000 -5|1|860|8595535|1000000 -5|1|813|8133154|1000000 -5|1|869|8687330|1000000 diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv deleted file mode 100644 index 8cc91ca..0000000 --- a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data-x86.csv +++ /dev/null @@ -1,401 +0,0 @@ -Version|Variant|Milliseconds|Ticks|ItemCount -3|1|1322|13229258|1000000 -3|1|1098|10979043|1000000 -3|1|866|8652941|1000000 -3|1|1092|10927575|1000000 -3|1|1136|11356440|1000000 -3|1|1156|11559534|1000000 -3|1|821|8212499|1000000 -3|1|926|9254134|1000000 -3|1|866|8662076|1000000 -3|1|894|8942806|1000000 -3|1|874|8734407|1000000 -3|1|843|8431769|1000000 -3|1|923|9233484|1000000 -3|1|837|8367977|1000000 -3|1|863|8628137|1000000 -3|1|837|8373452|1000000 -3|1|878|8774932|1000000 -3|1|832|8319989|1000000 -3|1|917|9170300|1000000 -3|1|878|8781368|1000000 -3|1|898|8980954|1000000 -3|1|847|8467667|1000000 -3|1|879|8798801|1000000 -3|1|841|8405782|1000000 -3|1|866|8661907|1000000 -3|1|1003|10025078|1000000 -3|1|841|8416504|1000000 -3|1|918|9180246|1000000 -3|1|843|8429581|1000000 -3|1|888|8881046|1000000 -3|1|870|8697643|1000000 -3|1|871|8705027|1000000 -3|1|826|8266466|1000000 -3|1|884|8831486|1000000 -3|1|816|8161718|1000000 -3|1|873|8730430|1000000 -3|1|847|8468454|1000000 -3|1|860|8605890|1000000 -3|1|878|8782500|1000000 -3|1|832|8316753|1000000 -3|1|865|8646997|1000000 -3|1|827|8268377|1000000 -3|1|882|8822722|1000000 -3|1|829|8287959|1000000 -3|1|902|9025742|1000000 -3|1|828|8276383|1000000 -3|1|897|8974989|1000000 -3|1|849|8486946|1000000 -3|1|892|8915728|1000000 -3|1|833|8337177|1000000 -3|1|987|9863283|1000000 -3|1|877|8767949|1000000 -3|1|905|9059579|1000000 -3|1|935|9349863|1000000 -3|1|883|8827813|1000000 -3|1|1094|10941752|1000000 -3|1|1013|10126353|1000000 -3|1|926|9261465|1000000 -3|1|849|8483558|1000000 -3|1|926|9260553|1000000 -3|1|881|8812004|1000000 -3|1|925|9255630|1000000 -3|1|895|8941686|1000000 -3|1|936|9364427|1000000 -3|1|836|8363489|1000000 -3|1|975|9751065|1000000 -3|1|877|8769985|1000000 -3|1|877|8766292|1000000 -3|1|901|9011836|1000000 -3|1|938|9376285|1000000 -3|1|915|9150575|1000000 -3|1|865|8653240|1000000 -3|1|917|9163523|1000000 -3|1|878|8781668|1000000 -3|1|1059|10595013|1000000 -3|1|1016|10159611|1000000 -3|1|943|9427546|1000000 -3|1|858|8584786|1000000 -3|1|865|8642225|1000000 -3|1|846|8460988|1000000 -3|1|856|8562996|1000000 -3|1|880|8797002|1000000 -3|1|821|8214208|1000000 -3|1|870|8694310|1000000 -3|1|828|8278414|1000000 -3|1|967|9674935|1000000 -3|1|964|9644143|1000000 -3|1|893|8925184|1000000 -3|1|822|8219131|1000000 -3|1|867|8669376|1000000 -3|1|823|8235633|1000000 -3|1|943|9421817|1000000 -3|1|858|8587036|1000000 -3|1|855|8547880|1000000 -3|1|945|9452449|1000000 -3|1|886|8856854|1000000 -3|1|923|9232883|1000000 -3|1|849|8487037|1000000 -3|1|936|9358396|1000000 -3|1|1043|10431491|1000000 -4|1|521|5218188|1000000 -4|1|516|5158510|1000000 -4|1|485|4846013|1000000 -4|1|515|5156427|1000000 -4|1|481|4804498|1000000 -4|1|516|5156948|1000000 -4|1|462|4629295|1000000 -4|1|502|5013110|1000000 -4|1|467|4671025|1000000 -4|1|505|5053299|1000000 -4|1|489|4891932|1000000 -4|1|510|5097664|1000000 -4|1|476|4753940|1000000 -4|1|508|5087941|1000000 -4|1|466|4656704|1000000 -4|1|508|5082452|1000000 -4|1|471|4710115|1000000 -4|1|509|5085329|1000000 -4|1|475|4755036|1000000 -4|1|522|5214048|1000000 -4|1|490|4903762|1000000 -4|1|530|5299205|1000000 -4|1|529|5285807|1000000 -4|1|595|5955185|1000000 -4|1|481|4804189|1000000 -4|1|581|5811381|1000000 -4|1|633|6334647|1000000 -4|1|591|5905282|1000000 -4|1|510|5103406|1000000 -4|1|517|5168725|1000000 -4|1|457|4574683|1000000 -4|1|515|5148525|1000000 -4|1|462|4621447|1000000 -4|1|502|5018372|1000000 -4|1|465|4652774|1000000 -4|1|495|4949022|1000000 -4|1|454|4536522|1000000 -4|1|497|4972755|1000000 -4|1|461|4603930|1000000 -4|1|497|4971083|1000000 -4|1|473|4734200|1000000 -4|1|530|5298091|1000000 -4|1|481|4812658|1000000 -4|1|497|4963351|1000000 -4|1|460|4601814|1000000 -4|1|501|5013371|1000000 -4|1|458|4576667|1000000 -4|1|501|5008568|1000000 -4|1|478|4780537|1000000 -4|1|508|5078397|1000000 -4|1|463|4630714|1000000 -4|1|497|4971791|1000000 -4|1|469|4690578|1000000 -4|1|492|4917963|1000000 -4|1|458|4587500|1000000 -4|1|528|5279887|1000000 -4|1|465|4642761|1000000 -4|1|503|5031706|1000000 -4|1|487|4872536|1000000 -4|1|517|5167085|1000000 -4|1|483|4836420|1000000 -4|1|503|5026729|1000000 -4|1|475|4746988|1000000 -4|1|503|5032560|1000000 -4|1|464|4634861|1000000 -4|1|507|5075472|1000000 -4|1|477|4768355|1000000 -4|1|512|5123320|1000000 -4|1|462|4615231|1000000 -4|1|505|5047623|1000000 -4|1|488|4885136|1000000 -4|1|502|5015020|1000000 -4|1|456|4566806|1000000 -4|1|506|5059428|1000000 -4|1|457|4570223|1000000 -4|1|514|5140422|1000000 -4|1|481|4810363|1000000 -4|1|550|5493294|1000000 -4|1|493|4938137|1000000 -4|1|507|5068797|1000000 -4|1|461|4605888|1000000 -4|1|512|5125107|1000000 -4|1|453|4521376|1000000 -4|1|536|5365260|1000000 -4|1|463|4626069|1000000 -4|1|517|5169587|1000000 -4|1|455|4553999|1000000 -4|1|527|5264352|1000000 -4|1|461|4613287|1000000 -4|1|553|5527992|1000000 -4|1|471|4709739|1000000 -4|1|514|5147753|1000000 -4|1|468|4673714|1000000 -4|1|499|4994982|1000000 -4|1|455|4544809|1000000 -4|1|512|5125932|1000000 -4|1|464|4640468|1000000 -4|1|507|5066717|1000000 -4|1|460|4598297|1000000 -4|1|502|5016350|1000000 -4|2|467|4675704|1000000 -4|2|507|5067748|1000000 -4|2|460|4599969|1000000 -4|2|505|5055030|1000000 -4|2|476|4752490|1000000 -4|2|505|5055965|1000000 -4|2|474|4735667|1000000 -4|2|503|5036788|1000000 -4|2|473|4726632|1000000 -4|2|510|5096441|1000000 -4|2|462|4627063|1000000 -4|2|506|5057115|1000000 -4|2|481|4804219|1000000 -4|2|506|5066829|1000000 -4|2|462|4613225|1000000 -4|2|513|5132972|1000000 -4|2|497|4967029|1000000 -4|2|499|4993614|1000000 -4|2|464|4643181|1000000 -4|2|504|5034926|1000000 -4|2|466|4662483|1000000 -4|2|505|5051321|1000000 -4|2|468|4675880|1000000 -4|2|507|5067997|1000000 -4|2|465|4659063|1000000 -4|2|505|5042914|1000000 -4|2|465|4648789|1000000 -4|2|512|5120830|1000000 -4|2|511|5115836|1000000 -4|2|583|5831906|1000000 -4|2|504|5034127|1000000 -4|2|517|5167282|1000000 -4|2|464|4640354|1000000 -4|2|545|5452304|1000000 -4|2|494|4942480|1000000 -4|2|533|5333811|1000000 -4|2|468|4676830|1000000 -4|2|506|5057162|1000000 -4|2|479|4789279|1000000 -4|2|518|5176956|1000000 -4|2|467|4673138|1000000 -4|2|523|5230750|1000000 -4|2|481|4806917|1000000 -4|2|515|5155908|1000000 -4|2|478|4773300|1000000 -4|2|512|5124691|1000000 -4|2|465|4652381|1000000 -4|2|513|5123986|1000000 -4|2|483|4831030|1000000 -4|2|515|5155913|1000000 -4|2|477|4762032|1000000 -4|2|516|5159749|1000000 -4|2|460|4602368|1000000 -4|2|507|5077278|1000000 -4|2|478|4775101|1000000 -4|2|511|5112009|1000000 -4|2|470|4701318|1000000 -4|2|521|5211893|1000000 -4|2|513|5129971|1000000 -4|2|527|5267399|1000000 -4|2|477|4772224|1000000 -4|2|509|5081238|1000000 -4|2|468|4686371|1000000 -4|2|506|5058789|1000000 -4|2|475|4752828|1000000 -4|2|506|5056419|1000000 -4|2|473|4726518|1000000 -4|2|516|5165411|1000000 -4|2|489|4891580|1000000 -4|2|516|5157791|1000000 -4|2|464|4637127|1000000 -4|2|506|5062248|1000000 -4|2|457|4567244|1000000 -4|2|516|5165428|1000000 -4|2|460|4592291|1000000 -4|2|520|5207665|1000000 -4|2|497|4963294|1000000 -4|2|529|5289937|1000000 -4|2|496|4967667|1000000 -4|2|566|5659985|1000000 -4|2|495|4948860|1000000 -4|2|517|5165739|1000000 -4|2|462|4624687|1000000 -4|2|509|5081876|1000000 -4|2|466|4664723|1000000 -4|2|510|5100132|1000000 -4|2|478|4780998|1000000 -4|2|532|5317222|1000000 -4|2|457|4568510|1000000 -4|2|501|5009054|1000000 -4|2|457|4575318|1000000 -4|2|510|5098275|1000000 -4|2|471|4713693|1000000 -4|2|520|5195624|1000000 -4|2|477|4772549|1000000 -4|2|508|5078598|1000000 -4|2|467|4667053|1000000 -4|2|512|5124828|1000000 -4|2|476|4759400|1000000 -4|2|507|5063549|1000000 -5|1|928|9282494|1000000 -5|1|969|9689715|1000000 -5|1|888|8879241|1000000 -5|1|944|9442322|1000000 -5|1|912|9123536|1000000 -5|1|1163|11624500|1000000 -5|1|1011|10116416|1000000 -5|1|1013|10123347|1000000 -5|1|1059|10597627|1000000 -5|1|968|9679468|1000000 -5|1|964|9636152|1000000 -5|1|1071|10711401|1000000 -5|1|880|8801006|1000000 -5|1|952|9515903|1000000 -5|1|894|8943786|1000000 -5|1|986|9860998|1000000 -5|1|1024|10239285|1000000 -5|1|1000|9999357|1000000 -5|1|921|9208665|1000000 -5|1|976|9756615|1000000 -5|1|1073|10732471|1000000 -5|1|959|9594141|1000000 -5|1|926|9251620|1000000 -5|1|946|9463539|1000000 -5|1|910|9105093|1000000 -5|1|995|9950793|1000000 -5|1|1070|10698720|1000000 -5|1|1004|10033036|1000000 -5|1|1028|10286016|1000000 -5|1|974|9737518|1000000 -5|1|879|8790374|1000000 -5|1|921|9213868|1000000 -5|1|902|9018512|1000000 -5|1|942|9416892|1000000 -5|1|894|8936499|1000000 -5|1|967|9674103|1000000 -5|1|916|9161499|1000000 -5|1|952|9514603|1000000 -5|1|898|8983671|1000000 -5|1|928|9279915|1000000 -5|1|882|8818612|1000000 -5|1|963|9629740|1000000 -5|1|880|8801669|1000000 -5|1|998|9980920|1000000 -5|1|945|9454051|1000000 -5|1|1035|10349925|1000000 -5|1|897|8960897|1000000 -5|1|928|9280812|1000000 -5|1|905|9055383|1000000 -5|1|950|9493343|1000000 -5|1|907|9074808|1000000 -5|1|955|9547697|1000000 -5|1|954|9544908|1000000 -5|1|975|9751194|1000000 -5|1|937|9364555|1000000 -5|1|1044|10441659|1000000 -5|1|928|9275709|1000000 -5|1|930|9306847|1000000 -5|1|883|8824859|1000000 -5|1|935|9357168|1000000 -5|1|868|8676843|1000000 -5|1|923|9232610|1000000 -5|1|920|9199618|1000000 -5|1|948|9477288|1000000 -5|1|915|9151384|1000000 -5|1|939|9382998|1000000 -5|1|877|8770472|1000000 -5|1|943|9436157|1000000 -5|1|913|9124004|1000000 -5|1|944|9442777|1000000 -5|1|923|9232767|1000000 -5|1|967|9672167|1000000 -5|1|917|9169196|1000000 -5|1|1013|10131141|1000000 -5|1|995|9942936|1000000 -5|1|1066|10659196|1000000 -5|1|936|9363548|1000000 -5|1|955|9548006|1000000 -5|1|895|8949452|1000000 -5|1|946|9462609|1000000 -5|1|914|9136059|1000000 -5|1|922|9222865|1000000 -5|1|887|8870598|1000000 -5|1|924|9245239|1000000 -5|1|883|8822878|1000000 -5|1|951|9514644|1000000 -5|1|927|9272521|1000000 -5|1|942|9410642|1000000 -5|1|889|8894084|1000000 -5|1|950|9496213|1000000 -5|1|900|9001600|1000000 -5|1|940|9404610|1000000 -5|1|894|8935771|1000000 -5|1|925|9256862|1000000 -5|1|875|8744179|1000000 -5|1|919|9193606|1000000 -5|1|1230|12300197|1000000 -5|1|1044|10434687|1000000 -5|1|908|9088032|1000000 -5|1|940|9395282|1000000 diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx b/contrib/DaanV2.UUID.Net-master/Documentation/Data/Data.xlsx deleted file mode 100644 index c468257006e3fb2b578dacdc23c24be42891561e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115428 zcmeFYbzdCMwl9pk6Wk@iCAeE~5?q2yAh_$`?(PuW9fG_25C|STxV!spetSQkyU%mZ zJ2-d#sQym(s#R61mR8Rw%0a`tgMfoTfPjFYfY`E4y`6-FfVcy`VnZN6X@9b{aWb)S z(pLr9nKe{wTt7Ad`4$Q?Ilic52sy26 zs++H%=h$K8+hK<^j(4s3QLAYb+A}A&;(hzp30{W?*;ljua*cr5;L6ly_Mrlbren%x zvR2qt_@KI?mpTJ$kl$u-KTe45Z#aZu= zD8*Q{!o`1{OBL(gmvLtiiY0&iv+tWdd`EWw5f4zj&V zhyi?h8hg27eq+WVNT-4Sb(s`T^ z^D8!4_S%S49tm{2z=VQKE`c;eQ4%Dv2LbLB#kRb-VwXxmorx1POAEXwwY>s+w;cNo z7j1#mUQEXm`lN=E!1lYdU*LPk8VbTtZRKdJi>c+SkP@wm`C@$)k>6xRiph6~Pq3~A z7^`=oG-kt4V@oE|()gg2$sVB#^(5_8uLo6Yn|$;{MzVD`=%wEDNoR7(P?XJD6BGvM|53 z|IY*bFE;!CSb9bL7ll4nl;Bh8r;y>>*_BufF*#RJ={5>gZ(o^Z^oFQ>YNC}c8e$Ap z!T@L~pAPS*(WMoEsDojOn+=YN2&{MfRE@5c!6^^+&hYdf9FisNE7tolU1qOmZ_=b> zL9{L%G4$olCAo4VYgCfc=i)yxCYUt{5wQ!2gK-7Z{ImwYXs#OFRYA^*sT@}Z*EDhG z93)Kq@R?68+D8=*<^6m#m4-9yXk@xjO2YYPQJgi{7l`I5zvZEC`gqj{D6=*$RTffJ%sCi zKT#jIvRc$vkd2x$ZLBW96;G4UY`4uaxbJyBv*>ik{_D%;6WF0saIDC2zW)oKOhk3L zAwchu1v`eeF6yy`_%V$Jku8Ep5B-W z&)xC|4KnStaQXGpl5N+GZD}hs!pm_iyYOJA4N}e%jpEfm9$8)*AnU~CL9opE>aVuq zofYxuyejj1)7Il=VY+xvT)YuOE{5g$`^NK^{dbxTUOeN=ffdi(_utZX!oYq%u&Sz0 zOa+bxxFgD&@#mB8jhj|ab+e1RCM+~SHy&(G&N{CLA4a?~Xy%8^mH0JRb#6D^ZYGaB z@9Y-WTBO4di$R^~t0$9`o!%cWH|AB^`~2wB97smu6H*!7#ZHR5uX`cXX|JFibsjOVef+$9SoKo%OC9rU3D|CnR+7p!?yA9` zdSH)IqTf$W?;g1Hgu6De9-cgJeX_H=+<&D^bUC%%^3QkSO*FA&*=leK;p|K$j>pHL z7c*QARN4-ByQiWI+3OuGS4QJ(I&sK8`Q>-sUa`F{EUvK$-u88xx8J?KR{yNg3m8oA z{K-nYkgU^<$Frx>8o*`#6OL8RzY-KgVJ9r!{>EMj5_V-v30Cb&$j zyY$zOtSew@bN2@AcLq@xwBeIZ)*P4H-XTAuZZ?0csAE;5@qt_s_d3cM7HZF78~H)Nz>=cQzH9 zcv#X}zX37Z(l%Q!FI%~JDRYm*Ll1@-;JSP0q0uTNyTq@*#-9sZ)2dG^oV*en+4a}b z6v+yYm*-ve-k!HqpSF8?ap=!tljf}O4O`l!j$g_v8M#)P z;i#}xno)ggI52D{Z`4HFCBmjf+9g0L00R9RWdtky@Ww3s()SQLRb=EP4h$)jS6}+| zbfT$Rkk}lbRB2HaCC04P?B9sinlM-@kqf7Ua1;V799_!qH~+d;*k1b9{0Aam1@65yz%c)TJVVL#=+xI6 zxach9a|3lt>m^zD3PLSmuz&xRv4jbb4{w%ag_O`Ra>rJ58c@0Zkh3TI*%m6iYWV6u zpc|c*z&ipb*IvMmYM-vbgTD=O}% zR-Wlkxc*R3B11F(MOq14q3VY$#jn5i%34(T%b1}w0U1Ghh3wx@K9&OG2VWG~2ea?b z7k^oaBb5Eoe>JGMC|-1H%l386Fl;|6w?6E1%%#LJ3m@GSVNXs1Wff**VLLGUZ*;Z? zggtL+BSj+tYwx7|{{!c;DR*$0?@$jXWt4uB{wL^D`mFTPGay|VtB;$94k{F;fc#{6FhxJ4cv3=!YorhE7{ z-MRd@JfpY4=71>}zD*(czW}%54cCH=`!ClbtCd%RrNBryfCwgQ01^BHM1TQsfB`1| z3&8AWaB)08>I(dYTlvmB$zW0z)0G*3KihD+dS>&ID3v-S7$geZBhvc!Lm1K6RR?6-?3s)h@fLTDTCRv3OsXoW3}dXP;zX zfBQCmbatz(2!jN)eZ8_OhSa}7jTnOjzh_QT-cG)<2T4;^_-slaYD2HSkTvN}K6*(kxBTza4&3gNShV@Z z)D8{Y!jJ<>)tR}tb{k{!~NHuVwWe{l^#Fr%-r1QRUM2PcL zT}{9H%@8j_)Ib?mH%TAQN>oT0S35};PfnCX8TWINHXeg0h%&Bbk|uuKDPNu%%Vi*& z)t@cSX^~i$67!GJ`*?YWd>Lve{%~=uZ~0QxY+M%NCIm#Vlwm))J@caa{}2hyOBx-O z3E9DSP=w7+l3;0)Y`+0w01QwdR!tINtrIr90YU&2z5xQP_0}o$TrquVO6Qp%ab+oO z03^Nv4QYQ%)gbX^NfiLRdjkppm6d-7|6~FYkw~a$mUpubd_RU%k49=f?&zSxp!S2to)1NFZPRS6%m?S?m8-<3R$aJOJ(g?oWH-gauIJ44wvb z1WbC_$J^)aj=6Z<71mf^8EdZX#!ggqaOl|RN%E#OVSj#{U|;r%zAgyr`x2f zh9X14b(>tY#`j_8;%VIMC@G_o$w*NgdTeIK9agV_|7g!*U6AIy{HuM^=wGfscv7V22;83x?H|X``{$_tg zSV+L(lwu&VAEbr_cSSuTS0UZp#ZoRsQBZ{YSx%L*~!;zs0R9vHu0xtYj+Vl z#rE34+lzM&$t>qwK33OFVjo_2*SpS}qS3=VlF)(Y>sR$?DPCHK zKD+c}8(rsp+vcPx&g>jl^iL6YK1WMS)wVu&Czr)Oo!z4jAI=}Oo8&|0{|>%NoGa|_ zybvVhMzXNh2zxhs-X5T*j`8O{Z%Y%6*KsgK@fEU-R~Uxi|U4?31DQ>Nep1aItzCXj`P=`qUP-dc$cK|Jq^EVP7QtrP?R_ zb4ZHt^7!Wo|Lh8swvo-zj8e8fv(hovR^1!1G<(mbA`pXmf?eLIQ+)zkz)MZi>v`Xe z(}IHgkA~H~+n3)LYy9?eRyCe7Mqm#eO=LB7e5NEE$=jAcA8gD$36r)FY04O->Jl4- ze_fhe+h}QCc_`s_>SyrCtl#UO8*7gDldU#Yt7;n7tE%Jc-WvII6`q4qk;~hV|J_e0 z6ZMeI%w+OZLi5CfMqXKcHBVu*x96t0R=uo(Rg0b>@dZNONvuz+5xg@rbOkA_|~Q9!1Kx8w?j@h|(XbT&@emR!h!b@R)NjXZrNu zwOE%7xv?e4@XCt`((8LVLuy|pc~OX znU%Pm@q%VL4a?^9r0A||uo0XTK@i;3p_)3jc7qzCcmrzxmeO4kawJcGWiMejoYqysVfx0X{w(RR7NbXy5QHEFX zwUxPiUb{fu-`(wn?G5zhp%lZydRC9@nTyYXG@s4UufV1m?zSUPw{!e zuu_O8GLz=E52&WaZ#hnmz(-z8k^9LAV77|FYzlErGn2C1le21gs-7xwV(*C+y{z(- zlI;{!U1s6$DuwpN`rp5eB*KfPqW3z_duaVSy=7!5-rYYdkSzzjJSL>jhGN0WdG={Na>iwUv$mL|op$_mK(n=g#)dxIf%%kI9?DA9@8+ zIu~_Am+Q{@!z(#Se8$O_7XMPq3QN{=xbVKDezA@+eKxu2EOig%c_9*?Nmh4!5|q<6 zCqfzyA&Y;%i4s5MFCG@uQ0~n8Lgo5o^7YsvesB$$`})IW+*oSS)M2yKcTbIS)4SVB z=XY)=a~I25?cyP0O-jy(4o^z8g~@{?K50?kYR?SW4b$PB-_2k>zkp>!7X*ZP1Bi{r zV`+=yB8fNuY~Ow3QX>TT-w4qchHVNPP0RwDdVb4jT^MCr_;Xv+^(j-F7qXs+?)4}5 ze8{SdZ$&-M)lCn5;GuEMG`!+2rq5<|-P}z6(~)qjsen1gpEs=3%Tl!9VTv0X%ljl3vTpxbmjV({+4ESD@A<+7N8_=w5T2)nGkdz78=aLji?U1T z9z2xva}i3_Fz>K3dwok8P`a(k=t<#*k2;**+oaj0CD)o!ihojzdU};7RNJFjIA2p> z%Sf7@-}rWQhyO)rvRp$~D9)}!zTD!n^ydCI$Me87a;sj+v5qq3KwN3o?%Ft3rrPZG zmcsG~APNP|1+TQ2`d6Nk842UT+fv(KCmts^JEYXIKiVeK*_?UrQ@`Mmxn7vuc&j}o za$M@rF#enxNvVz;(3m*UpLl$y9e(YdMXm(CO>fQcd{a*O&aqV%6KGY+v89r9tROSm z%DK6Kt)~|FaJtI4m0PU$g#_|1GuvDL>@mQ%O6v&AP#Y8c4o8lHP`143R%aX)wjg?| zWeI!<73P3FXk+YA#LPlgS2{(_;PZ01Hhko)vgDK6Wi$WGm)Kx`KdPwp3#<=5&Q1gg zy2_aw{H3;-i~DyExAK^=xhSPH)~Ld7E_ivl_30^Hf(;(|0x$324cXxNs+pg(V90w;HnP-R|sG(prh~>9{!T)I8 zHu%Vz4&0vRYh~3U5H!s63!ACXT48`!B$>uEcIk{+KCfu1_31h7@sX{9k!fsokd1)h zQncA%m+42PrQq`mU|O5GYUv@88KTNs6q7CQJHU_GEw_OGP}|rl55`H0NkxB6G%;di z+l;6^d2S+77jS(XL&19g$TmLKQXQ8)1Zl7_SEig!{RrNg|FUBXc3V&tAV{+>oK1K} zmT7hOPC{J+$IcjEU61Kz34fpNi12t}^I)mwTxK(zO46es^w7wUdu>NqSe@P5S|e8y z;$$pz2EDM~0=B)No{EZ1e;Ov|sZX{Vnm{3?8C)&wdj9}; zjflqwHX==)hM}Q?XWyHh($5OTr%%1KNE=yZbV#u0kZ9fuKYF|3yhu9eg5K>$b%3k0 zTl87_Mx&`^suw3sgfjLF+vtaK=UO+r>W}vpQG$5_oZxW(QPW=&%RhhsQpW1hMo%V( z0Pd{FS5~WZU3)DWjkj!^vWHt3a=KWy9G}}wA}9tY zZIb;rwzX}iv~Zoa)(K0^=HQBq6RWb`nOu%Y8(0*Bdf^|kq%8ji?DV(jnnE#JN%ftF58 zDOOU}Zhdlpgxr zjwW%D@Y17=F2LVT*m4|X=SyJ0f=*m&n%%>uZcJv(Qq>LaRXfKdlRE77s31+Y z${qHC%<#1YlYFYI^`*UjIW{HjydOR3*w%GwxkYw8HTep{n+($*t#^9*TdVUkXVlm` zZ|b;wvZSlR__1tdBFN*kkd-)$`P6%TwF8CWSzOplMLmfwe|$;G#gl37;s(J-`fBrD zGZ^ODYHwGVI50S`)$=jv@rJG99Ztv9luy?HI`gJ~7R9#XY`e#+`8F}J;|+HB_Ylf2 zH@lxEBN7kAbgbu@Pf6<*ir)7XE*iUOSbq*>4z$BeoKk|eA6GCZMy3*`6@{aDdA0{R0^8) z^h(jQCi#)&F)-&ZU0GRiNy)) zcBCCGz+0x1Y;YI%j?H0~N*y01E6*#;xbXY&Khn0QuHrWy5{**_1XjZruTD06?N+Z#kKawBVz#!XgRYXU?j4B&^&2AkA z@q=ts%fwg`brd_vnL5CtYi5vu`VuODfT{I-NZPtWR|)DZe$tA5$1apv6B5^vt3F}Y zw|AY#?vgRDw|y<)kWPHU%wKME89;bbj&Cq&9i)8J&yI?K%`j_sxKN0HGUo_lNe(tW zkRL~o%LARvNy5R&=Xs{%SHf6oMEWkMnhQwAF8pxEXT_@dWm6`n6dF8b7Dz6;lojsH zKjpLDqAh!gLatQHk>6x`jD*JuB$e~9#y9GEaP20&Y^4?n7^sDlb`*5hHhR@p%hrXt zOK3pU)AZ2NX!f0tES+*Q1cJX$-5Dd+x__%k+AT(2E(akabz$zv<6Xd*^?g>=t_=ff zll7eCC0$bk!&e{y;2>ojwtB{p{E&03(jlRFcy+G72rv3bfig}`0^=5hh}CdGYPq(V zDex5n8`p5;OixI_MJ^CF#WQKjBG>U)P@(Y)IRK+LMvFqlg`~} zpmY3(&_4fPlv*#|FbA9Qvyp#wm}}9~vaGgD6Q_x?>R)gjmEgyJyvg%hmP&3DR-@;7J(~QcCCZ|snY!sIRKWOC z8REZa`kMY()<3g^Ph=cT5D|iaRYWnd;PM`tP*~hZP_Fyy_C)bsabiVziB%AXGSe%n zv+1#Asms1eKX?*fiCzu~axb;H%qDO+@~|xH)K=KzxMk@BF11A#gs#o&;EFeaI+|8$ zRB@p=M7LEVvq`gRI?5sG zkTm`>_c2(09M16owR- zR9~c6+qQ~^Nd>YT!c|?rH+p%Gf76FRv1yb22=krIIr)SM?Vx~#84SuZu{^o{eoZ;CfSXO&T$ zkK~7k28!>(OurindEM<#&zcXIgA93Xd6yEQ!C|vTzR!p$1`5J3;2<{XLkB0UZL?{y z&i!ym7gFfq8n&OT+MF3H#xI>!^O}OV_-W_ZIi%1PyUsFVP7@stRzP%ZWof3i^XHrLLk6<4j+JOqIZ6O@V`G*)VVCZ2hFA_$~ zIfm6t<|OrUh&vXhLO}r5GXaxuaO|y z!cXrPEH2o#V9k4)bol(*8L3&2M;V0H^J6j2A~J2_Y{+&Z{KYWnn^+?^v@LZhLwwwL zBYvdzP?(x`C^8ZCQ9*mrnhBuTS*4~8*k2nBAB(gcnG8TkoAt(MY2~PMHC+DU3s&5| z*I=}D5Nn{Mt)IN6W4U_{B6%M8xjve3uf1P6z_Mel^_xs713oM}w_WQqtMK}9$0m9o z`o)FTC^S5c>WN`ZjUBTWgnsHtVnNc7985FG(JsSv_XXv)!-^^{n{uUzHUl=J!b!5- zLIoy|)xiXXUtUvVEQC_Z`M)e4^ z@8nf{x$zf~H-cCCw{$FSPgA!#Yx0$w~BWpNwKf6(>c8ubbCSO>HLP5+;>mR?O zTYwS+h%svfXjJQB;hQ^!wqeQi7-Ha&qB~4LVGfzI3}xs1a-atPo^Q!gyrCBv+nIrU z(CoSozMZU@r`7_W@r_^ddhb3HOm1tyA;npgR;V+6%^HN4R~w~RAj-<-gX+f5eX`r{ zd+v3r5+G&fx$*9F$GH+AfV*yWE6^G(4??MFx@`MRornI!P)vU?1c4$W-2R@Fd+Gt# zG8FpCXxlL0+o>xbDpVSsNREncuvkN)1~Q2O2%Q+a;e^6cNDu_uTTK_ z-PggC3)0bF&qmei1_I^UF}Kp3i9_~Yg@f?hndq8RRM>Y*XtEe(`#C6?zq@<-=118n z5o>PgwN&ww={A)qheSZL(!DB`(ng@(Fz+WraI&Mc2dM!PxvDnED=zTwt;IG$oOp(Q zYgg5CcNt_CjiYKbHdjF#YY)l9B8uzr>qu^c}UX z5u6G6U}RVdv;LA6p)7Vc*I1JW^Qlz^6>X%~U-8#h9Fcb2QT7dZWa6)brfS-Qr8wi- z8lx-VDX{`A+__M)Mdq5<?nI)Fpqvmv!F3j`}@jvtsn|dOD1(Ud-ROL z>k`O$X>wI|y<-?8TonCE0V?m<`v`vnd@PgT>Qcqc!>>KWhuoT^S!m{2h1YkGc6}IS zUdcBD=>8ZLNv8eiY-A4abU8j1F?LU?fYt9{?`J=BY88z1V2730i) zg*{VQ`)JsYj$2j}$ueJS3w|~_U0WY~$;(2CP(4g78A2~fYfw%n*5aX?Kz2s>6#2It zT^s+nTfl+ychKgO1m_#8YRA6qFq5~)@6~n$>^lwRL-`U+DW%5o?dH0&S9!42x5h|<+d=c5)+f7Pp?5R29 z7e^-otypZ0UA*tr7*+@Uv-yA;mel<6k9v7pn6I7+wcjqMk0LLVFx4Y`_}fw%L*%W z)+K6`%Nex!bYECt!twCrI^6oU>|U$U!pMC+1xW@{T;g35-o?@$vQ=&q6~|f7RqN%_ zt~P#`XOsFc4xU3!8k;Xugg|JvTp+|jg3fS@JuhVZ`?nh*Lq}POB4V?9&~ey13y+>|;_C8&5~T-yF45~uOxSfuALc2uTn11H3mA=$OW;(X34ps(j5Ls15# zE?b6P>xLmpp%;XrcAOjRkDZS>Gw6VW7Sy?tx z+mEx&;`-u6@Qu4SL_$(8Z-^BLa zsIvXqvp9hipQBMGSp&hDS@p(`cGLV@-)dxd$e5|ARixB%#C=(#wuCa8vgZ!_dv=Xn{k`kPh+ITTNy|?8JQe_3QL9oXYFQm9Sd;nxcWVAx5 zafu42(wV>7y~~cEw`oBI50}Hu?qV_hZYExH~YY8m>;0mURP-dW_pOY#^;6bcSKp^8!jTH#dZ=1rHUXz6*!^Pex?Sz z!vR~)^9cAX5$OGfb&_sLPo8(Z74uE`7b#1EECluFmQ5HfxLgv8IFa`hblet|@y1v6 zvhXq&y@yJwYxz5g`u}(*-V?>5XPo45;UHJybKPCh>VDOwr+z9lOFBuyc&4T#d zeAvxugaqA7Ktl1;R^%QOSG$ph)Um5(NlYBnLgUfPOI%AMU(%R8ud#`7_PxU@DphQ! z&r*3bArVsr=rMe=4jg-L5cTph z3z{qW`GLdz6E~y6-FZQAvDRq7N``IL&nfDEZE#yjMY}H97W+lXU@d2BiLub%{ZT;{ z6*vLUQpRen^1m44<`ewYT8mG^ywu=6ZP?*~BB!>}_D+OPHR%o81en2N8VVk)OZ)NQohc52`(Kgqg%r!( zBc6~WaApww_+;k`Eu`rjJ$o4j8<}pp1$P2{f8?QZYvoTQDAchEi(wxdM3ZJ=xR3%i zmKh2YlfWlm`I9gbm=;Zji4v({&&D4zM-Vf@u&9BK^@RL(?Yl=WQ!5pEes)FzzlRaV zwwav?a1fwBxX0SV!bGin&V!|1{NUiAo)3%mF4MKnF)91Rnqzg?;|F#b3DcFR1T<=D z8wuQ3r}S!l4oez8I;{3F zKj2*welAI-!^|ErRZhNxt?AZ-K|Z{w6R`6}Flh=;jh{tXOWlRbhbKjmmR8{!o9y@Y z+MB*$KMJ@}&>Gbe%rr-&@>X{=~JxOT7 zN)=H(QO>e&>J^D2H72&5PA1hU%8{>Rqfo=&?`|-%H0>t3xG3nM&?bcn4p1Ceox`I+ zXs&DIrjif6y!LQOW6RyIM_Df?pMr+>lTT}cU#;6DzR=_oEpZ8IK$mjIFf#+vDkET@ zUoq+Mawrm0;(vZE_mU$#zmGWm;JtmiAtV_4`WNWp9%x2eQOP2UQS-f$l}a}B631aa zmhMl$wV`4Z7EixpVPdhJn;|2MH1xrdf-z zzb)!6O^!0@usRui6iaZqi|6KKb{xLD%@-(pdmKJ0yB1q8zxy?F6Z%ghuP~*2gpM3( zj(;LS@5bKpvZ&VOcA<+9DjEh~M3R0;i;1w?Zb_$O2qP$?oe~X~9kZ+2RoR~OSPbz( z6XT?a3lSnW=gv$npn7m5up7A7UUyl>Dz+Y+J_7>JWIHjkVoy@@}9-*Oy6n zT0w-xIzCoPqLue6n?Skg$LLXy zu2{$6(Mz$0n9$DA0CEvv4sV2NRiD$&6(tEIRO5;!|6En7F#}1#1Wq5iqJesoG}+M= zdFpRj5ZswlMht&nAr+&3^HRTtZeyvD0({lny}K9T#238^?ZAA6h>PxZ#u?r%_&<&l zrSyM(YnezMkze9e{kE1)wEuwkiyqGTZccpxl5MyNgaHFFv1Z}kEVTY*GG8%h^uawI zhCr))tb}{m6DlE=t{iFbdlSpODkM_L}0T>5es}aCpYH6op()8cA<|Wa&G06-d zs%@F;OjZy>p1}8H$KZ3q`CvAX<$bj#(H&GVO9I|C zb}&`s4JZ{~rtJ@yNx}is2rv)>WF04((N(^sl$X;eRPrQ+;{kY@QZpRZ4@VF=KP4JD zSyY$i{D;}#v$Mhz$AoZ+L^d=5Wazwg_Lq(su$kg50Gf;frK9NBh{w2Jvht#EX_A7wqOalKlue;8#W+>Sy>ey($R*2X3E~RmvNZ-%uqv-{ zd70ciE$1P=s2LxeS-%%I>na)iS?bvRH^{=q+SlTQ7Y~LT&~h`G`1@uv9X`9XS_5e2 zi6D9*&PB{Jx>zW|cx&s7Ps*fvBD^>IU+H3nDlBfZ@R>{{e9cWjrLj4QDYT(5s(XsC z6+mjJ64rCsv;h)1`CEA1#{^d{iikh1n{3KKOHeZFMknk>ZM+~kig1U#jjZ8U4n04e z%{(!A3_c{2TDyya!)k7`WyP78W)|6hMyo|nPjT=kzHQ5H9DnhX%qh7 zv7xS8jDG2kQE$<)90fr=zBXgY66UaA_fwDQ_8`atO~(s0W+d07;JH(9x8^&L!GCXU zMt^k2n6UsHGeq1y%p9|lWIJuS!oCGWFJy%T2)$?VElaUG6KgAFk+hQAK##oon0su!EW1zwH%g06$?w6(dPNH`n0ho#z?$KqKVN%$%}s_mp6Z zW|)ay@?$f!WWH(dk5PXIJzFaPk(VI~DZ{k%H#X5VEkltBO!Np*yYhCnlGcCk*3f2W zkM{01t4Uc8b&lE7k^y~kv89EejjfjjobEhK!)woS?yt$oc?ou{%u$$ z=q?2plD;C9wAEo126n@v+T^M>#vd=>zLAME{uocf8*I2JSSf8E3^yU716NgFNR<@| z5T+Ffp4w^7(k8>c$Ue(}{@S&VW;fj#O&ro&L}I=?w2!@D4K-XCJt?iOMe37#rq4iU z-byzlN<|RLfOcJLU6nIXpRBiGbG5>Dexfrkec4TZ8^;*K0LX|flBBopn19MkB5Yst++E8SRyUAM?7&1spa=trg2bbp>s>=^LI4{Nt-!>D=l4yb=Yq?R9Q)s)%X5l57dJ)#t(IR)$z6N{}V*O5| zx}>%r&iZ@9=&K(7JaD9kw83t#735&RV6Ktr0-W$V89aDg4vj*o1P?7|Kg;X1)-Jlv+~;~CYIiBDPN$P z?grSZma6CzfFeCcFJxFVDROW&#_sL3iltXS!Gh#PH^(P=OXo4_17#Qku$u4w1|PraUlkl$|KgHLe?d+cGQWr zJ)32Pw6<7m{g~+<@TvAqi1ZVG;7g8+9Kpz&S|GNr&wPdpNG3~u{z`iKk*eUgqXo7R znjF>Sc%&x=Z-DhZ4O4+@!Cb7!(>Q}s$iECy-)w0hs$oReb0Xo(L9Xu?ZdCYTGe9?C}>q*roOmRfAB zA806I3B59Dr$*iTRgI0qL8}SpbS5bbG8Z_jk-|S?mltmJVj0#BW6e-(v0okCy%x3X zyZy*G5z0#G>w?G%2OO&W)#`)IDUb!tA_PExD;A9LaA`<|D)pd|#Gb;}HP@92ge*G# zqu9hVt`9!MIY(ZW(dBlAW>H4f-c zL?jJT(xCup%5#elg7uZfnTi@fOsz+&e;06p1=RtUPl1b+`Z*l5vocsdzlFsFBO+ zTL*b(LdznFSXP7YR~PqXI&(BGyJ4DhBSa-S)368T1;@ittYI@m=;lN1Ipol@k?R^2Glhfnk>I z)rhdmOh6pCz=0#N)#LAG=#S|LMc>F&8-K_{dl6_HgkR38@P|zY`^;P*mUt8p9$e^H zYcHiM9K*aMJ!N1Y*tO#`ee+UW$cIcK0eqZTrI;`aZWjcsYpbe59a0hysCDBV1w$mO zvU~=z0sCM34vh=a*s>7Oh20Rg>+()(5xM@U1V2CN9u_JWL-#6~4)4h8d5dzD0Nlviy>HK5!hdtHYtw zJvV(^hHQ&7HZoFhqC}?u-eeXsnI_{5x3Mz@vve*?qgtlo*aAPKT_~ekzGUZq5gsH+ z7&~vTa|-&XN4o|N*C!Vafiq50uNKpLD{C7;9dmzUQ!26PLk!g&>d-F;>FoM0B2y{H zS+pGuK)vRflVv$ZNV!_c8mI1B`^-{ZBaJ)#W~+!Kk0MnoPA3`oO5!jr%#hr`;cAm;*{06oJ6;tYA3)_&t_G z0_Cvw`O&yo=5ZzZg*yj%^=5Nz6Hk|?=0!5kaS5o@6!3$JX}ek@DH*20N!;fQQ~A z#Ql|G2D}C!R7{(pUGBhl{>7}!^WNcFtl_wl#Tx^{BFQM;-r5#R zxI{zYoTEa6d-Q#1p(;T!k`tgO$Cb|qr9Bj`(;(o@O>MU7SG~1LMCd*DMElBi{P&3| z>zjC&eBW4DI@_cGjg7j?%_P`ST!7C;6Kin%;3YDj59#!#fg3BK7jz~4h^Hcz{TF3| zUx3+YeOM=57 z;PBT=@C%eqB|1v}2h81ac#*-+qEqUHd{lN^3Ox3y2cDMxoI01bwUxgx@>g0ABX_HU zESx?fzH4Y~a3c~sb%^tKVO;s36x29)j~MaFW!h}703{~)`@b<|Mfy;zccArLQ3 zW!Sb`_YS{c(*IZ@gfAKw{KDw+cWn#X*$@Bt#RHx zJ+Sue$dWjmZ`XgRL4BMeyF{;KCu|Y^J8JbTa40D;?CEgJr;Xnv}+{(J`_3I?wdA5p(L$BX+ zB|}7Du1HI8gc<^lzl7N#*eMf!_B|sIQ3;Hr zy?PR%vm}LXhGWRj-snR4QXd_;`kF+rT6_zOjr41(Ay5Yt7}9@@Zj*R*=$zNT8<^h#ig5uYoDG1mqQtb ztj$>()+gK7u!h=)ibw7>pg#~!m=m<6VSehr-=YoWM7q-6C-lL2;FCVLmV%5DyHK*j zE&H0~WgiIX1;nYw8n;VPmI-`A^7#THz4G7l>rD&v9)G!nLptT@q2Uo`QFn#j(Pk)>6>~0!8&PP!-v(NMv7p56d4oN-G6pJjkZrs z>Rs;yAO2ocuoJ7!VxI{39g)HkIEzrkKk#GBD z7fu)dhpxK}t14<61WZXvOE)OpCEcY+cXxMl=#ow;sY6LfH%JT84bswaq~p*z8{hYv znIAJhx!Aqdepc-D+$X0hC-x{xGD<`>q_s>`;Ts5%80 z47K6%PPBurN~zaJUM4SJGJsDj!Zjj%ijFH$cynt5S%niXU<@K7`2<3y{l%uv)z?|7{ zSBZB!IxNQi-9VW2dkM4Oo|LZ`#6eM<`tDtpcsBxmddu@m!{vP#-doRb`K~k>sVIB@ zbNp1R)r$D+tJ}Kt55>OQRyyQIro;R#p3kI6o#XMRI;HhU^GII8#Lhq?T>i-xA0uKr zfuhs*@;Kr|$eZwxMb%O$An({$W1|X~J=0EQRnqm~qen4qFv@{Hc2gSa4{Ga=N%*r7 zmpAv068krvlk}nY8`)H(a_9MtWhc}|zCV{Q*Uux#vM%DqFi|RlECj^dH@NhA@^AFJ zW|1WGbVus3SsIK8cAe)Vtbd}+svA=L;d$a|!KL2%2y*G{^uT3Uj#pG|R0a+y9_=)o z=-hH38U9Q7DK(yeN%wz0##Dk6fj23752in0QpBziwSudG>$O-8C<=o&vI-nWn|1#X z^m?V<9v%4*c)iX|{l&?!vEfJvxTZ*S?%Xtx4^NjFhwZH7_$aS_5_$fsw_fZpwJ-HH z20O%OL=?^x{sc9S4d{2jH{{RuP-M$lJEyzx6gOl#?LiYXENwc!6UcaNZQq_ZrnJmw z)KyB(Fxa{IRIh5t^JTqzj$cvuo!nnDwrt5IXtwe|^Fl166b1K{wV2s}ivvj2PWh`s z)J&6t{Oy}jVb!>qv|fFy9bse8C1V&t*`u~Oh4Pg(jKu)Z8e@H6Cg`xoePv92*MP1L ztcj3=i#dkfQNaLBEK{oA?-5YSc##px7$w8#0sU?tDU|bw`}YC)W=?BfkNtLd^n!kR zf(}_x3K%IlslY5KWcMzp&LwsJ6dH?6Gfo#^c<8@0FFmhIbILn0=JNHR-F~^boIfHo z7b*X|u94G2EcUogh^7b2*vJiwktO+9yaRmO%6^IAi3>h7eO#^bug;~hhAhmX%m&!CV2b;4V>P@) zKq3<l-oC6Xn#_5o=cp*od-|<4A~M0;Elv_RA4@!ogrv^`vV@S2gl(-u{G|GL$d^IDS2aS!kSls%sCm}k80|nq*Pd1A1Am;9 zy8&@|IB;K@_Hw&<&tL3p+5n~Z|GMa15hqB;Sv8BdTWvAG9v>+sj$L$vv5%@QZ@^8B zsDA2)K7L0=3IHa^LE&SrY7KJVM(rp8Q_+%^JA~V zgE~GvEq%9~0GrDK*4|p@JW9Q)U98b8`YI+8F~V<2Am0^rBGS_3@`nVSHHn43^|w9r)Nxd=Ft?SZS;Ah*6xzU3 z+*LHGt%b~i($cv4dpk+9sFuAm9rTu-SydTE`G_vbHV3)U4(EP`Lo}=_7mS<|S|L9G zL|_rcHi^g&ViiC;qw;})Ew&urgq}?$++&tbqVkNv&yI-X>4Ma=wJTTZ2{EFg{U=Il ziWTUm|N2~VkOmXb2)k~Z`)MIdCgIYF|? z$-lE`+l?gKq3_hC-Y)B2J<2LBqn4^(PI`PJ_60+9QK-fj6{p*P1y=F;SY^O6lVClX z1Pg62w#1;{=HRaFbY;9@FmST@z(oe zV{9vDA6`$&u3wYHI4bK-xkX%tOeC&BcC2%qH!mmHAvy~k9oQ|qYC7!;zw6~KYw1Ka zh-*vXOR*mTo__?zbcUI;TpB@`ZElhOnIuBCX4=d0sX#HbsA;et91d&R{%5^7N{Ch(T_m&`KX3zG^EGF|VU zVfZ7Fu5Fj^im|7DDY1i4H}wi1jCucfG{CmjMQXU!ax>4~<$rw#30wnrwfjEZT;8Y4 zHS-~LuLa-NXDRkpA`2L_zUAz6w15DEcc$V4Y2kH>?`c10Sv9Mb7FN(gnLJgVZHX7@ zq(STJVYUNh{*-fSVPN34rCxIeG8x6RODpEB+vwtz4|}DZt4~o0X(APSSBy6&ZPf}8 zjCTE;EEjx|H7s8SpWbI??i}Wyqg2nnyV6!ao=`qKgM3>vUa~j(Az}P|c8GMNEOqRo ziYa5RdiFNj9~`lhBmv#B)A>RFWtHJ!K1)n%cP2ln9FYPB0;hgmR+M2F-O$s znx=#Q2AZ<6$mEN6 zi7ZcG=E$IHhI_a)a%9fD%=CQ1EV(Gw2P5ioJx30B2A{vDs!3sALbd){gzA2MNq|M*Nl;3|GrC%=P$S?lIQN5qX$FS)F<@!($6Iri8J z{5LZBR-SfQVKob&N?(0!IYG##&Jz;}LDmk718m)P6V#90tb2hA-k^CPHMj!r{^NZy zFMLLGPf`o*YmdI}(la%~LryFcr>_LFxfa;V3k#!S2tRQRz?0}2&J$tkm7m8sI3Y-I$Swrt=oyPx=FLyzc~s+PRn^_vXv3X-v1UL{%O*p z$C_zlLf_k8n^t~=Zktp8%E0|VfwtWKt)^0MXDu^*PwCvDTP$j3*U_*ZBaQXs;^8%n z^ZH*CVHx-gNw;rz6YYOT|3(h}=?r52@Zgzn_*F%mem2uTUPT+SlJ0*nX3GyrU@?%!h{2)KsE0X;C*h(Y?9=Ud9Zw_={N*JZPjQ*fg0K zuzu@gMKjmFHTqZXofDFdv~3PfJLomGpu+n&ZJ8QPOgk_p1Z-+Vlz}g~I>_wuhM%kD zXET`;M8CnI&&5H`-qOhR;a%Nb^U7DEpK@~_??|~qcHt=%YuT#1ksFlow9zt2G`Xp0%(}M?yP&-O)7pIK^0e$)Dv|h_*5`yV!Aim5vNz_~2?Cm5;~ZJ0 zBZPeym&WnW=g7@Hikx0k`C959XxSeh16E2j`H)q8e3ZmzcQwn)uNo5lY57(QU_i7+fkW? zvvDf&kOwC{fQb-L@=4Pq*LN#UhafDXvS^}~)%t19G9lPs--P2xk7Tkt3B3}HWJk9m zhIo8vNXD~?ema6h4A=$YMj<&2Mq$vaf7wSQL~p-;i#Uet9roR6_}u5X6qZA~2D}lQ zLwl8l|L(v|-a9NKk_KHBn0qy*H6}#q|E8|RvF0SzfyC4T()e?uvdujRb9com%_g$W zFL72{R$SToa4&Dz-s76T3DLy#r1A{&Y6p){Tuw&bh_J4vwrZ#2RhYPz0g6N1<1VFq z138;M8sT1k`g|=9;hOGurWDrMrtMev-sa*;LK-bNo4{F;>i)3oUNvD^@F&eSyAPb! zPX+ezx5rnCLpOF+yeLvl57BT+8!tXnp^=E{eRDdo`X#8B;(R2YCYKBON-Q}kqePbF zAM3sHk-~q?Ds`QjhKbXD;(+|di_~IKrnjnKn@D!ajPuXBsbj^X|rF$3#3zUwuaxyNNEhrWY*vKL0Rna8Bxg2mAc70q|-I#VNS zkA>0&YX9ZiGD()cWKN%OX4nNV=LD=Z7LUP{bsAm**N(Zk;f{MO_kFt zj^j|)4-8CixpCfG8eyF`rt#6ei{5n-7?6;`Pq`@7V~w>SwWGP;{KMbJNaWFkbr1JJ zI8{xcWjD~EOavtrV) zL7PiIklEm(*q%G#uJ#*lBP+sCvj&7Tes`~;w9}fS=;oyA+o-R~NGM2#^$@mOx<@9* zP8&IXiZPCCd%56V#**x|b%W*=vu;LSEZR3(%|9A2IqgNzdG{M@_B{pYn05WQn1sqM zO2Vtcoy;uZ;SHO$i2b!{$?rOqh7Fi$Q1~nTvAsoQyAKcFF=C0u)nez={H*Kyn4{c& z;P^x~ofPBbjL+g`d-ES1$nn04hML>rAe@cnP}XlZ5? zcg1&aA_f;TqQ&&|#%lwaPKLtA)3R8TXL*`nsD*K2C_mYai417w-QHKA+K&t(1ZGD| zhb=7D$N3q6LMIGPD%qRrrFYOpl4eO4InaVRYG&Q`wUN04mo;#jV%I-T-RTkr*I-wd z|Fv7|c5O=h%jBb`X`Yk88=e}6pWk%czc6AOGRA=|IKn!{s*bCutKw!P)dtJ{UKD#;;;>J1Kq&Q@yEzNMLdOb?pS zY`DX)vU3xqP8REXB!kU*cRwmKzD2HlAUQLx(+=^A4tpc!UtuSne4~5U^7ZB6nqD!z z6}lAy16(w#Z6(K6nx>ho59C zhIE9`?A~JRup~|IENYA3Qd!!8`IBB{Iw2H|41Q7G(nE`p$*IYU^AdiO;@MOhG96V> z5bn)@ZT58$nMWWY)J$m7525-ukLbb;CJr&S zd5iCHARJ{RR`T4Fl7#Hi)GE~`*dyO)5NySvLo?zH;P>PqRd@BIUxC!iq zoZ=tFphP&;K*96P)ZFN~8RY-;B?_OSaf zdEMx+44M$EBw2#)sg_{L3RZh0FrhjygX;6^%lEUT)wtrq&1UbCH64Eo&Y^p&AvkY8P%18UPFV%2d9A(RtcRi(D8jDJyV zD#kl4%3n1CO-NoGev&r-0VdZ{S7e?0ms-J`wu(UvSGY*$ZJj~VCNpYL}^SRTGj9Q7IgPRXAHAyErR&m-WMTFw27 zuji>2Zt=1r*$})2F8F;0cECHVYgQn%Y}2>N7~j`8?m&h&So%CVu@oxbJJwuiRwS z->-S-c8HaUDMdO<+eobIxV(Fc`5+%}YgTAp|C{PfO6zc`a$7a$Dnj_7kqa7 zrq)?f-%#L%Y9>4!VVZmg#W>2Hl_&0Jwf}UednVk0nx?Q}PZfP4uKC`RBfMOgi@3=& z*X;eIAN+3#87zajX@VtmUdE=H6ZBI2ar}aTqP*tzG4SH6$UUk(H``hw6umtcQ0InD zF`hFG%yH?D*Qd&1Nv}x=^cLp1#W^sYtlxL*Bo3A_ZXUgd&mg2Zl%J`rGJELox4IQv z@_tWjz!Q=Q(L`sx&#-kSk2~(HC$>i*?_k+JmK>QC1bJoGcwLdU6O~gbG%s2W@OX=y z*WumMR|S**JRN=SMNwUU`9p}frrNQYZMmHH(6u9&gU?9#>8#0^j|K{Z)52m>kZvSOHhy-^`M8yE z^8Ea8o*VirA@Ki6E^1>rdu;Fvzi zJKY3!Jsi!>uXPG_JWmB)?4@gMUADI0T|8}7v%yEq8-aVbph}|t52x%hlXf!AH(%lDW`&Ch{v?v*G+{cayFp-OA4#@CFRt`Q1M(2L|5lEiVIx-_Jvv45LoxXT-qA zhuag!49>EIh7B41r`Uc1E(aGHwFRI__aada9SKwB}j0IWMeZ!oE!H(p^`v5*8 z$E|k9exqAP>)Gefl{Ek#+-+k6E)Q-5asTmd*|!<_ACRYUI+O6FR4v4*HHwGgUHM(nT>owM^A3{lcUx2#8aE>GXcT$7a_TpN;UL(glVPfwO@%<>O{kAWr@eLcRiUDpu_&#N)X z-rLg7s`#GG5R%nT|7f`(;QF+TXe*$)hXe_7=HU?QwAOX#;i>fbL>_v40NXyXu^!F# zkE62)C(ZGm+zuTUbprs(OOM4+v(b-YXKU80ofQp}s~nlK_t+rd`7Pa*u;0^(1Sg=4Y``L4~5Nu}z+uPbc;&3@K=U~@3IxUXRK6IIeN z(l;1a2yF6j_;(U5!j*p02XMbEVSo!3>OYLntICD%NMAd8XI#2VNpPM|ESqIdkV3H} z=l{m?{FxP);wPHLb7yQ|Y_?vBl+EhA=w0u4jQmF^4vS5c9w59tBay=l*3<#$ z9aGLj+bEKWcDm~|09h0C zk)t;u75w+e?@E#-`0^zPjm9QRfo?(>s4%->k~!mC?n2#_M4?M-B7hwT%Q;-}f$_SM_d8>Imi_e1oDZ}o!VVUpLze~PDay6-#>M- zpY1Yg#=q^@ZLb6+i2?zvjgs9ovj>{-CALb0r(;u5voYZ49yEg?(oDlQgJ~3^G0{mc zx|pHn>J%d3=mvpsAOOlxIF^-O`n{nl(s&y?_%&0}2g5*?tGhN}h8sv>rVe966ru*0 z4WD6(*|;st580sOrs;O6d3PUOfQ69?`ogp_<1Iy5-&}{~suad#TUazgC1nPh!+Bob zNqaWjy14kml(zfM_SVJ>*!o4Nxn-;OKxDxUH`w6;vZE@ovAJX9!EKcd7Qs@WILPCb z{_;^YvJ5#kfcJnIvW)sw&O#47va5GC?grJbl?*k#4=jQX@V=vK999-TRi{%*H?Yyb zb9;V<{i-k)69LPaRqj|$J8#h?&A!o$!jF#i>K zOT?*9D`7B}JOiv<%l*Y}J9k^ZFrDiA5Hd#z>j2=o05YYKrBjyeaAKtKa(H> z8r_m@Na6G;GhgU8ZZ;LgCladN-~Y!7Y{K`w62`&bzI3OPXSqG;s*sYW%Q1)&>?hjh zOirdp%8)^{-nV<=Xbp_LqBuL5uRD)1+Al1+6fhc?J|ieFvGEw7P;eWdXc9Uof?-pc zssGwa8aP^<)-Mms>8pmf{z==>f?!e-uz>dCpBLN*guIr?NC;louf|I+{wLfQ57FV# z%~7W6Kj%;5xxNAwF{ zOd5IEgCDBR`>zurhEXGQbSiforT`iUyaoTrk;5ZR%OD(+MMp*lT0o|`WX;p#g5Ulz z&ncEjKLC?fp=tvx*Hg?0s%cl(HJ8DJQ>wVJ8S9SX;xli|k=h$@c62hp{%0IUidh~M zs8PQj5lDAflGq-Z!F4Dii?)|pisc&o><)zH%#A;*t<-QYU>bHXfUp(B+<=iCF&T68 z012>gMM%r5vhP|Q@?@NA{!V!D(v#BLCXt?DEK>OYI)hWuOrTQOt48-CZj=6WD`9Fv z=-Pn@-6igGx!pL++u;&mF;wT}vx12?ag{Mxxr6wG?13pv9s4MT*C6fPVV~+XmmGieHB@n|}pdPw` zJf#udzr1Lwx?ektM(l7oDG>gs(jU+PoT@Gh^+FO@gw&rq_WaLLLt#37R=Ee3`~U2a zc>xn=A)>HrRe02`+fNnfxaLrYbF!g(TL*;OszHQ%y z6{z99@p-2HNUeUIUZ{yD27>D2T9#OK@DIwTY@znStRMmjE3==-Ua%qSXH6AD49`ZL_ngN*a+Sfkt&tg%!v~?DWt)5F zrcC!d_=hB@@b-uTalGWk1%eA7pxDg#PhdXUS;T`M1rBTCfi)-`oBy{{1*cVv3W1S=k%#>VRfdIXTnx7C2~BQ&jIh$N^Su3>;Gr_ScLaqU~sc-yA8 z3qdp4P6HK^AS)qMxW%V=kJ%ib-*aS@#c2Uvk~0g-UogWK=XZ0n0@cP@p}@Vcg6A~6j%gq0wP2Kd^O*Wbdl~R`O6X#OP15QYQHF*qwj#ET7s;Zkl(B+(91XS}L zdj}g%im-zUd{guOR88njuG{h-w`L_-HWd*vbW!`g^BayVUE=E-3tr+c(dSOIl!Y3e zT&PL+CSYql;-%{Z(d{xIQe>4N%Ki3ZHv6|ZW1Q~;CkZB2>PIxF_*WPCnuVEdCIH7u zSkqZz_(Tmto9HmLQKSwKVl{9C`Wp%^?}3QlHl6Yt#yNDA!3lHg7&IbV2$j}c`C06oMtmN+CbXZ#L>IW0`D55rxyO-2|A z(myWcsTH2>l$I{C*MgyKzlfIU!$jS{D{GS<%UKM>0ke(=N-1u6@LGl1c+b8FlUYh~ zj9ZG(%;r&fy|Li~(I;6%J$ zCI%jM2`Mlg+!&5Deu1Bp?!*?AMoEa zmm8V1M$>JBLl`Z#-E&dk>j2jVioWAZ3KV&LAg{UQPsIyEz?H-v$& zF&&Rkv0g|oBxFt!>7t(bF@!%iY9GrD-kcgOeIyz0WUc33!cR#-L>y>Fs+_-Qg$qjs zHm$(__6JG1L!FaCL35^bl_D1CW`2W}SZYhN^jvn+(pB=+N~C8|8kuf2{hT_0%2|2toz;9{r zBm{JkIti`&et`wTe#bBnWBq8B^xK309CRe!_kz=x33vYbQ%fZy(OW6A>H-YVQu*$# z84b9tLu;&MvzEsx#KE9b*pjPg$k_&HZkOwDH+bVMsLufiQywZM_}aD&CtKX}UAELB z1qbg<<;cuGUv6*Yuu?zx`cpU4{*IoQ#CFaw8c&w*=b2xVu9eCA;f7051ju$KFvW zd}{CjJ%3eTiSq@(Z?;_aHY+%ADzlo%%fWZ=PsAX6ct>)NLvGDE%YDM`83q_MSZjBb zu-;NIw2JA&K+CT^e8rH_RVcw*io`?B;W)vXYZYDXHkQfG{V=hw2~L=+eH5hlYYDu z;gt!aBy=#AaSYc1;wfZgOU;U8<;*9XBgK+#b`p*JQiWv^fc~eiE;X|l9TU(qIu{

oh~Bye}|0I^wYegaHhWclpK0QJ?@rQ4JLn{Hea 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�X#kdf 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

lwSo6~D` zIp^v>=Q_)+kmAi?qfHw=Q9^pgEa0~RaKODWq&y?^M%KM4E*g}F=;C8j+Xv^p{JF`Y0G-LkwA%`|- z?&MC^c4NDI1d&~sdrp+61R_b!_*pZ6z#^R~dir%JYLGO6;MgaAU?)ZdBS0dI^g$Xy zQL-R&3C4SY$RWIZU>7<>Z#)0Ih| zy%<9I$>-XH1>^Qbk_HpdxjE-I%yp>sF)xS0Zf#;8oKnS!+GR6&J}?Moe?x^{y`0{v z%(GEo66>ZhM##pPRh$3yF<)a!m+GK^uouN+>DtmgCxU9DoBg)(V2j*BfGN;6*LnnQ z)b?lG$?;9Nf2}ygvvsS;)zSCAWjixr&BQTrzNh;Jo&wDm7ZTp3>8U2%UL;jvpS6qw zgxQmz-9>`l4L@-rSzx?5dfW#I6iAd+rvMI!A!W`RV-pssGj?@$0`i~))d&gr+2)dt zN-_5Vne*0ju+afN2|5N>s05Wb66M)U79WR+I`e--^48x?rkFeTM!5;yxh!*T( z;C%)D=Y1Io!!z_lFvYe^O~IQ82^Ei9YiVh@fR`FngeeVfd2@!MY8I$RkqHrzljDO! za;F;jzX@n%mYA;_C70g6p^NSFc?g&*hRJ!M7>>zN;clwF!aAXow( zI7Jrb=79kL!+^E$ors7C@Q4AeU>j?zzo#cN@qFp}znAJYN;(9p8BhfPsk-gIKqXyK z5v`d)SeWc*>+q9N6OT1e{V+B*KC2+hRpopA`swJ_^|gDqDHpgTI6zs0i~RSXB*@N= ziGu@J=m?JTL;m2XNJLD$T?~AC%DAYgp3!xk$pDdTR9AN5`PQcfK$uBfqzcCrLjpt& zXn(-J_edoy8nFTtd_caZ;JSmsN(@_tL3HKm5>QJuJjLb#w+$jsA}zng#saRgI9n@v zWDBrFgB*yGiI-3ZU}n7@is>e?<@DEJ#O?oN9GRMywhwUQ%F5r7k*AdlYini=z5^DM zKyV@hoT)~sf%chgqXT@Om@^g#t;}!U#6>PZp`zWZ;Is!U8~{-rh=KrD6pRR@RY2ax z3xh8_V|{$R2O=SArT{zpTQ+f2Kn!Zb(P73LeJlvE0|D2m2^@Hd*b=GP<5&x*dCE!f zcnPq-fPW1i{QiHAL|?+khp~?ih5$DOCKBKjCEHya#V7L%3onC{IR{skzq-JvP|IH>oKKCHDni;QecDAv#)v$1!11$Gj`t7JvTe#1B zDFg%>f%exbO}E&Bn<8MiG3ft(TuiaY0v~w%VvV4T{{O#Is9D)t3L^w?x0F?C6p)^| ux$k(7&r1O1B(d9!1Nrfpxh5#k-HM3Q_Xlv#9JM|HzhoufNtB2g`TZX^(BVh` diff --git a/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md b/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md deleted file mode 100644 index 0822b39..0000000 --- a/contrib/DaanV2.UUID.Net-master/Documentation/Performance.md +++ /dev/null @@ -1,53 +0,0 @@ -# Performance tests - -## Setup - -Tested on a PC with the following specs: - -* Intel I7-7700K CPU @ 4.20 Ghz -* Ram 48.0 GB, Speed 2400 Mhz -* 100 Tests -* 1.000.000 UUID Amount - -## Benchmark Code - -Each test has been done with the following code: - -```csharp -public static void Test(Int32 Version, Int32 Variant, Int32 TestCount = 100, Int32 Count = 1000000) { - Stopwatch stopwatch = new Stopwatch(); - - for (Int32 I = 0; I < TestCount; I++) { - stopwatch.Start(); - - UUID[] Temp = UUIDFactory.CreateUUIDs(Count, Version, Variant); - - stopwatch.Stop(); - - Temp = null; - GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, true); - Console.Title = $"V{Version}.{Variant}\t-\t{I}/{TestCount}"; - } - - Console.WriteLine($"=== Version {Version}\tVariant {Variant} ==="); - Output(stopwatch, Version, Variant, TestCount, Count); -} -``` - -## Results - -|Platform|Version |Variant |milli seconds per test |ticks per test | -|--------|--------|--------|---|---| -|x64 |3 |1 |925.57|9255725.31| -|x86 |3 |1 |902.71|9027142.91| -|x64 |4 |1 |533.32|5333294.43| -|x86 |4 |1 |495.67|4956702.14| -|x64 |4 |2 |506.01|5060131.24| -|x86 |4 |2 |494.99|4949900.86| -|x64 |5 |1 |910.46|9104612.2| -|x86 |5 |1 |950.05|9500552.11| - -### Distribution Graph - -![Graph](Data/Graph.png) - diff --git a/contrib/DaanV2.UUID.Net-master/LICENSE.txt b/contrib/DaanV2.UUID.Net-master/LICENSE.txt deleted file mode 100644 index 2e35280..0000000 --- a/contrib/DaanV2.UUID.Net-master/LICENSE.txt +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2019, Daan Verstraten, daanverstraten@hotmail.com - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec b/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec deleted file mode 100644 index 379fd82..0000000 --- a/contrib/DaanV2.UUID.Net-master/Nuget/DaanV2.UUID.Net.nuspec +++ /dev/null @@ -1,36 +0,0 @@ - - - - - DaanV2.UUID.Net - 1.0.1 - Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4, and 5. Compliant with rfc4122. - Daan Verstraten - - - false - LICENSE.txt - https://github.com/DaanV2/DaanV2.UUID.Net - Daan Verstraten 2019 - UUID UUID3 UUID4 UUID5 rfc4122 .Net - - images\icon.png - - - - - - - - - - - - - - - - - - - diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/build.bat b/contrib/DaanV2.UUID.Net-master/Nuget/build.bat deleted file mode 100644 index 021dbd0..0000000 --- a/contrib/DaanV2.UUID.Net-master/Nuget/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -nuget.exe pack -PAUSE \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png b/contrib/DaanV2.UUID.Net-master/Nuget/images/icon.png deleted file mode 100644 index bceb685b8da7e94e82f3802e9cac4bfa1a87b873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16529 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 z 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 IM6N<$f=ec&yZ`_I diff --git a/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml b/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml deleted file mode 100644 index fbba706..0000000 --- a/contrib/DaanV2.UUID.Net-master/Overview - Messy.dgml +++ /dev/null @@ -1,458 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Overview.dgml b/contrib/DaanV2.UUID.Net-master/Overview.dgml deleted file mode 100644 index b7a6c04..0000000 --- a/contrib/DaanV2.UUID.Net-master/Overview.dgml +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/README.md b/contrib/DaanV2.UUID.Net-master/README.md deleted file mode 100644 index 8d7e828..0000000 --- a/contrib/DaanV2.UUID.Net-master/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# UUID.Net - -Provides a base class that can handle UUIDs as an object but also provides the generators to generate version 3, 4 and 5. - -**Table of Contents** -- [UUID.Net](#uuidnet) - - [Implicit Casting](#implicit-casting) - - [Usage Example](#usage-example) - - [Generating UUIDs](#generating-uuids) - - [Generate a UUID](#generate-a-uuid) - - [Generate a batch of UUIDs](#generate-a-batch-of-uuids) - - [Generating through a Generator](#generating-through-a-generator) - - [UUIDs Version](#uuids-version) - - [Performance](#performance) - -### Implicit Casting - -This API contains pre-made casting methods that convert UUID to strings, char arrays or vice versa. - -## Usage Example - -Below are two examples of generating UUIDs and usage - -### Generating UUIDs - -#### Generate a UUID - -```csharp -UUID Temp = UUIDFactory.CreateUUID(4, 2); //Version 4, Variant 2 -String UUID = UUIDFactory.CreateUUID(3, 1); //Version 3, Variant 1. auto cast to string -``` - -#### Generate a batch of UUIDs - -```csharp -UUID[] UUIDs = UUIDFactory.CreateUUIDs(100000, 4, 1); //Version 4, Variant 1, Amount of 100000 -``` - -#### Generating through a Generator - -```csharp -IUUIDGenerator Generator = UUIDFactory.CreateGenerator(4, 1); //Get the version 4, variant 1 generator -IUUIDGenerator GeneratorV4 = new DaanV2.UUID.Generators.Version4.GeneratorVariant1(); //Get the version 4, variant 1 generator - -UUID Out = GeneratorV4.Generate(); -``` - -## UUIDs Version - -|Version |Variant |Description |Context Needed |Context Type | -|-----------|-----------|---------------|---------------|---------------| -|3 |1 |A UUID generated from a string using MD5 hashing bits, 122 bits |Yes |String | -|4 |1 |A random generated UUID of 122 bits |No |Int32 | -|4 |2 |A random generated UUID of 121 bits |No |Int32 | -|5 |1 |A UUID generated from a string using SHA1 hashing bits, 122 bits |Yes |String | - -## Performance - -See [Performance](Documentation/Performance.md) \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/UUID.code-workspace b/contrib/DaanV2.UUID.Net-master/UUID.code-workspace deleted file mode 100644 index 362d7c2..0000000 --- a/contrib/DaanV2.UUID.Net-master/UUID.code-workspace +++ /dev/null @@ -1,7 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ] -} \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs deleted file mode 100644 index 1d710b5..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/GeneratorTests/GeneratorTests.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using DaanV2.UUID; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Unit_Test { - ///DOLATER

add description for class: GeneratorTests - [TestClass] - public partial class GeneratorTests { - [TestMethod] - public void TestAllGenerators() { - Int32[] Versions = UUIDFactory.GetAvailableVersion(); - Int32 CurVersion; - Int32 CurVariant; - - for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { - CurVersion = Versions[VersionIndex]; - Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); - - for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { - CurVariant = Variants[VariantIndex]; - IUUIDGenerator Generator = UUIDFactory.CreateGenerator(CurVersion, CurVariant); - - if (Generator.NeedContext) { - Assert.IsFalse(Generator.ContextType == null, $"{CurVersion}:{CurVariant} if context text is needed then context type cannot be null"); - } - - Assert.IsTrue(Generator.Version == CurVersion, "Wrong version of generator"); - Assert.IsTrue(Generator.Variant == CurVariant, "Wrong variant of generator"); - } - } - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs deleted file mode 100644 index b17650c..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/NillTest/NillTest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using DaanV2.UUID; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Unit_Test { - ///DOLATER add description for class: NillTest - [TestClass] - public partial class NillTest { - [TestMethod] - public void ValidNill() { - Assert.IsTrue(UUID.Nill.ToString() == "00000000-0000-0000-0000-000000000000", "Nill UUID is not an proper nill uuid"); - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs deleted file mode 100644 index 9c6baf4..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Casting.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using DaanV2.UUID; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Unit_Test { - public partial class VersionTests { - /// - /// - /// - [TestMethod()] - public void TestCasting() { - Int32[] Versions = UUIDFactory.GetAvailableVersion(); - Int32 CurVersion; - Int32 CurVariant; - - for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { - CurVersion = Versions[VersionIndex]; - Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); - - for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { - CurVariant = Variants[VariantIndex]; - - UUID ID = UUIDFactory.CreateUUID(CurVersion, CurVariant); - String Temp = ID; - UUID New = Temp; - - Assert.IsTrue(ID == New, "UUID casting to string failed"); - Assert.IsTrue(New.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); - Assert.IsTrue(New.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); - - Char[] Test = ID; - New = Test; - - Assert.IsTrue(ID == New, "UUID casting to char array failed"); - Assert.IsTrue(New.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); - Assert.IsTrue(New.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); - } - } - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs deleted file mode 100644 index 4338916..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Classes/VersionTests/VersionTests - Generic.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using DaanV2.UUID; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Unit_Test { - ///DOLATER add description for class: VersionTests - [TestClass] - public partial class VersionTests { - /// - /// - /// - [TestMethod()] - public void TestAll() { - Int32[] Versions = UUIDFactory.GetAvailableVersion(); - Int32 CurVersion; - Int32 CurVariant; - - for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { - CurVersion = Versions[VersionIndex]; - Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); - - for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { - CurVariant = Variants[VariantIndex]; - - UUID ID = UUIDFactory.CreateUUID(CurVersion, CurVariant); - - Assert.IsTrue(ID.GetVersion() == CurVersion, $"Tried to generate {CurVersion}:{CurVariant} but got version {ID.GetVersion()}"); - Assert.IsTrue(ID.GetVariant() == CurVariant, $"Tried to generate {CurVersion}:{CurVariant} but got variant {ID.GetVariant()}"); - } - } - } - - /// - /// - /// - [TestMethod()] - public void TestAllArray() { - Int32[] Versions = UUIDFactory.GetAvailableVersion(); - Int32 CurVersion; - Int32 CurVariant; - Int32 Amount = 100; - - for (Int32 VersionIndex = 0; VersionIndex < Versions.Length; VersionIndex++) { - CurVersion = Versions[VersionIndex]; - Int32[] Variants = UUIDFactory.GetAvailableVariants(Versions[VersionIndex]); - - for (Int32 VariantIndex = 0; VariantIndex < Variants.Length; VariantIndex++) { - CurVariant = Variants[VariantIndex]; - - UUID[] IDs = UUIDFactory.CreateUUIDs(Amount, CurVersion, CurVariant); - - Assert.IsTrue(IDs.Length == Amount, $"{CurVersion}:{CurVariant} didn't generate {Amount} UUIDs"); - - foreach (UUID ID in IDs) { - if (ID == (Object)null) { - Assert.Fail($"Generated null {CurVersion}:{CurVariant}"); - } - - Assert.IsTrue(ID.GetVersion() == CurVersion, $"Tried to generate {CurVersion} but got {ID.GetVersion()}"); - Assert.IsTrue(ID.GetVariant() == CurVariant, $"Tried to generate {CurVariant} but got {ID.GetVariant()}"); - } - } - } - } - } -} diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs b/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs deleted file mode 100644 index 1a1b2fb..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Unit Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Unit Test")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("9b94e9b5-d328-47ec-a487-8bf61e969ef6")] - -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.1.0")] -[assembly: AssemblyFileVersion("1.0.1.0")] diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj b/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj deleted file mode 100644 index 7ad4141..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/Unit Test.csproj +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - Debug - AnyCPU - {9B94E9B5-D328-47EC-A487-8BF61E969EF6} - Library - Properties - Unit_Test - Unit Test - v4.8 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - - ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - - - - - - - - - - - - - {C419E0C7-2D37-433E-AD0D-44A319047DDF} - DaanV2.UUID.Net - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config b/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config deleted file mode 100644 index 28e3f78..0000000 --- a/contrib/DaanV2.UUID.Net-master/Unit Test/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs b/contrib/uuid.net/Classes/UUID/UUID - Get.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Get.cs rename to contrib/uuid.net/Classes/UUID/UUID - Get.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs b/contrib/uuid.net/Classes/UUID/UUID - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Initialize.cs rename to contrib/uuid.net/Classes/UUID/UUID - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs b/contrib/uuid.net/Classes/UUID/UUID - Nill.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Nill.cs rename to contrib/uuid.net/Classes/UUID/UUID - Nill.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs b/contrib/uuid.net/Classes/UUID/UUID - Operator.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Operator.cs rename to contrib/uuid.net/Classes/UUID/UUID - Operator.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs b/contrib/uuid.net/Classes/UUID/UUID - Overrides.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Overrides.cs rename to contrib/uuid.net/Classes/UUID/UUID - Overrides.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs b/contrib/uuid.net/Classes/UUID/UUID - Properties.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Properties.cs rename to contrib/uuid.net/Classes/UUID/UUID - Properties.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs b/contrib/uuid.net/Classes/UUID/UUID - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Classes/UUID/UUID - Variables.cs rename to contrib/uuid.net/Classes/UUID/UUID - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs b/contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs rename to contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Initialize.cs rename to contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Properties.cs rename to contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Classes/Generator Info/Generator Info - Variables.cs rename to contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Initialize.cs rename to contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Load.cs rename to contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Byte Array.cs rename to contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - To Char Array.cs rename to contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Static Classes/Converter/Converter - Variables.cs rename to contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs rename to contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs rename to contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs rename to contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs rename to contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs rename to contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs rename to contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs rename to contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs rename to contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs rename to contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs rename to contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs rename to contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs rename to contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs rename to contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs rename to contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs rename to contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs rename to contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs b/contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Interfaces/IUUID Generator/IUUID Generator.cs rename to contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Context.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create Generator.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Create UUID.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Get.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Initialize.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Load.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Factory/UUID Factory - Variables.cs rename to contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Initialize.cs rename to contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs diff --git a/contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs similarity index 100% rename from contrib/DaanV2.UUID.Net-master/DaanV2.UUID.Net Source/Static Classes/UUID Validator/UUID Validator - Validate.cs rename to contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs diff --git a/contrib/uuid.net/uuid.net.csproj b/contrib/uuid.net/uuid.net.csproj new file mode 100644 index 0000000..cb63190 --- /dev/null +++ b/contrib/uuid.net/uuid.net.csproj @@ -0,0 +1,7 @@ + + + + netcoreapp3.1 + + + diff --git a/global.json b/global.json new file mode 100644 index 0000000..7c33201 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "3.1.100" + } +} \ No newline at end of file diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..f45d8f1 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} diff --git a/smarty.sln b/smarty.sln index 466beb2..0f56625 100644 --- a/smarty.sln +++ b/smarty.sln @@ -9,18 +9,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9EA2E57A-D EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Contrib", "Contrib", "{EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A}" EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "DaanV2.UUID.Net Source", "contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.shproj", "{72DE337F-6F32-4E42-9CA3-3F4759275E1E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaanV2.UUID.Net Core", "contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Core\DaanV2.UUID.Net Core.csproj", "{4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED96F7FE-6FF3-4C84-9976-46D2C8557E8A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Platform.HomeKit", "src\platforms\homekit\Smarty.Platform.HomeKit.csproj", "{75D7361A-EEC0-489C-AA21-3B0511668D9D}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Build", "build\Smarty.Build.csproj", "{270DC829-5D6A-4A10-AADF-1C5302651C19}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.net\uuid.net.csproj", "{A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - contrib\DaanV2.UUID.Net-master\DaanV2.UUID.Net Source\DaanV2.UUID.Net Source.projitems*{72de337f-6f32-4e42-9ca3-3f4759275e1e}*SharedItemsImports = 13 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 @@ -42,18 +39,6 @@ Global {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x64.Build.0 = Release|Any CPU {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.ActiveCfg = Release|Any CPU {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.Build.0 = Release|Any CPU - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x64.ActiveCfg = Debug|x64 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x64.Build.0 = Debug|x64 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x86.ActiveCfg = Debug|x86 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Debug|x86.Build.0 = Debug|x86 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|Any CPU.Build.0 = Release|Any CPU - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x64.ActiveCfg = Release|x64 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x64.Build.0 = Release|x64 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.ActiveCfg = Release|x86 - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9}.Release|x86.Build.0 = Release|x86 {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -66,15 +51,38 @@ Global {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.Build.0 = Release|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.ActiveCfg = Release|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.Build.0 = Release|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x64.ActiveCfg = Debug|x64 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x64.Build.0 = Debug|x64 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.ActiveCfg = Debug|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.Build.0 = Debug|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|Any CPU.Build.0 = Release|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x64.ActiveCfg = Release|x64 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x64.Build.0 = Release|x64 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.ActiveCfg = Release|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.Build.0 = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.Build.0 = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.Build.0 = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.Build.0 = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.ActiveCfg = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.Build.0 = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.ActiveCfg = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {DA1CF614-7D2E-49BA-B27F-4334B964C2E0} = {9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106} - {72DE337F-6F32-4E42-9CA3-3F4759275E1E} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} - {4CFE6081-F3CD-4AAC-9DBD-4937F88FEAC9} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} {75D7361A-EEC0-489C-AA21-3B0511668D9D} = {ED96F7FE-6FF3-4C84-9976-46D2C8557E8A} + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} diff --git a/src/core/smarty.core.csproj b/src/core/smarty.core.csproj index a1831f9..33ca59b 100644 --- a/src/core/smarty.core.csproj +++ b/src/core/smarty.core.csproj @@ -6,4 +6,8 @@ Smarty.Core + + + + diff --git a/src/platforms/homekit/Smarty.Platform.HomeKit.csproj b/src/platforms/homekit/Smarty.Platform.HomeKit.csproj index d388950..8234b94 100644 --- a/src/platforms/homekit/Smarty.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Smarty.Platform.HomeKit.csproj @@ -5,7 +5,7 @@ - + From d5c5b99a901f946eb736b064b70614ff407df9c2 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 17:10:17 +0300 Subject: [PATCH 007/152] fixed build file permissions. --- build.cmd | 0 build.ps1 | 0 build.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 build.cmd mode change 100644 => 100755 build.ps1 mode change 100644 => 100755 build.sh diff --git a/build.cmd b/build.cmd old mode 100644 new mode 100755 diff --git a/build.ps1 b/build.ps1 old mode 100644 new mode 100755 diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 From 7050e5195823da3ee1a7469838cb92487d20754c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 17:12:33 +0300 Subject: [PATCH 008/152] tiny fix for linux builds. --- src/core/{smarty.core.csproj => Smarty.Core2.csproj} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{smarty.core.csproj => Smarty.Core2.csproj} (100%) diff --git a/src/core/smarty.core.csproj b/src/core/Smarty.Core2.csproj similarity index 100% rename from src/core/smarty.core.csproj rename to src/core/Smarty.Core2.csproj From ea1582f98422a793f95381398315464f4c371507 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 17:12:49 +0300 Subject: [PATCH 009/152] fixing github workflow builds. --- src/core/{Smarty.Core2.csproj => Smarty.Core.csproj} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{Smarty.Core2.csproj => Smarty.Core.csproj} (100%) diff --git a/src/core/Smarty.Core2.csproj b/src/core/Smarty.Core.csproj similarity index 100% rename from src/core/Smarty.Core2.csproj rename to src/core/Smarty.Core.csproj From def90f12f7f9989cddb5ff351a99c842ae9316b8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 17:19:53 +0300 Subject: [PATCH 010/152] renamed project as homer --- build/Build.cs | 6 +++--- build/{Smarty.Build.csproj => Homer.Build.csproj} | 0 smarty.sln => homer.sln | 6 +++--- src/core/Homer.Core.csproj | 13 +++++++++++++ src/core/Smarty.Core.csproj | 13 ------------- src/platforms/homekit/Accessories/Accessory.cs | 6 +++--- .../homekit/Accessories/AccessoryCategory.cs | 2 +- src/platforms/homekit/Accessories/IAccessory.cs | 4 ++-- src/platforms/homekit/Accessories/IAccessoryBase.cs | 4 ++-- src/platforms/homekit/Bridges/Bridge.cs | 6 +++--- src/platforms/homekit/Bridges/IBridge.cs | 4 ++-- .../homekit/Characteristics/Characteristic.cs | 4 ++-- .../homekit/Characteristics/CharacteristicFormat.cs | 2 +- .../Characteristics/CharacteristicPermission.cs | 2 +- .../homekit/Characteristics/CharacteristicUnit.cs | 2 +- .../Characteristics/Definitions/AccessoryFlags.cs | 2 +- .../homekit/Characteristics/Definitions/Name.cs | 2 +- .../homekit/Characteristics/ICharacteristic.cs | 2 +- .../homekit/Characteristics/ICharacteristicProps.cs | 2 +- src/platforms/homekit/Events/EventEmitter.cs | 2 +- src/platforms/homekit/Events/IEventEmitter.cs | 2 +- ...HomeKit.csproj => Homer.Platform.HomeKit.csproj} | 0 src/platforms/homekit/Services/IService.cs | 2 +- src/platforms/homekit/Services/Service.cs | 2 +- 24 files changed, 45 insertions(+), 45 deletions(-) rename build/{Smarty.Build.csproj => Homer.Build.csproj} (100%) rename smarty.sln => homer.sln (92%) create mode 100644 src/core/Homer.Core.csproj delete mode 100644 src/core/Smarty.Core.csproj rename src/platforms/homekit/{Smarty.Platform.HomeKit.csproj => Homer.Platform.HomeKit.csproj} (100%) diff --git a/build/Build.cs b/build/Build.cs index 3eb3b79..8a25963 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -14,7 +14,7 @@ using static Bullseye.Targets; using static SimpleExec.Command; -namespace HypeEngine.Build +namespace Homer.Build { [Command(ThrowOnUnexpectedArgument = false)] [SuppressDefaultHelpOption] @@ -57,8 +57,8 @@ public void OnExecute(CommandLineApplication app) var projects = new [] { "contrib/uuid.net/uuid.net.csproj", - "src/platforms/homekit/Smarty.Platform.HomeKit.csproj", - "src/core/Smarty.Core.csproj" + "src/platforms/homekit/Homer.Platform.HomeKit.csproj", + "src/core/Homer.Core.csproj" }; var testProjects = new string[] diff --git a/build/Smarty.Build.csproj b/build/Homer.Build.csproj similarity index 100% rename from build/Smarty.Build.csproj rename to build/Homer.Build.csproj diff --git a/smarty.sln b/homer.sln similarity index 92% rename from smarty.sln rename to homer.sln index 0f56625..8562973 100644 --- a/smarty.sln +++ b/homer.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29709.97 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Core", "src\core\Smarty.Core.csproj", "{DA1CF614-7D2E-49BA-B27F-4334B964C2E0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Core", "src\core\Homer.Core.csproj", "{DA1CF614-7D2E-49BA-B27F-4334B964C2E0}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106}" EndProject @@ -11,9 +11,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Contrib", "Contrib", "{EA45 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED96F7FE-6FF3-4C84-9976-46D2C8557E8A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Platform.HomeKit", "src\platforms\homekit\Smarty.Platform.HomeKit.csproj", "{75D7361A-EEC0-489C-AA21-3B0511668D9D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Platform.HomeKit", "src\platforms\homekit\Homer.Platform.HomeKit.csproj", "{75D7361A-EEC0-489C-AA21-3B0511668D9D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smarty.Build", "build\Smarty.Build.csproj", "{270DC829-5D6A-4A10-AADF-1C5302651C19}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Build", "build\Homer.Build.csproj", "{270DC829-5D6A-4A10-AADF-1C5302651C19}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.net\uuid.net.csproj", "{A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}" EndProject diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj new file mode 100644 index 0000000..64c0c1d --- /dev/null +++ b/src/core/Homer.Core.csproj @@ -0,0 +1,13 @@ + + + + netcoreapp3.1 + Homer.Core + Homer.Core + + + + + + + diff --git a/src/core/Smarty.Core.csproj b/src/core/Smarty.Core.csproj deleted file mode 100644 index 33ca59b..0000000 --- a/src/core/Smarty.Core.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netcoreapp3.1 - Smarty.Core - Smarty.Core - - - - - - - diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index dee33e0..968f7d8 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Platform.HomeKit.Bridges; -using Smarty.Platform.HomeKit.Services; +using Homer.Platform.HomeKit.Bridges; +using Homer.Platform.HomeKit.Services; -namespace Smarty.Platform.HomeKit.Accessories +namespace Homer.Platform.HomeKit.Accessories { public class Accessory : IAccessory { diff --git a/src/platforms/homekit/Accessories/AccessoryCategory.cs b/src/platforms/homekit/Accessories/AccessoryCategory.cs index 08fccc3..8363459 100644 --- a/src/platforms/homekit/Accessories/AccessoryCategory.cs +++ b/src/platforms/homekit/Accessories/AccessoryCategory.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Accessories +namespace Homer.Platform.HomeKit.Accessories { /// /// Accessory categories diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index ccd341e..bf3ae26 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -1,6 +1,6 @@ -using Smarty.Platform.HomeKit.Bridges; +using Homer.Platform.HomeKit.Bridges; -namespace Smarty.Platform.HomeKit.Accessories +namespace Homer.Platform.HomeKit.Accessories { /// /// Accessory interface. diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 5ab6492..4225762 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using DaanV2.UUID; -using Smarty.Platform.HomeKit.Services; +using Homer.Platform.HomeKit.Services; -namespace Smarty.Platform.HomeKit.Accessories +namespace Homer.Platform.HomeKit.Accessories { /// /// Base accessory interface. diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index a252900..2e3fc5c 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; -using Smarty.Platform.HomeKit.Accessories; -using Smarty.Platform.HomeKit.Services; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Services; -namespace Smarty.Platform.HomeKit.Bridges +namespace Homer.Platform.HomeKit.Bridges { public class Bridge : IBridge { diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index 8306a59..2606420 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using Smarty.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Accessories; -namespace Smarty.Platform.HomeKit.Bridges +namespace Homer.Platform.HomeKit.Bridges { /// /// Bridge interface. diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index f847fdc..bdfaf49 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using DaanV2.UUID; -using Smarty.Platform.HomeKit.Events; +using Homer.Platform.HomeKit.Events; -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProps { diff --git a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs index 7d21ee4..a7e0f02 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { // Data presentation formats. public enum CharacteristicFormat diff --git a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs index db76ce6..57154dc 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { /// /// Characteristic permissions diff --git a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs index 125f065..1f273a4 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { /// /// Data units. diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs index 50ef76d..2857604 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Smarty.Platform.HomeKit.Characteristics.Definitions +namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AccessoryFlags : Characteristic { diff --git a/src/platforms/homekit/Characteristics/Definitions/Name.cs b/src/platforms/homekit/Characteristics/Definitions/Name.cs index 89edd35..d5be52a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/Name.cs +++ b/src/platforms/homekit/Characteristics/Definitions/Name.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Smarty.Platform.HomeKit.Characteristics.Definitions +namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class Name : Characteristic { diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index d5d91f9..ec293ca 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -1,6 +1,6 @@ using DaanV2.UUID; -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { /// /// A characteristic is a feature that represents data or an associated behavior of a service. The characteristic is defined diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs index 519e75d..f9c3570 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Smarty.Platform.HomeKit.Characteristics +namespace Homer.Platform.HomeKit.Characteristics { public interface ICharacteristicProps { diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/src/platforms/homekit/Events/EventEmitter.cs index 071bfe8..a99a5a8 100644 --- a/src/platforms/homekit/Events/EventEmitter.cs +++ b/src/platforms/homekit/Events/EventEmitter.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Events +namespace Homer.Platform.HomeKit.Events { public class EventEmitter : IEventEmitter { diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/src/platforms/homekit/Events/IEventEmitter.cs index 7ff9d38..2e696f4 100644 --- a/src/platforms/homekit/Events/IEventEmitter.cs +++ b/src/platforms/homekit/Events/IEventEmitter.cs @@ -1,4 +1,4 @@ -namespace Smarty.Platform.HomeKit.Events +namespace Homer.Platform.HomeKit.Events { public interface IEventEmitter { diff --git a/src/platforms/homekit/Smarty.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj similarity index 100% rename from src/platforms/homekit/Smarty.Platform.HomeKit.csproj rename to src/platforms/homekit/Homer.Platform.HomeKit.csproj diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index a4cf931..16e092e 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -1,6 +1,6 @@ using DaanV2.UUID; -namespace Smarty.Platform.HomeKit.Services +namespace Homer.Platform.HomeKit.Services { /// /// Interface for HomeKit services. diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index a00fc48..b1edb61 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -1,7 +1,7 @@ using System; using DaanV2.UUID; -namespace Smarty.Platform.HomeKit.Services +namespace Homer.Platform.HomeKit.Services { public class Service : IService { From 0c4efe4aec06ad945fcef962c03794fcf997d972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Wed, 5 Feb 2020 17:21:12 +0300 Subject: [PATCH 011/152] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ecb23d..1a46e69 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# smarty \ No newline at end of file +### Homer +The complete home automation for Homer Simpson. From 29c5e198b4a9484d17f00bcafcf64c2ce18a8631 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 5 Feb 2020 18:30:43 +0300 Subject: [PATCH 012/152] implemented ientity. more characteristics work. --- build/Build.cs | 3 +- homer.sln | 17 +++++++++ src/core/Homer.Core.csproj | 4 --- .../homekit/Accessories/IAccessory.cs | 1 + .../homekit/Accessories/IAccessoryBase.cs | 13 ++----- src/platforms/homekit/Bridges/Bridge.cs | 1 + src/platforms/homekit/Bridges/IBridge.cs | 1 + .../homekit/Characteristics/Characteristic.cs | 11 ++++-- ...ags.cs => AccessoryFlagsCharacteristic.cs} | 4 +-- .../Definitions/ManufacturerCharacteristic.cs | 20 +++++++++++ .../Definitions/ModelCharacteristic.cs | 20 +++++++++++ .../{Name.cs => NameCharacteristic.cs} | 4 +-- .../Definitions/SerialNumberCharacteristic.cs | 20 +++++++++++ .../Characteristics/ICharacteristic.cs | 2 ++ src/platforms/homekit/Entity/IEntity.cs | 20 +++++++++++ src/platforms/homekit/Services/IService.cs | 18 +++++----- src/platforms/homekit/Services/Service.cs | 35 +++++++++++++++++++ src/server/Homer.Server.csproj | 14 ++++++++ src/server/Program.cs | 27 ++++++++++++++ 19 files changed, 202 insertions(+), 33 deletions(-) rename src/platforms/homekit/Characteristics/Definitions/{AccessoryFlags.cs => AccessoryFlagsCharacteristic.cs} (78%) create mode 100644 src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs rename src/platforms/homekit/Characteristics/Definitions/{Name.cs => NameCharacteristic.cs} (79%) create mode 100644 src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs create mode 100644 src/platforms/homekit/Entity/IEntity.cs create mode 100644 src/server/Homer.Server.csproj create mode 100644 src/server/Program.cs diff --git a/build/Build.cs b/build/Build.cs index 8a25963..66963bb 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -58,7 +58,8 @@ public void OnExecute(CommandLineApplication app) { "contrib/uuid.net/uuid.net.csproj", "src/platforms/homekit/Homer.Platform.HomeKit.csproj", - "src/core/Homer.Core.csproj" + "src/core/Homer.Core.csproj", + "src/server/Homer.Server.csproj" }; var testProjects = new string[] diff --git a/homer.sln b/homer.sln index 8562973..f89311d 100644 --- a/homer.sln +++ b/homer.sln @@ -17,6 +17,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Build", "build\Homer. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.net\uuid.net.csproj", "{A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{44EBF15C-12ED-47D3-9005-D5B0C3A74EC4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Server", "src\server\Homer.Server.csproj", "{BBB13930-B43C-4332-B005-9DCCF09DD418}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -75,6 +79,18 @@ Global {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.Build.0 = Release|Any CPU {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.ActiveCfg = Release|Any CPU {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.Build.0 = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x64.ActiveCfg = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x64.Build.0 = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x86.ActiveCfg = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x86.Build.0 = Debug|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|Any CPU.Build.0 = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x64.ActiveCfg = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x64.Build.0 = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x86.ActiveCfg = Release|Any CPU + {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -83,6 +99,7 @@ Global {DA1CF614-7D2E-49BA-B27F-4334B964C2E0} = {9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106} {75D7361A-EEC0-489C-AA21-3B0511668D9D} = {ED96F7FE-6FF3-4C84-9976-46D2C8557E8A} {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} + {BBB13930-B43C-4332-B005-9DCCF09DD418} = {44EBF15C-12ED-47D3-9005-D5B0C3A74EC4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj index 64c0c1d..9ac4763 100644 --- a/src/core/Homer.Core.csproj +++ b/src/core/Homer.Core.csproj @@ -6,8 +6,4 @@ Homer.Core - - - - diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index bf3ae26..672de01 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -1,4 +1,5 @@ using Homer.Platform.HomeKit.Bridges; +using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Accessories { diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 4225762..eeaa12c 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using DaanV2.UUID; +using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; namespace Homer.Platform.HomeKit.Accessories @@ -7,18 +8,8 @@ namespace Homer.Platform.HomeKit.Accessories /// /// Base accessory interface. /// - public interface IAccessoryBase + public interface IAccessoryBase : IEntity { - /// - /// UUID of the accessory. - /// - public UUID Uuid { get; } - - /// - /// Display name of the accessory. - /// - public string DisplayName { get; } - /// /// true if we are hosted "behind" a Bridge Accessory /// diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index 2e3fc5c..f594470 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -3,6 +3,7 @@ using System.Collections.ObjectModel; using DaanV2.UUID; using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; namespace Homer.Platform.HomeKit.Bridges diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index 2606420..54ae0c8 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Bridges { diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index bdfaf49..4d02c6a 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -14,7 +14,7 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp public string DisplayName { get; } /// - public dynamic Value { get; } + public dynamic Value { get; private set; } /// public IReadOnlyList Permissions { get; } @@ -64,8 +64,6 @@ protected Characteristic(string uuid, string displayName, CharacteristicFormat f if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; else throw new ArgumentException("Characteristics must be created with a non-empty displayName.", nameof(displayName)); - Value = GetDefaultValue(); - Permissions = permissions ?? throw new ArgumentNullException(nameof(permissions)); if (Permissions.Count == 0) throw new ArgumentException("Characteristics must have permissions defined.", nameof(displayName)); @@ -81,6 +79,13 @@ protected Characteristic(string uuid, string displayName, CharacteristicFormat f MaxDataLength = maxDataLength; ValidValues = validValues; ValidValuesRange = validValuesRange; + + Value = GetDefaultValue(); + } + + public void SetValue(dynamic value) + { + Value = value; } private dynamic GetDefaultValue() diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs similarity index 78% rename from src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs rename to src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index 2857604..f45bbd9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlags.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -2,9 +2,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class AccessoryFlags : Characteristic + public class AccessoryFlagsCharacteristic : Characteristic { - public AccessoryFlags() : base( + public AccessoryFlagsCharacteristic() : base( "000000A6-0000-1000-8000-0026BB765291", "Accessory Flags", CharacteristicFormat.Uint32, diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs new file mode 100644 index 0000000..4d9f575 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ManufacturerCharacteristic : Characteristic + { + public ManufacturerCharacteristic() : base( + "00000020-0000-1000-8000-0026BB765291", + "Manufacturer", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs new file mode 100644 index 0000000..aaf2bb1 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ModelCharacteristic : Characteristic + { + public ModelCharacteristic() : base( + "00000021-0000-1000-8000-0026BB765291", + "Model", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/Name.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs similarity index 79% rename from src/platforms/homekit/Characteristics/Definitions/Name.cs rename to src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index d5be52a..da7ad47 100644 --- a/src/platforms/homekit/Characteristics/Definitions/Name.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -2,9 +2,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class Name : Characteristic + public class NameCharacteristic : Characteristic { - public Name() : base( + public NameCharacteristic() : base( "00000023-0000-1000-8000-0026BB765291", "Name", CharacteristicFormat.String, diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs new file mode 100644 index 0000000..40949b0 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SerialNumberCharacteristic : Characteristic + { + public SerialNumberCharacteristic() : base( + "00000030-0000-1000-8000-0026BB765291", + "Serial Number", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index ec293ca..11a4837 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -25,5 +25,7 @@ public interface ICharacteristic /// Paired Read permission, see Table 6-4 (page 56). /// public dynamic Value { get; } + + public void SetValue(dynamic value); } } diff --git a/src/platforms/homekit/Entity/IEntity.cs b/src/platforms/homekit/Entity/IEntity.cs new file mode 100644 index 0000000..942b1a1 --- /dev/null +++ b/src/platforms/homekit/Entity/IEntity.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; +using DaanV2.UUID; + +namespace Homer.Platform.HomeKit.Entity +{ + public interface IEntity + { + /// + /// UUID of the entity. + /// + public UUID Uuid { get; } + + /// + /// Display name of the entity. + /// + public string DisplayName { get; } + } +} diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 16e092e..b17f68a 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -1,20 +1,18 @@ -using DaanV2.UUID; +using System; +using System.Collections.Generic; +using DaanV2.UUID; +using Homer.Platform.HomeKit.Characteristics; +using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Services { /// /// Interface for HomeKit services. /// - public interface IService + public interface IService: IEntity { - /// - /// UUID of the service. - /// - public UUID Uuid { get; } + public IReadOnlyDictionary Characteristics { get; } - /// - /// Display name of the service. - /// - public string DisplayName { get; } + public IService SetCharacteristic(Type t, dynamic value); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index b1edb61..b7b78a5 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -1,5 +1,10 @@ using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; using DaanV2.UUID; +using Homer.Platform.HomeKit.Characteristics; +using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Services { @@ -11,6 +16,13 @@ public class Service : IService /// public string DisplayName { get; } + public IReadOnlyDictionary Characteristics { get; } + + /// + /// internal list of characteristics. + /// + private readonly Dictionary _characteristics; + public Service(string uuid, string displayName) { Uuid = uuid ?? throw new ArgumentException("Service must be created with a valid UUID.", nameof(uuid)); @@ -18,6 +30,29 @@ public Service(string uuid, string displayName) if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; else throw new ArgumentException("Services must be created with a non-empty displayName.", nameof(displayName)); + + _characteristics = new Dictionary(); + Characteristics = new ReadOnlyDictionary(_characteristics); + + SetCharacteristic(typeof(NameCharacteristic), displayName); // set Characteristic.Name to given displayName. + } + + public IService SetCharacteristic(Type t, dynamic value) + { + var characteristic = GetCharacteristic(t) ?? AddCharacteristic((ICharacteristic)Activator.CreateInstance(t)); + characteristic.SetValue(value); + return this; // allow chaining. + } + + private ICharacteristic GetCharacteristic(Type characteristic) + { + return _characteristics.ContainsKey(characteristic) ? _characteristics[characteristic] : null; + } + + private ICharacteristic AddCharacteristic(ICharacteristic characteristic) + { + _characteristics.Add(characteristic.GetType(), characteristic); + return characteristic; } } } diff --git a/src/server/Homer.Server.csproj b/src/server/Homer.Server.csproj new file mode 100644 index 0000000..c1cb060 --- /dev/null +++ b/src/server/Homer.Server.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + diff --git a/src/server/Program.cs b/src/server/Program.cs new file mode 100644 index 0000000..2cbd6bf --- /dev/null +++ b/src/server/Program.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading.Tasks; +using DaanV2.UUID; +using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Services; + +namespace Homer.Server +{ + public class Program + { + public static async Task Main(string[] args) + { + try + { + var uuid = UUIDFactory.CreateUUID(4, 2); + var service = new Service(uuid, "test") + .SetCharacteristic(typeof(ManufacturerCharacteristic), "Default - Manufacturer") + .SetCharacteristic(typeof(ModelCharacteristic), "Default-Model") + .SetCharacteristic(typeof(SerialNumberCharacteristic), "Default-SerialNumber"); + } + catch (Exception e) + { + + } + } + } +} From f6131c2517091d669a2286b5ef1a0d25c6466b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 14:07:14 +0300 Subject: [PATCH 013/152] Create LICENSE --- LICENSE | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ec5eb69 --- /dev/null +++ b/LICENSE @@ -0,0 +1,36 @@ +“Commons Clause” License Condition v1.0 + +The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. + +Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software. + +For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice. + +Software: Homer +License: MIT License +Licensor: Hüseyin Uslu + +--- + +MIT License + +Homer, Copyright (C) 2020, Hüseyin Uslu, shalafiraistlin at gmail dot com +https://github.com/bonesoul/homer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 51e76b468befa27d2c29d7b7628edb223675c102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 14:09:20 +0300 Subject: [PATCH 014/152] Update README.md --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1a46e69..ac6012f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,40 @@ -### Homer -The complete home automation for Homer Simpson. +

homer

+ +
+ :rocket::zap::sparkles: +
+
+ The complete home automation for Homer Simpson. +
+ +
+ + + +
+ Built with ❤︎ by Hüseyin Uslu. +
+ +## About + +homer is code-first home & office automation system allowing complex interactions between accessories. + +## Requirements + + - dotnet core 3.1 + +## Tests + +``` +dotnet test +``` + +## Building + +``` +./build.sh +``` From 5c7ac4b63ccf3960ccb2d26dad485a875113de63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 14:10:02 +0300 Subject: [PATCH 015/152] Update LICENSE --- LICENSE | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ec5eb69..6ecd440 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,8 @@ The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software. +Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +does not grant to you, the right to Sell the Software. For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice. From 25663255c294d73143e1fadeee1c7e77057cad98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 14:10:14 +0300 Subject: [PATCH 016/152] Update LICENSE --- LICENSE | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 6ecd440..a5b0de8 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,10 @@ The Software is provided to you by the Licensor under the License, as defined be Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software. -For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice. +For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license +notice or attribution required by the License must also include this Commons Clause License Condition notice. Software: Homer License: MIT License From 433f82b0074a580d7ffb7accf2e0a850de0fa305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 14:10:59 +0300 Subject: [PATCH 017/152] Rename changelog.md to CHANGELOG.md --- changelog.md => CHANGELOG.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.md => CHANGELOG.md (100%) diff --git a/changelog.md b/CHANGELOG.md similarity index 100% rename from changelog.md rename to CHANGELOG.md From 90851cc57e3a69f9175e69547328a92ee991f117 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 14:20:05 +0300 Subject: [PATCH 018/152] updated license texts. --- build/Build.cs | 22 ++++++++++++---- .../homekit/Accessories/Accessory.cs | 24 +++++++++++++++++- .../homekit/Accessories/AccessoryCategory.cs | 24 +++++++++++++++++- .../homekit/Accessories/IAccessory.cs | 25 +++++++++++++++++-- .../homekit/Accessories/IAccessoryBase.cs | 25 +++++++++++++++++-- src/platforms/homekit/Bridges/Bridge.cs | 25 +++++++++++++++++-- src/platforms/homekit/Bridges/IBridge.cs | 25 +++++++++++++++++-- .../homekit/Characteristics/Characteristic.cs | 24 +++++++++++++++++- .../Characteristics/CharacteristicFormat.cs | 24 +++++++++++++++++- .../CharacteristicPermission.cs | 24 +++++++++++++++++- .../Characteristics/CharacteristicUnit.cs | 24 +++++++++++++++++- .../AccessoryFlagsCharacteristic.cs | 24 +++++++++++++++++- .../Definitions/ManufacturerCharacteristic.cs | 24 ++++++++++++++++-- .../Definitions/ModelCharacteristic.cs | 24 ++++++++++++++++-- .../Definitions/NameCharacteristic.cs | 24 +++++++++++++++++- .../Definitions/SerialNumberCharacteristic.cs | 24 ++++++++++++++++-- .../Characteristics/ICharacteristic.cs | 24 +++++++++++++++++- .../Characteristics/ICharacteristicProps.cs | 24 +++++++++++++++++- src/platforms/homekit/Entity/IEntity.cs | 25 ++++++++++++++++--- src/platforms/homekit/Events/EventEmitter.cs | 24 +++++++++++++++++- src/platforms/homekit/Events/IEventEmitter.cs | 24 +++++++++++++++++- src/platforms/homekit/Services/IService.cs | 25 +++++++++++++++++-- src/platforms/homekit/Services/Service.cs | 25 +++++++++++++++++-- src/server/Program.cs | 24 +++++++++++++++++- 24 files changed, 542 insertions(+), 39 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index 66963bb..923ce02 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -1,11 +1,23 @@ #region license // -// hypeengine +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer // -// Copyright (c) 2016 - 2019, Int6ware -// -// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. -// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu #endregion using System.IO; diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index 968f7d8..6e93673 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -1,4 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; diff --git a/src/platforms/homekit/Accessories/AccessoryCategory.cs b/src/platforms/homekit/Accessories/AccessoryCategory.cs index 8363459..4bdb9d7 100644 --- a/src/platforms/homekit/Accessories/AccessoryCategory.cs +++ b/src/platforms/homekit/Accessories/AccessoryCategory.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Accessories +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Accessories { /// /// Accessory categories diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index 672de01..70d4d83 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -1,5 +1,26 @@ -using Homer.Platform.HomeKit.Bridges; -using Homer.Platform.HomeKit.Entity; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Bridges; namespace Homer.Platform.HomeKit.Accessories { diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index eeaa12c..506297d 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -1,5 +1,26 @@ -using System.Collections.Generic; -using DaanV2.UUID; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index f594470..06bd84b 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -1,9 +1,30 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; namespace Homer.Platform.HomeKit.Bridges diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index 54ae0c8..75c39cd 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -1,6 +1,27 @@ -using System.Collections.Generic; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Bridges { diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 4d02c6a..20c70c3 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -1,4 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Collections.Generic; using DaanV2.UUID; using Homer.Platform.HomeKit.Events; diff --git a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs index a7e0f02..2851da4 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Characteristics +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Characteristics { // Data presentation formats. public enum CharacteristicFormat diff --git a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs index 57154dc..e945958 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Characteristics +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Characteristics { /// /// Characteristic permissions diff --git a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs index 1f273a4..691bab3 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Characteristics +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Characteristics { /// /// Data units. diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index f45bbd9..96d60b7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -1,4 +1,26 @@ -using System.Collections.Generic; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; namespace Homer.Platform.HomeKit.Characteristics.Definitions { diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index 4d9f575..c5570be 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -1,6 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using System.Collections.Generic; -using System.Text; namespace Homer.Platform.HomeKit.Characteristics.Definitions { diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs index aaf2bb1..3ee23b5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -1,6 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using System.Collections.Generic; -using System.Text; namespace Homer.Platform.HomeKit.Characteristics.Definitions { diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index da7ad47..4e2973a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -1,4 +1,26 @@ -using System.Collections.Generic; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; namespace Homer.Platform.HomeKit.Characteristics.Definitions { diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs index 40949b0..763d096 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -1,6 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using System.Collections.Generic; -using System.Text; namespace Homer.Platform.HomeKit.Characteristics.Definitions { diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 11a4837..de143e2 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -1,4 +1,26 @@ -using DaanV2.UUID; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using DaanV2.UUID; namespace Homer.Platform.HomeKit.Characteristics { diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs index f9c3570..0fa043f 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -1,4 +1,26 @@ -using System.Collections.Generic; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; namespace Homer.Platform.HomeKit.Characteristics { diff --git a/src/platforms/homekit/Entity/IEntity.cs b/src/platforms/homekit/Entity/IEntity.cs index 942b1a1..de4f47b 100644 --- a/src/platforms/homekit/Entity/IEntity.cs +++ b/src/platforms/homekit/Entity/IEntity.cs @@ -1,6 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Text; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using DaanV2.UUID; namespace Homer.Platform.HomeKit.Entity diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/src/platforms/homekit/Events/EventEmitter.cs index a99a5a8..f76b69c 100644 --- a/src/platforms/homekit/Events/EventEmitter.cs +++ b/src/platforms/homekit/Events/EventEmitter.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Events +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Events { public class EventEmitter : IEventEmitter { diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/src/platforms/homekit/Events/IEventEmitter.cs index 2e696f4..cea5f82 100644 --- a/src/platforms/homekit/Events/IEventEmitter.cs +++ b/src/platforms/homekit/Events/IEventEmitter.cs @@ -1,4 +1,26 @@ -namespace Homer.Platform.HomeKit.Events +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Events { public interface IEventEmitter { diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index b17f68a..318ebd2 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -1,6 +1,27 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Collections.Generic; -using DaanV2.UUID; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Entity; diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index b7b78a5..0e9c857 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -1,10 +1,31 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using DaanV2.UUID; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; -using Homer.Platform.HomeKit.Entity; namespace Homer.Platform.HomeKit.Services { diff --git a/src/server/Program.cs b/src/server/Program.cs index 2cbd6bf..00a4f5f 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -1,4 +1,26 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third +// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the +// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license +// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Threading.Tasks; using DaanV2.UUID; using Homer.Platform.HomeKit.Characteristics.Definitions; From ab436a415e5a0811fa70f68b2c0907cf54faa13f Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 14:22:30 +0300 Subject: [PATCH 019/152] updated license texts. --- build/Build.cs | 9 +++++---- src/platforms/homekit/Accessories/Accessory.cs | 9 +++++---- src/platforms/homekit/Accessories/AccessoryCategory.cs | 9 +++++---- src/platforms/homekit/Accessories/IAccessory.cs | 9 +++++---- src/platforms/homekit/Accessories/IAccessoryBase.cs | 9 +++++---- src/platforms/homekit/Bridges/Bridge.cs | 9 +++++---- src/platforms/homekit/Bridges/IBridge.cs | 9 +++++---- src/platforms/homekit/Characteristics/Characteristic.cs | 9 +++++---- .../homekit/Characteristics/CharacteristicFormat.cs | 9 +++++---- .../homekit/Characteristics/CharacteristicPermission.cs | 9 +++++---- .../homekit/Characteristics/CharacteristicUnit.cs | 9 +++++---- .../Definitions/AccessoryFlagsCharacteristic.cs | 9 +++++---- .../Definitions/ManufacturerCharacteristic.cs | 9 +++++---- .../Characteristics/Definitions/ModelCharacteristic.cs | 9 +++++---- .../Characteristics/Definitions/NameCharacteristic.cs | 9 +++++---- .../Definitions/SerialNumberCharacteristic.cs | 9 +++++---- src/platforms/homekit/Characteristics/ICharacteristic.cs | 9 +++++---- .../homekit/Characteristics/ICharacteristicProps.cs | 9 +++++---- src/platforms/homekit/Entity/IEntity.cs | 9 +++++---- src/platforms/homekit/Events/EventEmitter.cs | 9 +++++---- src/platforms/homekit/Events/IEventEmitter.cs | 9 +++++---- src/platforms/homekit/Services/IService.cs | 9 +++++---- src/platforms/homekit/Services/Service.cs | 9 +++++---- src/server/Program.cs | 9 +++++---- 24 files changed, 120 insertions(+), 96 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index 923ce02..2063dbe 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index 6e93673..3b4bb4b 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Accessories/AccessoryCategory.cs b/src/platforms/homekit/Accessories/AccessoryCategory.cs index 4bdb9d7..4a0cd20 100644 --- a/src/platforms/homekit/Accessories/AccessoryCategory.cs +++ b/src/platforms/homekit/Accessories/AccessoryCategory.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index 70d4d83..2688bb8 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 506297d..3d1ded2 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index 06bd84b..7092337 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index 75c39cd..b3119ef 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 20c70c3..4e016a0 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs index 2851da4..e06187e 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicFormat.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs index e945958..4fa2485 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicPermission.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs index 691bab3..9c8e4dc 100644 --- a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs +++ b/src/platforms/homekit/Characteristics/CharacteristicUnit.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index 96d60b7..a7c1752 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index c5570be..acfe36e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs index 3ee23b5..9b77465 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index 4e2973a..18e5c8a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs index 763d096..d7ffae9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index de143e2..44f5cb4 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs index 0fa043f..7e08c2f 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Entity/IEntity.cs b/src/platforms/homekit/Entity/IEntity.cs index de4f47b..6dd7193 100644 --- a/src/platforms/homekit/Entity/IEntity.cs +++ b/src/platforms/homekit/Entity/IEntity.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/src/platforms/homekit/Events/EventEmitter.cs index f76b69c..d8a688a 100644 --- a/src/platforms/homekit/Events/EventEmitter.cs +++ b/src/platforms/homekit/Events/EventEmitter.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/src/platforms/homekit/Events/IEventEmitter.cs index cea5f82..16e4bb5 100644 --- a/src/platforms/homekit/Events/IEventEmitter.cs +++ b/src/platforms/homekit/Events/IEventEmitter.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 318ebd2..c8b62dc 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index 0e9c857..df65462 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu diff --git a/src/server/Program.cs b/src/server/Program.cs index 00a4f5f..66d31ab 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -11,10 +11,11 @@ // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third -// parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the -// Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software.Any license -// notice or attribution required by the License must also include this Commons Clause License Condition notice. +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. // // License: MIT License // Licensor: Hüseyin Uslu From 79d72b265f310fd27d7d966b5cd62aced9c594b0 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 14:36:27 +0300 Subject: [PATCH 020/152] added optional characteristics to services. --- .../Characteristics/ICharacteristic.cs | 6 +++ src/platforms/homekit/Services/IService.cs | 48 ++++++++++++++++++- src/platforms/homekit/Services/Service.cs | 37 ++++++++++++-- 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 44f5cb4..f958325 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -29,6 +29,12 @@ namespace Homer.Platform.HomeKit.Characteristics /// A characteristic is a feature that represents data or an associated behavior of a service. The characteristic is defined /// by a universally unique type, and has additional properties that determine how the value of the characteristic can be /// accessed. + /// + /// + /// After an accessory has a pairing, only the values of the Value (”value”) and Event Notifications (”ev”) properties are + /// allowed to change. + /// + /// /// public interface ICharacteristic { diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index c8b62dc..017ee8e 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -29,12 +29,58 @@ namespace Homer.Platform.HomeKit.Services { /// - /// Interface for HomeKit services. + /// Services group functionality in order to provide context. In the aforementioned example accessory there are three + /// services: a fan service to interact with the ceiling fan, a light service to interact with the light, and a mister service to + /// interact with the spray mister. /// public interface IService: IEntity { + /// + /// instance IDs are numbers with a range of [1, 18446744073709551615] for IP accessories (see ”7.4.4.2 Instance IDs” + /// (page 122) for BLE accessories). These numbers are used to uniquely identify HAP accessory objects within an HAP + /// accessory server, or uniquely identify services, and characteristics within an HAP accessory object. The instance ID + /// for each object must be unique for the lifetime of the server/client pairing. + /// + public int InstanceId { get; } + + /// + /// Characteristics provided by the service. + /// public IReadOnlyDictionary Characteristics { get; } + /// + /// Optional Characteristics provided by the service. + /// + public IReadOnlyDictionary OptionalCharacteristics { get; } + + /// + /// Returns characteristic for given type. + /// + /// + /// + public ICharacteristic GetCharacteristic(Type characteristic); + + /// + /// Returns optional characteristic for given type. + /// + /// + /// + public ICharacteristic GetOptionalCharacteristic(Type characteristic); + + /// + /// Sets characteristic for given type. + /// + /// + /// + /// public IService SetCharacteristic(Type t, dynamic value); + + /// + /// Sets optional characteristic for given type. + /// + /// + /// + /// + public IService SetOptionalCharacteristic(Type t, dynamic value); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index df65462..0ed7e1b 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -38,12 +38,18 @@ public class Service : IService /// public string DisplayName { get; } + /// + public int InstanceId { get; } + + /// public IReadOnlyDictionary Characteristics { get; } - /// - /// internal list of characteristics. - /// + /// + public IReadOnlyDictionary OptionalCharacteristics { get; } + + // internal list of characteristics. private readonly Dictionary _characteristics; + private readonly Dictionary _optionalCharacteristics; public Service(string uuid, string displayName) { @@ -53,12 +59,25 @@ public Service(string uuid, string displayName) if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; else throw new ArgumentException("Services must be created with a non-empty displayName.", nameof(displayName)); + // set characteristics lists. _characteristics = new Dictionary(); + _optionalCharacteristics = new Dictionary(); Characteristics = new ReadOnlyDictionary(_characteristics); + OptionalCharacteristics = new ReadOnlyDictionary(_optionalCharacteristics); SetCharacteristic(typeof(NameCharacteristic), displayName); // set Characteristic.Name to given displayName. } + public ICharacteristic GetCharacteristic(Type characteristic) + { + return _characteristics.ContainsKey(characteristic) ? _characteristics[characteristic] : null; + } + + public ICharacteristic GetOptionalCharacteristic(Type characteristic) + { + return _optionalCharacteristics.ContainsKey(characteristic) ? _optionalCharacteristics[characteristic] : null; + } + public IService SetCharacteristic(Type t, dynamic value) { var characteristic = GetCharacteristic(t) ?? AddCharacteristic((ICharacteristic)Activator.CreateInstance(t)); @@ -66,9 +85,11 @@ public IService SetCharacteristic(Type t, dynamic value) return this; // allow chaining. } - private ICharacteristic GetCharacteristic(Type characteristic) + public IService SetOptionalCharacteristic(Type t, dynamic value) { - return _characteristics.ContainsKey(characteristic) ? _characteristics[characteristic] : null; + var characteristic = GetOptionalCharacteristic(t) ?? AddOptionalCharacteristic((ICharacteristic)Activator.CreateInstance(t)); + characteristic.SetValue(value); + return this; // allow chaining. } private ICharacteristic AddCharacteristic(ICharacteristic characteristic) @@ -76,5 +97,11 @@ private ICharacteristic AddCharacteristic(ICharacteristic characteristic) _characteristics.Add(characteristic.GetType(), characteristic); return characteristic; } + + private ICharacteristic AddOptionalCharacteristic(ICharacteristic characteristic) + { + _optionalCharacteristics.Add(characteristic.GetType(), characteristic); + return characteristic; + } } } From d85f77f17daa03952687a84c93607d0fe75be651 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 15:35:31 +0300 Subject: [PATCH 021/152] more service implementation. --- .../homekit/Accessories/IAccessory.cs | 2 +- .../homekit/Accessories/IAccessoryBase.cs | 8 +- .../homekit/Characteristics/Characteristic.cs | 3 + .../Characteristics/ICharacteristic.cs | 20 ++- .../Characteristics/ICharacteristicProps.cs | 24 ++-- src/platforms/homekit/Entity/IEntity.cs | 4 +- src/platforms/homekit/Events/EventEmitter.cs | 6 + src/platforms/homekit/Events/IEventEmitter.cs | 3 + src/platforms/homekit/Services/IService.cs | 75 +++++++++- src/platforms/homekit/Services/Service.cs | 134 ++++++++++++++++-- 10 files changed, 238 insertions(+), 41 deletions(-) diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index 2688bb8..76285f4 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -33,6 +33,6 @@ public interface IAccessory : IAccessoryBase /// /// if accessory is bridged, this property points to the bridge which bridges this accessory /// - public IBridge ParentBridge { get; } + IBridge ParentBridge { get; } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 3d1ded2..8dc6349 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -35,21 +35,21 @@ public interface IAccessoryBase : IEntity /// /// true if we are hosted "behind" a Bridge Accessory /// - public bool IsBridged { get; } + bool IsBridged { get; } /// /// Is accessory reachable? /// - public bool IsReacheable { get; } + bool IsReacheable { get; } /// /// Accessory category. /// - public AccessoryCategory Category { get; } + AccessoryCategory Category { get; } /// /// Services exposed by accessory. /// - public IReadOnlyList Services { get; } + IReadOnlyList Services { get; } } } diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 4e016a0..962aecc 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -33,6 +33,9 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp /// public UUID Uuid { get; } + /// + public int InstanceId { get; } + /// public string DisplayName { get; } diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index f958325..3e07192 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -41,20 +41,32 @@ public interface ICharacteristic /// /// UUID of the characteristic. /// - public UUID Uuid { get; } + UUID Uuid { get; } + + /// + /// instance IDs are numbers with a range of [1, 18446744073709551615] for IP accessories (see ”7.4.4.2 Instance IDs” + /// (page 122) for BLE accessories). These numbers are used to uniquely identify HAP accessory objects within an HAP + /// accessory server, or uniquely identify services, and characteristics within an HAP accessory object. The instance ID + /// for each object must be unique for the lifetime of the server/client pairing. + /// + int InstanceId { get; } /// /// Display name of the characteristic. /// - public string DisplayName { get; } + string DisplayName { get; } /// /// The value of the characteristic, which must conform to the ”format” property.The literal value null may also be used /// if the characteristic has no value.This property must be present if and only if the characteristic contains the /// Paired Read permission, see Table 6-4 (page 56). /// - public dynamic Value { get; } + dynamic Value { get; } - public void SetValue(dynamic value); + /// + /// Sets value for the characteristic. + /// + /// + void SetValue(dynamic value); } } diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs index 7e08c2f..628b2b3 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -30,41 +30,41 @@ public interface ICharacteristicProps /// /// Array of permission strings describing the capabilities of the characteristic. /// - public IReadOnlyList Permissions { get; } + IReadOnlyList Permissions { get; } /// /// (Optional) /// Boolean indicating if event notifications are enabled for this characteristic. /// - public bool EventNotificationsEnabled { get; } + bool EventNotificationsEnabled { get; } /// /// (Optional) /// String describing the characteristic on a manufacturer-specific basis, such as an indoor versus outdoor temperature reading. /// - public string Description { get; } + string Description { get; } /// /// Format of the value, e.g. ”float”. /// - public CharacteristicFormat Format { get; } + CharacteristicFormat Format { get; } /// /// Unit of the value, e.g. ”celsius” /// - public CharacteristicUnit Unit { get; } + CharacteristicUnit Unit { get; } /// /// (Optional) /// Minimum value for the characteristic, which is only appropriate for characteristics that have a format of ”int” or ”float”. /// - public dynamic MinValue { get; } + dynamic MinValue { get; } /// /// (Optional) /// Maximum value for the characteristic, which is only appropriate for characteristics that have a format of ”int” or ”float”. /// - public dynamic MaxValue { get; } + dynamic MaxValue { get; } /// /// (Optional) @@ -74,31 +74,31 @@ public interface ICharacteristicProps /// (e.g.a value of 10.150001 received on the accessory side with a ”Step Value” of 0.15 and a ”Minimum Value” of 10.0 needs /// to be interpreted as 10.15). /// - public dynamic MinStep { get; } + dynamic MinStep { get; } /// /// (Optional default: 64) /// Maximum number of characters if the format is ”string”. If this property is omitted for ”string” formats, then the default value is 64. /// The maximum value allowed is 256. /// - public int MaxLength { get; } + int MaxLength { get; } /// /// (Optional default: 2097152) /// Maximum number of characters if the format is ”data”. If this property is omitted for ”data” formats, then the default value is 2097152. /// - public int MaxDataLength { get; } + int MaxDataLength { get; } /// /// (Optional) /// An array of numbers where each element represents a valid value. /// - public IList ValidValues { get; } + IList ValidValues { get; } /// /// (Optional) /// A 2 element array representing the starting value and ending value of the range of valid values. /// - public dynamic[] ValidValuesRange { get; } + dynamic[] ValidValuesRange { get; } } } diff --git a/src/platforms/homekit/Entity/IEntity.cs b/src/platforms/homekit/Entity/IEntity.cs index 6dd7193..6aca525 100644 --- a/src/platforms/homekit/Entity/IEntity.cs +++ b/src/platforms/homekit/Entity/IEntity.cs @@ -30,11 +30,11 @@ public interface IEntity /// /// UUID of the entity. /// - public UUID Uuid { get; } + UUID Uuid { get; } /// /// Display name of the entity. /// - public string DisplayName { get; } + string DisplayName { get; } } } diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/src/platforms/homekit/Events/EventEmitter.cs index d8a688a..675a950 100644 --- a/src/platforms/homekit/Events/EventEmitter.cs +++ b/src/platforms/homekit/Events/EventEmitter.cs @@ -21,9 +21,15 @@ // Licensor: Hüseyin Uslu #endregion +using System; + namespace Homer.Platform.HomeKit.Events { public class EventEmitter : IEventEmitter { + public void OnEvent(EventHandler handler, T args) + { + handler?.Invoke(this, args); + } } } diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/src/platforms/homekit/Events/IEventEmitter.cs index 16e4bb5..f348573 100644 --- a/src/platforms/homekit/Events/IEventEmitter.cs +++ b/src/platforms/homekit/Events/IEventEmitter.cs @@ -21,9 +21,12 @@ // Licensor: Hüseyin Uslu #endregion +using System; + namespace Homer.Platform.HomeKit.Events { public interface IEventEmitter { + void OnEvent(EventHandler handler, T args); } } diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 017ee8e..ceb8c3b 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -41,31 +41,78 @@ public interface IService: IEntity /// accessory server, or uniquely identify services, and characteristics within an HAP accessory object. The instance ID /// for each object must be unique for the lifetime of the server/client pairing. /// - public int InstanceId { get; } + int InstanceId { get; } /// /// Characteristics provided by the service. /// - public IReadOnlyDictionary Characteristics { get; } + IReadOnlyDictionary Characteristics { get; } /// /// Optional Characteristics provided by the service. + /// + /// To maintain backward compatibility with earlier clients, any characteristics added in later versions of a service must + /// be optional.Later versions of a service must not change behaviors defined in previous versions of the service. + /// /// - public IReadOnlyDictionary OptionalCharacteristics { get; } + IReadOnlyDictionary OptionalCharacteristics { get; } + + /// + /// Accessories should list one of its services as the primary service. The primary service must match the primary function + /// of the accessory and must also match with the accessory category.An accessory must expose only one primary + /// service from its list of available services. + /// + bool IsPrimaryService { get; } + + /// + /// Accessories may specify the services that are to be hidden from users by a generic HomeKit application. Accessories + /// may expose several services that could be used to configure the accessory or to update firmware on the accessory, + /// these services should be marked as hidden.When all characteristics in a service are marked hidden then the service + /// must also be marked as hidden + /// + bool IsHiddenService { get; } + + /// + /// Linked services allows accessories to specify logical relationship between services. A service can link to one or more + /// services.A service must not link to itself.Service links have context and meaning only to the first level of services that + /// it links to.For example if Service A links to Service B, and service B links to Service C, this does not imply any relation + /// between Service A to Service C.If Service A also relates to Service C then Service Aʼs linked services must include + /// both Service B and Service C.Linked services allows applications to display logically grouped accessory controls in + /// the UI. + /// + List LinkedServices { get; } + + /// + /// Event for characteristics changes. + /// + event EventHandler CharacteristicChange; + + /// + /// Event for service configuration changes. + /// + event EventHandler ServiceConfigurationChange; /// /// Returns characteristic for given type. /// /// /// - public ICharacteristic GetCharacteristic(Type characteristic); + ICharacteristic GetCharacteristic(Type characteristic); /// /// Returns optional characteristic for given type. /// /// /// - public ICharacteristic GetOptionalCharacteristic(Type characteristic); + ICharacteristic GetOptionalCharacteristic(Type characteristic); + + IService AddCharacteristic(ICharacteristic characteristic); + + IService AddCharacteristic(Type t); + + IService AddOptionalCharacteristic(ICharacteristic characteristic); + + IService AddOptionalCharacteristic(Type t); /// /// Sets characteristic for given type. @@ -73,7 +120,7 @@ public interface IService: IEntity /// /// /// - public IService SetCharacteristic(Type t, dynamic value); + IService SetCharacteristic(Type t, dynamic value); /// /// Sets optional characteristic for given type. @@ -81,6 +128,20 @@ public interface IService: IEntity /// /// /// - public IService SetOptionalCharacteristic(Type t, dynamic value); + IService SetOptionalCharacteristic(Type t, dynamic value); + + IService RemoveCharacteristic(Type t); + + IService RemoveOptionalCharacteristic(Type t); + + bool CheckCharacteristic(Type t); + + bool CheckOptionalCharacteristic(Type t); + + ICharacteristic GetCharacteristicByInstanceId(int iid); + + ICharacteristic GetOptionalCharacteristicByInstanceId(int iid); + + IService ToHapJson(); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index 0ed7e1b..34d81b9 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -24,13 +24,15 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using DaanV2.UUID; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Events; namespace Homer.Platform.HomeKit.Services { - public class Service : IService + public class Service : EventEmitter, IService { /// public UUID Uuid { get; } @@ -47,10 +49,36 @@ public class Service : IService /// public IReadOnlyDictionary OptionalCharacteristics { get; } + /// + public bool IsPrimaryService { get; } + + /// + public bool IsHiddenService + { + get => _isHiddenService; + set + { + _isHiddenService = value; + OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. + } + } + + /// + public List LinkedServices { get; } + + /// + public event EventHandler CharacteristicChange; + + /// + public event EventHandler ServiceConfigurationChange; + // internal list of characteristics. private readonly Dictionary _characteristics; private readonly Dictionary _optionalCharacteristics; + // internally track if this is a hidden service. + private bool _isHiddenService; + public Service(string uuid, string displayName) { Uuid = uuid ?? throw new ArgumentException("Service must be created with a valid UUID.", nameof(uuid)); @@ -65,7 +93,12 @@ public Service(string uuid, string displayName) Characteristics = new ReadOnlyDictionary(_characteristics); OptionalCharacteristics = new ReadOnlyDictionary(_optionalCharacteristics); - SetCharacteristic(typeof(NameCharacteristic), displayName); // set Characteristic.Name to given displayName. + // set Characteristic.Name to given displayName. + SetCharacteristic(typeof(NameCharacteristic), displayName); + + IsPrimaryService = false; + IsHiddenService = false; + LinkedServices = new List(); } public ICharacteristic GetCharacteristic(Type characteristic) @@ -78,30 +111,109 @@ public ICharacteristic GetOptionalCharacteristic(Type characteristic) return _optionalCharacteristics.ContainsKey(characteristic) ? _optionalCharacteristics[characteristic] : null; } + public IService AddCharacteristic(ICharacteristic characteristic) + { + _characteristics.Add(characteristic.GetType(), characteristic); + OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. + return this; // allow chaining. + } + + public IService AddCharacteristic(Type t) + { + var characteristic = (ICharacteristic)Activator.CreateInstance(t); + AddCharacteristic(characteristic); + return this; // allow chaining. + } + + public IService AddOptionalCharacteristic(ICharacteristic characteristic) + { + _optionalCharacteristics.Add(characteristic.GetType(), characteristic); + OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. + return this; // allow chaining. + } + + public IService AddOptionalCharacteristic(Type t) + { + var optionalCharacteristic = (ICharacteristic)Activator.CreateInstance(t); + AddOptionalCharacteristic(optionalCharacteristic); + return this; // allow chaining. + } + public IService SetCharacteristic(Type t, dynamic value) { - var characteristic = GetCharacteristic(t) ?? AddCharacteristic((ICharacteristic)Activator.CreateInstance(t)); + var characteristic = GetCharacteristic(t); + + if (characteristic == null) + { + AddCharacteristic(t); + characteristic = GetCharacteristic(t); + } + characteristic.SetValue(value); return this; // allow chaining. } public IService SetOptionalCharacteristic(Type t, dynamic value) { - var characteristic = GetOptionalCharacteristic(t) ?? AddOptionalCharacteristic((ICharacteristic)Activator.CreateInstance(t)); - characteristic.SetValue(value); + var optionalCharacteristic = GetOptionalCharacteristic(t); + + if (optionalCharacteristic == null) + { + AddOptionalCharacteristic(t); + optionalCharacteristic = GetOptionalCharacteristic(t); + } + + optionalCharacteristic.SetValue(value); return this; // allow chaining. } - private ICharacteristic AddCharacteristic(ICharacteristic characteristic) + public IService RemoveCharacteristic(Type t) { - _characteristics.Add(characteristic.GetType(), characteristic); - return characteristic; + if (_characteristics.Any(x => x.Value.GetType() == t)) + { + _characteristics.Remove(t); + // TODO: remove listeners of characteristic too. + OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. + } + + return this; // allow chaining. } - private ICharacteristic AddOptionalCharacteristic(ICharacteristic characteristic) + public IService RemoveOptionalCharacteristic(Type t) { - _optionalCharacteristics.Add(characteristic.GetType(), characteristic); - return characteristic; + if (_optionalCharacteristics.Any(x => x.Value.GetType() == t)) + { + _optionalCharacteristics.Remove(t); + // TODO: remove listeners of characteristic too. + OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. + } + + return this; // allow chaining. + } + + public bool CheckCharacteristic(Type t) + { + return _characteristics.ContainsKey(t); + } + + public bool CheckOptionalCharacteristic(Type t) + { + return _optionalCharacteristics.ContainsKey(t); + } + + public ICharacteristic GetCharacteristicByInstanceId(int iid) + { + return (from x in _characteristics where x.Value.InstanceId == iid select x.Value).FirstOrDefault(); + } + + public ICharacteristic GetOptionalCharacteristicByInstanceId(int iid) + { + return (from x in _optionalCharacteristics where x.Value.InstanceId == iid select x.Value).FirstOrDefault(); + } + + public IService ToHapJson() + { + return this; // allow chaining. } } } From 6c55d40bb1b49ddcda008d45831a1e4b8884d048 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 15:38:09 +0300 Subject: [PATCH 022/152] tiny improvement in Characteristic.cs --- .../homekit/Characteristics/Characteristic.cs | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 962aecc..843f299 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -116,31 +116,20 @@ public void SetValue(dynamic value) private dynamic GetDefaultValue() { - switch (Format) + return Format switch { - case CharacteristicFormat.Bool: - return false; - case CharacteristicFormat.Int: - return 0; - case CharacteristicFormat.Float: - return 0; - case CharacteristicFormat.String: - return ""; - case CharacteristicFormat.Uint8: - return 0; - case CharacteristicFormat.Uint16: - return 0; - case CharacteristicFormat.Uint32: - return 0; - case CharacteristicFormat.Uint64: - return 0; - case CharacteristicFormat.Data: - return null; - case CharacteristicFormat.Tlv8: - return null; - default: - throw new ArgumentOutOfRangeException(); - } + CharacteristicFormat.Bool => (dynamic) false, + CharacteristicFormat.Int => 0, + CharacteristicFormat.Float => 0, + CharacteristicFormat.String => "", + CharacteristicFormat.Uint8 => 0, + CharacteristicFormat.Uint16 => 0, + CharacteristicFormat.Uint32 => 0, + CharacteristicFormat.Uint64 => 0, + CharacteristicFormat.Data => null, + CharacteristicFormat.Tlv8 => null, + _ => throw new ArgumentOutOfRangeException() + }; } } } From c27996d98ae908cc1f879381392cf09c0a843903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 15:39:04 +0300 Subject: [PATCH 023/152] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac6012f..16634dd 100644 --- a/README.md +++ b/README.md @@ -36,5 +36,7 @@ dotnet test ## Building ``` -./build.sh +Windows: .\build.cmd +Linux: ./build.sh +MacOS: ./build.sh ``` From 6484b1117b41f4f2a1e2b56c647c04cdb043194c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:00:39 +0300 Subject: [PATCH 024/152] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 16634dd..00bf9d5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@

homer

+ +
:rocket::zap::sparkles:
@@ -19,10 +21,14 @@ Built with ❤︎ by Hüseyin Uslu. -## About +## what is homer? homer is code-first home & office automation system allowing complex interactions between accessories. +## why? + +As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. + ## Requirements - dotnet core 3.1 From b0f769e40d71fb4fdbbc47c81b18e62510445597 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 16:03:38 +0300 Subject: [PATCH 025/152] added homer gifs. --- assets/images/homer/homer-lazy-1.gif | Bin 0 -> 463145 bytes assets/images/homer/homer-lazy-3.gif | Bin 0 -> 72276 bytes assets/images/homer/homer-lazy2-.gif | Bin 0 -> 874163 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/homer/homer-lazy-1.gif create mode 100644 assets/images/homer/homer-lazy-3.gif create mode 100644 assets/images/homer/homer-lazy2-.gif diff --git a/assets/images/homer/homer-lazy-1.gif b/assets/images/homer/homer-lazy-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..874b9afe32bb970be630a7bbc6a232275e3ed2f9 GIT binary patch literal 463145 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

3Ilb$m*N=MfIJ+#lE2& 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

NxWzI#t}RLad9_fL}}dGP}f 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%0D+dC9_n4Gypm5@1Q?1~f#xJ)EO1QUC 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

KY`>QrIqtT_NAVJO!HsE8zdusS58O2pe5AH! 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

l=AEK8*6U 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 +ctjGbG@*yB@`EP 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� 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≪3u=GKU=NH2%&pS%r10ztAA%B*>EYf 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

iM?W!jk<@R84?4kvN7twJP1VT+a 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�O2O)i}7+1fh?~^@Da*)0X4X zQ^cf=$awB@?$l!G5Wi9tGJ#S4Mi=GzZHMW+)!R86rbKx7iN)agw$m_OruJpmcJgZ) z^3m-tUSA>W&wiE9l$v~jW&n7=I|d-xJsDYk(C2-~4(|l+(p08FEtv;-o_)m;d`^ zK7`U+n;Nz2O)^V0M_y?4zJDUlNDH%UUtyV7)s-8VQF4krrv3orVDqlh?P;j<8mQ+S z($2v}-umY`o$~>A4pkFW$gOuL`i63Bw-=GhKKfEzH$o0YqJCUHa<;W*SYcMhY?k^QjwSFfkL@Usg zDjcF&WNTeB&{ny%>Y#$4e!VJ8KPFAW9&MB*UZ${ePcVW^fZ5hQuLs>e!ZUQ>VYz~F zX>nnN*;~VPFa0-$Lpy_F0xRk4G-V)dZ<^Ti;#Z1Oi1F*Ou#w4;l93gLn@YIb#K zse>yz*@yFvYF$_Xy#>F_R7ejiwA?K3|Ln&(ncH&v)P<^ZHt1z8xc$*CH(cq%6JJsf z>U^GCkYuV&p#rf?z35+vj`I5}h_%L3PPYKUfM9E3Xr5Wn(%q_@5x2*=0ks8JN}_k; zlw_hwDgJ^v3AY^?R)rthh=_N}$tUW}<=(t8u_QXp;4jhb(A~o2M`sx^7SRD(){0Ng zUTQpP3g(CxbiF!Sm=qDExiQrIema#nB(!zD^6S3VaMWQRjE9q_?XvCzdg*X(h0v=l3?8|I!bjf;Mpc-;*>Um;Y_bU%35u!5`a}?+_C-n&-0g!@B?dOZ^W?z9Ua^ zW$CySsINx&lqOfDtCi*@#?1`Em*R_%!I!2X&p3X4EH_hn@c8Zbb0XotqE;^FXSUZ% z3P1kjo4ustk0wX<2XH9qO>{mZ&qFU+0yr75Z3#N+nq{8OAEmpGG&^j4LS?&(bgW$I zV-=LEE*+o$`&?bRH4o%3VD@0iaVdc`;@!(uR)0tirF4%ig?oSLcP~bv&g3fuTKF#9 z%%DJ6v8Jdj@x+gk;a$tKd@df=jIE|qX)dkaDF;lNG#q%`uDVUFsV%G(&5?RGp>gi; z(K{eslyF2=K*$HnIp3Rv+2k(Be}Qtz!UB1mX2|FV`8jrDVSJU0O@(7S!m~dC$TJZ& zL?^v?N*aYG_`o+=M$GTriR5gvxFvxi&q}7ka=zYY>w6qsHX6tNtRQp?ri@9$!SNhO z8k6dO>y7C9Hqk|?M%i{bD3n8s@a5eV%eUbm?(tEqzgt^B*m%2d4l!OLB*-TOd9~`eD%2HNh?B{b#XVsVUs4i@tj2T zb$*;kr^#llY8+?9uaW7gNVDBHci>J8{|Apq_rQHp_8JPvc%iCnZ)@wp6E)>*zuH?| z96EYyXWlu~yz{M4@Q?AODLr_HEBjsX6{vhvH506MZY7o@ZUkQ)?zvaxW}UzGH7ltXM`pW3o{Xa|c7*=qadN!&b;E2JY$#zc4gVDSWz~rU|mQ9rrlfUZ!A)Jn=s+ z^^rI}gUWAG+i3dV?4{O&?KKi<0_L!Bnt7xMlOuU~S}H_6otfe`S%^lR?#(l*G_ra~ z*!}nev&{Q#O_}6-EX&p}&3l9_Ds~0t5%q_X7c!+!ewe3hatrgPUp+r=+Ls!MqO2Oq7u^eJw`z@HEmtIcG`$8ztS zrfIcAEl;%`_vsd0tX#zuMZ7Y+s`4Oq23WjPfD7Wt;rl3U`7(XF zZ6xjE+b^)#0)^pC{AIgTb0s40%HFn5cXQ*H@&Ad{?5kuYnr=Dqe)D>T<-BlxV=G&D z>C;|`nr@RlFZ$t)0i}~L1!FmiDwpJ1wJxbN5No+rK?=SVO_!C`vq$aIJcjXX@`=O{w!?JfuUgt({eTUZr4&K#y7RG^T>I?LyQlx6f%h>S zAp5v`1M2?t@t^V`F7ZVtk8YVv-d9f9DlN={T+49VO4Jfdb(Q12vt==JFFp0@jB;X1 ziqIKp1wEIG{fNOb)V*JcnI!XHx>Q+nTP0sn z;Pod2@=Q{W)uhJ97Q>&xIaE*{9V&m*Em5!Iag?CZFrXE?@c3m=CiMJsr@;KgFop{* zL9D2&)Y`;{#HsSU)WkDu`KzWsuEIp`WTqZ2i%B($eMLlYStfOyvpyqTXEM`cQb7kQ z=EsSVslqsrIgWr7fD>0Am8&u{vDzQp+iVce({u1(OA%!d#AU6<83=m@pe(g5Yai8AF7)J_!g${PB9V%M9~iG+VShsxkZhhrGarzQgJPWnbmK^n05$%3G|Up2bky0@ z)ZINfD-%P;Ma`>~85rMnhmS~f{ZIcMcL;wMS#$?M`zQ9yHXz|r6i;e$YpEkAawBi& z6u!@@uwz4TI(2#-8Q(guTBI2*h$%u@VqA;iE$&;w%o7#$}n)QE#k zoDvnmg6bGD&%6ayhw)brpvFzAkITRf1FUOvCnHc$C>g*R3*ZbWyP?PBT?0vate_(g z(=QdgY$y)?UCp+xWGNe8^iHF+@C;Irbv&}^vdOgk=h(HrpLAo~xByYmytbKizce<*x2xk9=Zv#Q60OUVy6PB>GsAgCaIb}7=A0diNAYkz9pa;5>S{w|Thf^z zUC;P3tK@+?%js()baHG#x3C5nW;a78?yIMf@FDZgudUxsSm!=v%QaL zJkL%zH8*u>d=2NfXeRmWb67Z98}yQ&9e~?6dLSwNTfrr(bx^h6No(5n@uiGc47+&z z#48+7B-TD6&J4U`lSMiC;~;60+FK}TL9eliAF}^v)smAhh;s#leFZC6hG!j_t-lHM zsORUk$wq&Oqs&p4CYqNZL?~SM>nZK^!f^t&zqNOKF!kBMHIT6l=MjIOP*&{N81wWG zLHf&?F@qo6Yo>rRyg&&1t?}Vo6QLx}57uIS8S`cKUp&Fq?%*O&vLQP0(lPW}3-*f# z>roE=X9$z?Ei+_*56-t_GN{>l;Aax|!n_;|7L{ELjQ9+ULFuDl1ML1XSb{YB6$<`0vPbNBLodRbNKcpYdV7o z2vLmVVGk2@oWP~j_FBk$0jM3}i2{^X41#^A;d-r~{LiZCnl^0^mBghCP8EHpP+XDF3adrm#;vK4W ze1T^g8UcN?IPR~E_d~dlxCdXbpz8`n8xW_^<6x&E5QzXPZv(f!x^3+M&%}b1^BJN% z=fX4)!IH2HVmu}vJPJyVMnI1vGc@idcSEc`!zQk21Po0UO9F7*d>FCBWr%~RF42P} z%KjO-{uETlt7V@iygc`U+-|Qjy#G=dW@0;UWw#H0_JkXz!;flixT{VxA>(}VvvM!E z^*@-|F7L`puaoe0)Rmg{ueJ6YIE`W^nIuejPP!B;0!ub&-;_VOCUJ!0KDjm}Y`JpB zN{J$x9G8^^BA`Q=qMTM_@WBD};~5xuvGxcYtVgE+pizJZzgTcmER-E9oFCV8yHpzh zBj$s386Z{C*)ve)>1G08*@8#Bzw%Fb{b;=k_4Gce|JGM zoxHOje=#MO9)iz~@W`(3@*^d_JdCH;c?{PZm51YBeoZo7e*5YGuEegAz<;7^cZ@ww zEO+E8{|gNPv}B@1?SYlEI`m?(_9r0x6wi~q&94@|nvVThlA^L!tA*4MmnaJtU09r2mu5rm{KVAst>04)I z+Tz^Vl#0!}1mhUa)SyXR<2}mD8qPbT8Ap;uMSzsp<4B`dRLWwUo|yi>cn&)N1d$Z@ z!cA#BUP6VPyqY$)&S}cVXN_ODA=y=C`w4IJ zhK;J^1=sR3?CV0CJh`i~aiT@`0z$e4cabX>;jDu4Rju=XFJv)C8l+%Nw`B#BK!UE+ zOo|u%m>N(JZxsta+EUDLHBQC|%N+@{(&5!TlZ6-BghV_9{73k%bsMiyN$pMbOmUuT zMdY=84#AB)6GT$s%3b{x@`KM`^{XRlTqy>Alzpt(`$M8J;og* zh)8Mx>ll#U6#Xek4b72n>UJ;TM}!wWlf9I5ozrlMj2P(=RxvvDbM)in40|O0Pah;t z!?UEb6eu0Ur}(u%*Ch^%f9SFyG~46zl^wJ#RJtr(mBEqR^ep`*=5_X3P21X)_A6%n zS3azGrtE`{5Yk@YIId_tE_m~&VSAoRJ&T+s@IT_kC08FaU74$Yqce zUq?L)*jT^rmcew_2kIchvIXjWU(V8!o2g!1`t*V?R&zfR-GhL5^)j)TVQqED!M~(SCz4lh z%^hur<1?o&5%~r)WBVcJzSBeMszbkUzY6!e{g&^)a5HmC$Tmu8)sAJP+@Kenqo6OQSpX0ejpH1M*bq+YSh-tw2>n(PKfb3_p}CtyexTwSub6q< z{H=Na?Q+iw4{mA!x%B+kk0F9KgyHU znn`88lxQ*Xn8-7HMKLo@`8fSOYU{gi%@O3F^}+nhD(mafh4oOJ6FgZ{koZA9AN+e!1D@S?~4zN3F} zR*azx@ClVbe$S9?zw9<2ezWkQzkyCkm=An+KlcB;^8RNiI{D1$j!R6M<n z^bZ=oy7oxm*Qc5Iat7$ZC_n)BD+?Qks-gbx3$-CwLp1RgJ!*ZV_&^sJ&A1v7GZPUr z;N)f(9VUa)_KfC(sASbf2YeGb|KUFJyI&zOA=c8BD^K^Y^KMh4-)3P=>dD!oZR?QS zN)P_)(5yS!v(hl*Z0+f8(BgT@e<-_jVXs;U zV^a*j(y|opSZW$N*QMe+g*KuMQ-Q7Gblq56%UsZQCf>>Yxj4~p z+I8g0WZQ+&m7f|PL)j}s^_{kICY_P|-aS9p`B5q6+q)7Y+i5HnKC>g70GxarH@wNhoxSa;F}6#8KDuMJ)_Bzwf`9>z#mlL z>vx|A*^&g`Jv8xdHaPEpFUL*!X{9hR`kkNT1sJuQPj|4@AxS{MN?DdDAZWOnxC1=8R}o6;P^+rq-(JYAX;*XOHc#&!p*UkQWOzOCp@t z6A{9JDC=N+EUqF^9R35tnSJ7x!Di^$j5u=#Ng)NelFYKo1A>Ry>pUC((p~PDgf1^k zv_-RHx~I2Y{5IJnNCZ0(a5+@Lj+nW|C zKZ!ac;Xz5URM2>8Nz9$AnwkEZtL$RVC1Wy4n;m&KmYeWU&a%lV{3sG>o_ z{Dlgl=;rvK^pyR{MF+jZKfjfj|1dr_1^b7kiGr6`l55H{I+n*T)~JxesGL83-1jUt zpqV41O>u-U*NTo=LQ~{8Fa>(JO}{emQrRb+-&2Vaf(8*ht9REpVo zq%oaz?4d{EQ#3QED4V29{}?JgsNMkH0wUh-lw_`01-PM%`Nd{D4q1}Kb1{iD$^#P5 zdlceV+v&UxUx?+mS95s`y0A)hl88rRWJknP#H$#l^W?^4t0x!tsu)EfpI`>#kNQb) zsxl$0J~+;`S1BWo$Jc04>>-+ipaqoHMk&T@I~L(|OHDFd%j92B_zm{nnRE(KF!OS3 z;hlK6kHX?f^NBZed<(c|HsBK(X{ow$U(+q^9H^-HDZLYeA|Vt)vPC}KG=-@EKR_p- z=r}GLtU-*2EH`uq5`+k&PYcB!0Xb@xfdSAgQ7x4ull^6w)g!vz9t#nn2Ng#WbZ`Ff zPaZ#&v{#(ps)QG~$k}{us-v0*n?88;!e2Ad*P=WZR=d&9w@sBMXOkUr~m8^ zFON4XO|{}=4H=9oUSeS!7;qH2+w!axO~#kS;}-Quc#VAbEYEA*q^5LPX%H|FvvgnW zOeu^^f{a^w>Ug02uaJO*m|`IOGTV0C^iNS1-`!fH2N+cOFRCVLxp3q6z|XX}KD^Wj z><*Kto&n^&fbKz69g#RZY)ezg#{fFwl7$L98+NAmDzBem=FJt+)AlIHrGvFZe1F74 zaAE>|WPIVC>!j`B!GcIJmh=qel72>`MNIIia)64;hY3|v?}CwvN~2m5daQUWFl!q^{z1WmNc-2pl1U=~Ms6q}6 zx+wHII_xM!pe*_9Y#g5}2`F4a;SkyBX{Wh?BxYh46^(jt93+8+sYZ7dAYyVI9GZls z%1??CNnZw}ipk3q|@YN3W zee@)4w1#(4@?HD)2NF*A8VYm}&DepPZzPhyh0712SID+|IccsH!AgKKtj(J6!#D2j zWdc3Qr>%mU-dQyypGRvF=#(TH7SDNVpCc?Igl;?@$9Ih${}r7b7oQdjhkM0m3U(*x zdwO+n6vRuzuW?=ED&T%9=zWDJ?5_OIBGkgyvDjc>De&|xhrKb;zJycAi3cpW_!lgi zbp%W&uXfjaN}uYOx7zX`QBiB!B+NABKPq;;=KyiG&~$=3o(KG9xcyYeOWrM4^)fcc zT?k=JE&ggb_l4xD4Tigb7p%Mty&T1m`wux`X6%ra|5|Fa3xmTM?Jj zMw!P-x|0%(mS$WzJri>v0voxO3_$;o&?GexT`Z#_s%j4M$hdtNB^%(%pN3AbC;gMIC7{<|2Md z+N8HzN%Z2|L)LO1LH3Y?9Ceq5=h7j$C+OI`!%jK_=&`+KdTAF20-e5I@2N@$2IFZ^ zGt;4+c;rZ|@CX3OL%`b*@MsoZy|}C(UVoqmuTB;Ah(n@!VX;SiUuwjIS`+c=u^>s) zA7YR*3cV@-kZ=HXUBSf$WHSVMx;y8|b|EX-EuX8TD2upfLN#n-*v)Npbq+3-#>z; zDoFN=pnsymW-{`6c2OUh(dUSphauoGW!Q>^eh z_14!s>5y>&4{oDnk#LV3<+N^#gKjLOn<)gr$T7@yKPwWtAMW%h%Fz}qOL!Orbt`WnU+$m%!eKR!okH(e!h?$YNF!=v-rOq{+|vshZRM}EdjUK+)7UirB!?wU zd2Y0+f)U~z zP^Endm>GiKAxIZhY9v~UpCRB$EV3*FB}}^%HzV3!F5v*t4$QkDM3pw`-l+phM-fg$ zxfLYO8gI$tK)$MT1Z+k3sk9Hb9vp$jH7*nd3c+!4g2fNfNfwT21k=d#N@d;iVZMq4 zko5}I4F>hu0~ldk?9+yTjG2Y4Xab%_)K8N3$dx7xn8nYOC5W=f zTD@Gwm8RGtX?7e^8Hl9H6Pf_r`wLEE0O$W`}BigOGM7XbE ziu>c$akwZWd<@MIQ<3yF^a6>yNJtceyKCRQw!<{-Me| z(if~nP*=_5{$eJ+B2G*TqTh{|qyx|X z#vx}U4B22~1=BNg@fH0b3>Fw)IQ|9o?#B+%&bFr7Sd8Fm>gcvAN&4?hbipy+*l%kQ zzqg1>Axhc&hwqihWd(pdaiC&MdR1}}!TblLHuUjgl#@9F=pF5lMrxc%7;2*SdYUEPq z>;n%>1)d$$z{&UW5Mp%ua?=TEc}QT37NO;qtFTY>$R9<^>K*o(CdCp-c%9vnnvX6<2RmNbr)`X{6z=3MdYIkazgh8B9#pdPQF z0of()7_&*WZ}ufQ=3F=b^AhG-IP1U`G+_{QJdUZ7OP6m;4(JoLDAaz}0RaXs4Gs9n z$A#?pGAKlYAhz(Uk8b_hd~lKV1+{U<`x1PAK+lRAx^q=u__feN0zbf04b?k6WoqXe zic|;I^1M^kfJn^&uib9&!dO5(u&7o1H>-zxS%eE&5+e<@>m8~cec*!9nt&>b$|{Te zM;%UPHOO(a&9Qz*Q86~`7R-94>gL1;Obg#S9`!gh)cZZ-_1PIqDgC3e;Lu(S!}4rY zeRLWX@A2(r?)vlN?WK0lFN{5nfy>wG1)!Ofx<)Y)9u|h<8Uf62sSvxI@a;}6g>g!; z{)Ajbll^bm41ZHBkPEUwplEdJ;n8})CxLtdh)_!o7)NGZ>b)(_aQTb3DYc1B(4IW} z)W-UBUT3`{zSR-kT2sHUCIG0H|4Bn{$TZ1ad~%|`IR=FI9p zjLhs#|JN&T)E)EOa$57M)N>2D+YF&gVFP|WxWfc-dLw?u{SDb#SUCjFnEb-n>5c@5 zA6=nO#YtAorM+;t!zV&O2+E-+nQO6^rN~P=Kr1gLjdiZ6% zOUMz{gIYRV$XT@@HW_8=c|yz3cs8&B|1A`2Sec{BmRBr4Pw@3$A9`?En5I+=`sYV5 zjMHi;1HfDZ#%sAvPZE@-{1=;duXJ2fA8u7wyAq0_Eu0AsGQitaB+vZbl}Fnb@BbGx zojm92fv3gGseIS^WyWdW+aV1cXo^d>6zpy}$+f+n^v;u@94GcZUziO{SLr?c$#b;O zw@$~|*Z!a|;A!@ubT8nPWt=31m3sIX9+-Gd2Z!QOCCXs5rQ$eEb_>NSxKfWXs0|;V zOW`6{E>{I8?SJ?*dqVqvqyH)+WcBbEbSFY>Bo>Y&fByD-ONAuGTWuRX@>sU_DH$~UIYJm&SJZ&}uK1KjV zY4|4fV;CP!XsH@M2b3sgi5xxEcB63mbjznkDCJO-iEbL(7sZR*>wNW1^42s8eZ-Fy7+Tk)vi-Lfj9536Upeqy=?CF(Gknk>bs^Y%(% zd0(ydJ&HX7oG9EkJXUA-DfGfb*~_<%hE6s&6DT@_nJY^=&zs8IrMKhAmuX?&UTieUc;&h>esT3Pe z>;-8z5e;xe^<08_YfrhbsR0VYmG&e4^G*-)ZBwk~{qX0A`3r}HQlc!1E0%@;; ziBrG6dEEc??zgFHk-)ZgZR3%f3b|Fa;>2@jElg(9+!=6ZpS}OX8Q z2*da)aHALXDq06{bVL2bkAOf24!<3GPOQMK-%_nzcx7tL_a3M=Yl~#cWm=AJnriYm zB&>Q9b2Hu05M$*Uyq>CIFX5F{9ArFPUrk$oLDMU#nZUR~Fgl|uWvb=6L7aNJLPuQO z=bS){cHB7(!-=5+4*G{XAATWV+tmpHd(yk}#`m(627sT|!(Sg!J-P*Fc2wH{kMEZ2 zZG#~4q%;Vewg;QU9aH<^zEN0N1>4j;JvYG`1X?Fx&v$pV*$LxaV3#oBw3?2#&ez>p zynD>NxOS@Y`ntwNAD7bvkQN!*VT1fxa%Pkg;{-ybCGw11 zZR8L4r$=_KmY0^*vmJ%c)-`U7DE^IyhiZjiDk_LyLGml;TRB9KcAl=g-gf~0?+kgy z52B=1qLswN5x8K^$)mS})`KPQN46t0?KyVNX_i{v*S!#xlJ)lS-7d=J!jHm?e51(C z3e|JUVUMDIWxOwPsb%;4?-yUBM_w@|#FtC!t0ukVbVAM5me3c7LPC`G^|PdHmGTC@ zS47meY#h_b#d`DU^JJN3H4;`;>60<5-D;<_<*x|b-+s>3FS>47rRvoFsJhnV zA02p=CU|qnuXRTGdjB@*Z@l{IEpMEblS_)?ewF^6^w&E%nrvo@GV858v$PG{N$(@UX82 z)-7+r{O5&}2hdhRwc2GiAJvjx)GAORnL5R>$4{DXA5XsW`q^X3kB7`x4vHLGmTbu5hOC|ZtZbXw&_E}08QOlV zv3hBM3Vj7g1zRHUrr|ogdTeyUD~}<_SZxJ;5pK{h-dh>juzVS&Zi9WVMnnku9BDUJ zdETE-eC6<61%bm7+8lqZFQIHngNpYT_m2%C?k}wr^Dpz2f>ZSk1}pS4V^{$%36f9k zQ0waWo@6_Bo<_#DO?+?V-I861?0utBC|ud*aG=tWv}X0n#$3ge*RI69s<=9O7k=(y z@`pr1NbL1e&qoz<`Gtk` z54MFPf7ZrV$58Sw@YV)(srrnrrSSPAv+C5w_rEe}oW?b9f%prB3rV!jLPA=C?484r zX^-=c-pQGI+GB?X&oxemkpvswRFmw?iVapt3mJJo=;^wdtLJkk3N@bJJTi=VyfB5f zIrZt{-}U6_-kdE^Sog~h`?F`qs$=H)1=o(ttP0(q6x{jOExh+f(u-hA%gCXdO>k!t*mJK<96~pT z2|IOn8jJ(woR+!IF}so3u^bXZrK+2Bi*xrpse`vT++y*f>mFQ&^5PR5l^`1>BiRhY zuLKd9MO#YAZncUui0=lodrPa7>kJBHmk;fgXqA8R^_@-h_vERCeJ^@q{v&h=`s}`O zX|n!4)9DTDm<{&C_%OHPb}>NGB;XyIsUC3dMN2Z3iD@$t^@=<=B6SOR4Rlj)FG|4o z;0DL8Q=i;&=@rq}j=}=meWRWN?)faC+~fLeWxSRYooZc6u4rtX=aS_ql^Pf7MK`Pf zpg0^PQ6(PQ#84ei>P5Sc168m0K|FA7@MBk7^~gN3AgSMQ9GK5x5BH*l#8wl$cv@1);3tsV`*-kM_Iu^BW~wTy=x zi+-_r-rEjgscgwIUXS*8Nv-BLCx3oV1w8nC9ooUE4e=KEY_IIy_I`G^?u!vp-(7$& zK{L(Ysa&x+VG6WlACgO~_?5F6BJ`YOUNxm*7h927GcMb1T*>XMhrjS`0r{USR(wLw zY`^X`zwWLNcw*F(^Zr`4fI3U1+7f&+r?){crjP&9&HE4qI!G`|vD3MLsOSN*i`n1q zx=?`Adnm5?Zbs;p7&FjR96z!!~So3<@8-TO{$6U z=I<^0pvls)bMR;ZS~jQLg9lE84~`|Ysd@Cn{oaW^I>d+ydHU!nN58fgw*%#baQ=RR zMW?KZd1QK9+tbZP=|`xrGaMIuDT6k@!+`vH>d3Re1T7P<)T;oDc;YG~MMywcLvmY1 zf{7NaRcL%FaO+7c;4oR`9f<^U_sU1r)q7vu1moC)ZW*(ydDQ;tv*PQ zcH*V;nw8{+CzLoouVO*r?cGi7Jp~lyII&~@c4juuP}cu!D>PA+jpH)duyg;uTP9-f zZ9Zf-Z7*qgJurn0hRzj21oUG0Q^tdjY;!I8R3nvZf;2!fz99a}eac&hPD8(s-GZ<6 z`cE--(tNr$L}uv8w%+H(Lj$f1%(y-Zy+1iwO-fKbp&$3<ih zMZIw#NO^dlR;ggtSp0zNh>agF7yYE67O$~2+j%u@&tQDmQtT7Bs2KXY${X62qm3s~ zWd;iq%>U*nP6?1{qtu^hjU7CFh`$?;e7OdmM);wo7w zJ6$uoDa9ZdLBnx<$gXxJ7|?ge8qLzUyx{o}MhMNv==0BjbKMMUNQ zaI~8cIv;!T!<#5hEjoVFr}*f#=pflbC*)&Z$SuWzSqkUr?6?&BEGCq^&2o$x=11); zLR7xI&M#>JMLk@(dm)TwO-F-`)CoehjC)GQ|9i=wAMDNXtVgb1t?iOuZ*}#y!J*- znjdS&=9(J?Ck}fZx#D0;#}cWmx<45;;c$5{DP?0HgWDOcD z%?2aWWol#jjJQC?o?Mnb0E8!?P(c%0fmK*kqcUW_qJ<7+7z2ta#^Lq0yREhe}Zb*(W53j z|F7K+`GgOcf|eD=!-Pxu^f0JZJ~88YzHG+o%$V?Ak75Y^0~!mu&T0ys7pBRI@?jB? z>XktRJkwT*FEFN%1@7DAAJEvDRC5bR1|_i}?M-Upu^?qO%5W6>x*Rj#!#ls0`ln>!HzRYfq#IA-`g$P7f>oXl_=EaxjNa1>a9VjbMr!X4!bo4&QYU{-zXMxU)=_PFj+?} zV_e3Ke8RHaqOu}#vLbY#_%%FVKASIlGt*(cziLyg1eD^DB^;V9Ok;`A;{>)ng?)gM zt9P@y>SOk0CHi@@J*aT^mIy+Hn(MX-hEZ?M2KF}OXpC2y?iyq#eW7oLuAg}|2 zib4FE=AlxX8`#=zkerX026}g6M^rJhzH4EbXSCUXf*#2!Nl0pKGnx^V$wQX(f( z!qVIKJxu_n*0T9aEegRc<0MqHm)z-61cM2i-g;ld=j6-mqrr~a?ecHoI58Z8 zd2B%gdyyyyzHQt?n{`wOk5D6iD}tryk##zd)kI;51OUYdUIL==GRnRZ9^K**6KYXA z%0#j&nYl8(t(I@|XWt8CejK@{+q6AVTLX-szx?o^aul-xBsM@R7NW(5&V-+NF9_7a zE$C%{22x?=<6eoD`Pz2xrzhiG8o2wKmXu%fjQP&)Wy@SB|2vZiU*o_cSb_xE(-Diw zkW}FkyyOUzKkqWH`Z|vlhgO~)!-I-MPMC7l-UhKOj_SCyMZD$ss^5F>edqgP=uZ(; zLx`>6_;j6SJr;WY`JKM7qvq=+oPrYe3lqo%>R)MAmRS-`&lV~23Ymd$++y>&fKM!@ z?kWRt+~vH*Zw%zi)jS_zY4&f0`87F9jglMHezSmDu@dvz5Md^8ZBM1lQ%vRVZkYqv z7zeJRkNtcLKXj~DXObJAsMgi0E;0E;^X|KpKSF3ny8B$Wi?>BGRFSa|-yS*f7UINl z@U#JD9_z%b0XJ3VEh7ji*zh&Q^47${NtLqi2X8u1zapDWt+fTtd!c$)`6m|~jh|!~ z`=Lb%f=(N*T%fDQaRO^qd<48GohA6klX&!?UNB@sl$|Vt8OMZ8o)0V~-Nbv`Xi>U@ z)HkH-r)x=M$OV=;8W@`L(JQdU%_n}xS$DQ#jjBBmJtq&kA!UrhSbpqCDJrQE%UDvO z!9Wdk84?rNv896c9INe?{FVEojN9i_+gaQA{E7+_{#YRNNBG)zkM7usKg<&o+xFJ+ zyvJSQguIiAc^8&y9n5_3?;+51HV>(iXz0X0gX3R8!)DN^1YKB5w_h{J#p{RMs-i*% zAt={QQT45nNP)KW@e{ze0k(1R1IvSsn)Ad77E()%(;UjFfta-$mCwYnK-uOeb zp>#_b8`ZIZ>3K?G<%!VZ^p0-tsx$%TY}VRD2gO{hcumK3$T&z1+H;l7^QsK2%my)9 zR9EvX(**uN6YIxYw8``0mH=R}XGEo`@q5QJqYiZgrXz&%vwyWg7@RMcvz1Ysjmy#; z>9yKqEZ-#iO&K66{xp0A%{#*w-Jj?6)3rsb99Q!>T$xsj9hd2Z_5%bC8${l%R;EtJ z!riNwC2}UNiu`kL3?hWi-SrZUDHV@lZAU6R+2+)?9+6$SkDe@d%VWb!blk5;{GX$9 z|7Y_5|M)hW9h|l~pSPLwp^@ZJ+GdV9OvqVtNJx@H4$*s?sX3p|s*w&3m1E`D977T% zgbE=FAr+;3eZK#}b^UPNUf1*Wd_3-V^U-g(!1|-lL_K!%FGh9J|D2Wx^F|R)YUMii zUoGc>d{f!SToQM7NvEs#FMyBH6O491>-IcjD8fwwOLrMMxCq@h#3X*rQZwaR4^Y59 zJL9}Wpbic2#nC7JqR(-5vZd4>{p)K*sBJW0>%XOq+L7FXE_*h9k55OWozelQFQ((@-_k z=&yS_b7xCu#g!Aka1R)u1(-rnG@))n7Xzx`2nu5DxA>V02|Z@#<^9r5smVm_y;93)t}rM~=Q0IeX`exNnmIn3FD zYKR-j)4-16+LLoa9!zgfpW|2z&-|NfUv+tmxg&yWhWmHy_yz&?(~4|mu4jvnX2w(X z`*vRa7{NiVcR5C2Sn@{vuhLsg0bEn^1AUvNWPjABXX%*0Qq0UgD0zPF?gGd}4RT8h|1WTzVs0gdZLIiO}ah z4;V#9F58H$?xrS$_8CyEyI>5g7k%EvtCL2VB7x z6Kzt)_-FqaBGL?qGWC|g{FbR=Na>ZBc`-9a$Id6L1?O>KGp6^AN#Y!DQ8PDj7p&Wn zVz_NAD&%0NwWc5ZT2ag3ZdA!#Z-&JML-D~pu^2<90>vsN_=%36su>ad@Wn{nD=;pS zK>rGT+IS!Wszmq-&QwQ5u0X$R+A?CmwK!dN#^F(i!u%qzN0+ThH`wB*YCY!I+o@8b z*ooaaL>s*zw7@$3mwL^n?lAY^W{YkrF~!~Fk@AI0)m_S(UmDAoYX8P$h!KRZGTv;M z7^>YB$rcc`n-}QYL|(_r$Q4UqNu`ElLbK<>DrBfGP+pc@h|F5kD=Cj>b{3(_Yp0%q3llkG{Ey<0&q2ygl12 z@IcMyo%%-Jb(HTl+dRRi^!H?6uvfn023MjDC&ZbBQJldt#6p?b!mSC1 znfQC&U@=0+tVRbHxk~>*k&clxk=e z+RR2cS~fi>=RBBtulU*q{raW){A*o&JEFt=WB7`y*$>r`S?pWl{lC>3H;P7X%@2`3 z33uhl+rDD^IkRqcjp=+Um{J!Q+O<7o{CYx?P&IqJ{EH(q zB@kB@72|*xNK5CuM1#Erbr=F5?9|dvsW2>34lN8`c`4v06&){`&dkszEhTuYv1BCC zlOoon=V_&1oIAxMNan8SzvXNA$Q*gE-**y(?>>T4^f;e}u@{)YT4@!P&{QI>Sy=)Esc* zxn*Hxf~PHj2s*Hwz#he42AT*iW43M51m!}aUcD>Ddj4?UFNJ*k^tnY1FR)NhkRp7M zt1A$MZR4Ku8sn)Ovt)*+14TcdR$5HoHpIq+b}NRFgeN&j9c;O8xr}a!R25JpZ6;uS_?`-}MAZhQ>axc_tm5 zH3I~_l~*?LlF;ZsG?&7Hmk{FmN5I``p=wr41$a4&1;rSzCiGLg6oub7R)&?QL9bo7 z8eI{F??$2U`)I>{fHtIC5Gjvmh4rveXh|7@^=9voi6W9OIu7xpk{5;)(dUL;PnR)_ zsHG(h60C~rd^^o--taz{(nDT~)v)iXnQ4yb6l*(=wBcAIwetpZE647if+sO$ z_NGE^1;q{KYdZ1Y!ZxI86fV*FGiATyRh?Bl`&qKx!pjqng5KVDQok-xqRp`VH)(iT zKvMTbb68AEf+Aeb?)Js^<%u#eRnCt>imJjDlVpxX8^*N!w05p_?<$9t89 ze!F{LNNz9G?q+Zr1bplp}xCcGGDxA(s=<#$ojfHW{rgKFwC}yZhFNIez}}DuvsP&?)TvaTO}hRi=F5XYwb+iG@*<^_y-uXwki_9k zl*;m;x)*Qr+XV|ALFrz)l8C!$Lb65JsEOVd4+$L+t$QKCzB!kA((Wt~0yozug7(37 zkt3aOF)FPyb?3NlpM$E-2*8n_2+vD*GB}cL0=Mb66Q%r9_j3y*Ibqzq(`JPe2*Gt5 zVw11`_@(Yy&sCFDI3z`yvp>`7jNiY!%mQo*T*)s5a(P-Co_6=7+LMa%UN*6s~8ZKlvdU!d5)L`gu}n~WVG0A!Y=J+z#;HZE(I}T zNKx;1GFh`lIBAQ-5?Ocp=y~Y=Gii!`d)`8fp^SkP%lwhU&7uB?AuVa=$e)iiqEt1X zFP8Gj;Zwh{gi`{-1j-K_jUHhsa`SLmYvS>s7e^08om7dWy$rZmehrOqC}fI$RF$3* z?8lt0dtlFBXQ~l)_6e5Q<6~}N!Ta+u3*|=$HSa{Zu>`*uO!MiR1KB{rdb%BWz_G zsn<>Xln$4o-eSqxmFtCT^gsvq>bOh&9&zO`<4_Q<2VMRH7Odtd0pvXb8{*1VyF8cb ztZO6cUn8VrZ)TdvuM!G$H5h01W+y%!8@VRz$Oh$B%b)_-IKc`cL~4Ts9$HCAkFH=I z6hfuYI4yRKN{as|>Ugz5?Y-?aEPpGIAI&sn&vJR4H13mx+)NoCgw;C8CjC7s&kuj` zwzB1bL^%Xw5gP3_oJ%y9WP((Pq%_Izr<8T~v&>)A4%rlsLQL8UGCxt!w#b1Tn+t9Y zCkIl+!i#hL!^&WycoJVToASc3=$W1W9I}N_rL|R2R09tc1$*34f7GH^vP2d%o(zC_ zU^+e4v*n-S)lGD`M`3ZhQxQbgdM5 zcK?*pL60akDB?CA1_T*LxPzm0v2X(M;_<2J^m01FQO!*&eN<)b*n+LDu;0ttbE=kG zAcNo>Kl~YOzMES-26uJR6%tU0eLEE_+^X<{gMwso_2#RrSCPZmM#5WX*StKJ-Y?Z# ztW*tMAW((KaEWX-QQ&Pz=vG^*!(_9-pXLxzXYUT8$p{mRNhEu60zJvi!)sPHh_`gY zjXfAbhba(h5|NCfcS|N?)X%FYhFJb}-OQ zPbI_Aq$ev3L;#&>W)uYA=cj|s=FE9RjOeVf16e{SowxSDPN?Ax!XZ0BaVd0uHh?c| zho$72kND&IsQG!!L-qUP9V=E7E%ueJ1Q}JR;=wR+8=H5?y6l5tVb}fP-J9yjcE_rh zPdXkj5r;NPQVezX=U}bHm~V3E0>PCvY>4vAy+7_AHTSMP_madZs3L*H*Utt=VbYpvSGq*sH#a%!~YySmddMJf2k zWo(Ns^WGoz9Aw$s0wLEf-rKb#q;YQ#zdc0mQg|BYj6z05G=g;?p$IVcn~>w)g~r`L z!YM?^{y{>=yh@8FQi-LETp>bg1r!_Q?4t~Lm(%a)Pc?o9tX@{t$pc-oPtX4ISfM;D zuXW~Zw7DWgb{Ryue|$|Vf^!Ydm=LpFxyx|>cJ@$8Wv67v#(KQ+mfRy(axT&FzEbRH zj1)%sgkVBu$$U#CGh6+e`+%a1_ltu)n6;nRC;oq*x%y1A-^{D2cF{e^2sTLib>_C$ ze=dqP{}sZA-+f`}lX!J@O!)jT1$ip@Yhf{To?u(M^G|Hoj?H#VC2-bQHGglKUSpE! zCqsBLX#j_DqZ1zlE=Id6exQwNBhg!SR~?P`PGCS2l3P4wcw+Kr9lNsQV~eQFd-S|> z`!fAVgd5e%;4lnz4{{&RfAd#NX~YpX;t>UBIrx~>%BEU>C@h?6NZQ0xHe;`RLiM0A zl}o2x`-B9RP_JsGNxy>ZvUr0-DN0$q%5)n!rTB#|pcEIm*d6yD7xZ6dB$A;eMg`hi z#M{jS;D;0SL03OUB?^N|9#UwJwDLn5xX@D2ln~$8>5P4i+{E84^#@hGxxP;ck z#uJxO#v?&5KF2vd52pen-TN`y=TiCWd5khsJzyT4c>v#KfFJC?b>9Cb0z|)EOBG@I z%Au}@>0j6HBZ!u3@s9vO`c8*<4qvJdExzwL{nj|#hkb8eHfqTNz6rmz&9+hGuc12K zJC)?hWt48K!8aM0`+EIZCum#)$yw0deoX23nQG{j&TOPq1mRvEW{sHA@KZ#*4{B9_ zl-G-U9Tf?;kF-SsANC8y_9L;^6pUV{9)^nQVBJn{jGk)~%UrM?U_N@e`A`xas zRQF+gv-UBVqfSv~VY&X9OLN9$0H^{Xx$LrncM}qU3h%&UP+RiiN#WTFIGui>wNQbz z|HquAzY|>J3T71v3XQ^1<8X8r@5x`0do--Pe>Oh@fT9{J|3rRYK;f_IT}-~022fKFCipe!xFxCc?Soj0_33ACH9@C)g(h&rFZSHy$}Q4Rk(oz_R6 zE*-}`iUKQ)oRk<43T~pjA4`UN3x4AWZfyu|QTK&@a5yljqD`dGs}VtY?D@S=_+ei9 z1uF0a#z!$9c^CuKT0yat#Ra*=W;?~IZYAn!C3Qvdgb|=Hz0l+I+0#Eu#`SacNa8)N zrRFQQXW71#AGuH0cy^?R&u02z&I?{6c zo!-@MNxw)K&x>~e13YlVz-j0EsY6cta+7cKu!T3~>@yzCXH-V0TDEvzLL*#j9amzi zKbIwWRmq(|-qd0Zk33EiU^zJ1O>n zR8Wj$Xo_W7+s~CK7pDr0_!JHzi(4wSicNVS;CpTWK0qztyf7*0_P5iy?c)#wCBLGo z%en+{`-=bE3rzTH9fA0;qbAjl-KrAG^MKF7c{i#gNmP_48RZGShdOf6FLsgitm!H4Ee)C}auMHPj!~P^k5RmvQ0-G3!X7 zpGcwk4S}jqxcOI9C=Du0N7L$D!n3SjfW(~WknGb@>PbyD74CJt?Fcwwn)N-)gB>6<>^aS!Ov*-XbcYWAbobFd6S@DLG|X} z6b+vP-q>wUNWgq+*)M*UQm)Vk#Q$s@i)ww^S}8Py^n4+7^<1vx5QeX$l#tmbKm*=e zcr2@8`PTiWoHTPp`pGOGyBl!^RH0%K)TJ!bKDo%(T?GtR1MM0>d}nbYhk4P$zS<;+ z_yIdf*zVvqZ6i~Nmc>DKJ`iqQMi!m}*Q=wP%0xuhNYs9G?3O_=i)#XG#xxOqL zzo*thg{p1<=5VKiD|iDqyk*~c^MlyLd=&pSwh7K+U7U{=P~7_{r05W`P$XX8>5WJK`_y zFjgzDJ9%{XZiTN1t<-vaO}}kbUCZzK(l-YAd%Q6lyq{BtSB{B?P>1!q2KHuO)En_f z*b99_7WvN!BK@J+bXWu}-1jre>@^_XoL9c?MV&^UKDyapzWAkoYuB-%^LsCRj7obA zTA%artmury^&>}0``^r1t-<>z+>g9#ZNJV%y#F)$HZ>rb3&f3pZ7vVQ5Z@f}e6wi% zhEEY@^mo|)Qf*Y#y=bdO_-GHm_SnwMvuj*v$u81~2Eq&>uTMeTsi;f6$Yy@UBYHl+ z!27Kr>zq#hQJ4P9V%9@OYR@aB(pPZ6^G2a^?_a*Pe#so_Vx``k<}bMTxBX$Jsx#4F z5@UFg!+ZR_;ZiA#Nwkxn6?=vevcry+OkCP?Y#c znqNukQ=`%2o2@^Bs*YAtw^^mKHKU>>H>)%0p_&s4niDZs9*bS6TYJM;^>+BJ0O6+r z1ZiMu=)h{6oq>&b3|(P$7WFGrXvA}jpV_?5LB!EvH@}{48$!~kyl%lGFl+HZ;0S;G zq%?-IM>w=cO}zmTZMu>eSlU-@^O%&`l-^tG3L8gx8kxWAlzh-updUM;-i;C1@0cvg zoBev}?rc}f@mP!4Z9-bR|DHK9|g9&lF_EP9PQT#DiFy${Y z#%<8fyZI+gtZMd|2Z~EY@!DsN=%Zb;6F%@IepvY{629}!y1M*Mn$eM@3lcAf9!<4L zK0T-;PftvbRv&z;#a@>^yNnn6Pa%OkbU;ThQcFi%ZXNFzA{K*zeO~Rb>%4}n;~=%) zN1%FX8U%M&X!1s}#bU`SX$E@SF%gK*5 z?V#h={yW%j3J`&~)dk4aS^I~xhi<=AsaE;;$zcT|tMg^?%(^?6(BQz?=k+0qOLssq z>%9DR(3WssM>>cPAnGS8YW^3wocYQQD+up|PNYHfpCdbeA&b&loM8)LmzG(>NMSDE zqrru@VxlSkiZcXPyry~n{B61$S=#G=95>&?RJW;ZYMde+p0E8HVP9m++_WPJ z!hz60tc?UhY%diSx1r#3>D>cgJL7*y`{@rKZe9@4_!x8Rm%ql!uNzZfrxk`>>z6N) z8;g%a{(k3l)X^+eZ*hUEpBF)xU0y;k;KXjW(2t^z?pmSXx~o5sj13|0rQye6{-dC9 zhLETbDwimJk`7t?D*}B0yTB#C)fKaJ6c2g3v?D-o{qw<)*X^asN9|{+{CwK68G9$b zxJGIK#kr3kX3i!b`l}RoZpI#(@$pOct1s^!?Y=+cVHP@b+b%xw;3&AYbdD-MLJ%Jo zK$UMG=?B}WlirW>dBdsVZ5r8w6-L6fTtKJYERhKjkelJ|dv|fw3H3-YsGCE%dPLBx zr_lbBS-R};t8J6MP>XEd^Q9EY1Sr3Rn2H7cQb3-nLv?UVY@Wlo?akxy|7t|XK5LYl zMz$c7YHYzk8{n}-DWaNVnpWz4`-bN>mJh+g@ZVCGUrJ{rScJq<;F_Jb*T7qy*-BO- z8Yf$}&W9IpKro~+WrX8Q>taarqP;EcF`0Z21ve2H*ZP40xv10{kCAHvOjYNx9T|mk z2wbd@RURY!*`D(taX#omZosg+MdVvaWL^~)+@kG6&{6WedAwIh31@q3b*on5nP8mO z27g|9v!E?V4>@_6whH>Y>tJD1c7(y3J#TWIR=lrhuao03PsDtLqm02z#nj$wf2EZO z2c;XF5@;TSLBt&*r7~e;QZ}V3_%K|#qLw^DNtgq{Ri4gfnw;tmJaWTB;gT3LnVfac zJp^SYZXg(ti~&Ty(WIvkkuZcdztw{NVj+)?MQxXrRtEN2Ias59$H0e?CXs|kuk#nP zI3&LvU(S(j3_D%rb)m18#&Ugig>G9Y6}+eOm5Aw`!6Q4tnr+rlqqT)E!-nCr4X=(H zg>PW6ptV$96NhAPNWNC|3P_z=y>b`Ts+N`Se42krPXa;+=t~b3v3QztRb$y4n+UG9 znCA#raQGLdmxTksRoU`1rOt<#{Q$py6#)%c*rVz;&|BKeK|B>#$Ky*U4Kr}XLw31( zZ)$AYw{suck>F{Jkz_&0(HRpbtJFrp`kj$nrb~6BC&xuZN#vLafm``ueNBbI9FuS| zIQ?VFgfnjq;S*p`XJOgQkX}*e1iw(6&v*Xf+X!Z##vAvvW*;$LA*ldv!mpkikKK-a zpEu?q<1D4<2+3kdtx_1oI|jAj@09>E zX3~KWL!$LNX+%As+#ljl`6ti3FCV%IKlI@&U#};luGsG6ov^FH^?PBv0Pz9V~8m4iKIQmp(x9gE{NVM0~e> zJ2tr+cEC_%_Q!vF14Eirq`0%laNI@(P>)Htin+jV;ei9%@1mUUqJzpEyCr$aulCa{ zuqg)_S6r8WwdD@bIV&23?pJ|oI7Vo3rIkqOf!4l1wGhD;CQ`81yjiw=mf*mpD;N%) zClr&R9GyeEItvtvPQ}SRCD}%{ILHC8P_40{rpJ|<`AvipX&!O2mS6pR0a($cy*ai9 zyu>X)N3}WnTsuFV@lSxF_M?mFVu`d;QKI@*8J^0@ueb)zo^_JC#YjZTxq)H)F0u1~cZq=^S4S1M}Q4lyN@r8du^}vs~&x|>6woV%tN(N!d zI!7QH0G0`?=eqrkD*JKOR67d>_)(%Jf|dfDlw;KF5l!SiP%BPt?tj%fVU?bJZOm|a zCq>>xav5Yhn5Ev2&8G$T2)l3~n#Yb7#@Ud}4v~*trRyT%U}GS}pZcR>3&7O3{b52~ z^zZ(D_3MxYdwJcl%;+2{PF+p`t048mm1}Z%)RjH1STc!>zR?n(38w%cDjcA|Ien1G zFqa0sH7C%KIDCKS-R-o!WeZ0U7ZP|dgC9Aja0&^N^B(~9{jjFklgoy&oE z9duKlzX%bjul7xlaX^P)`(ecdCV%QIFwZ#5-*|^~&rc~GMh$V!{R;SjYaRo4elsnO z6TfK1Ziolp8^E&`^H(=a^b8(2p4UcJB}=M6uTjtvL*oq5>B-(}_2vt4tcfqZ&BN_X z^biKBM8l4{5IQA~ydG7ID8UrzRfh3#yoCDfNsAY5hvk*};iMO!%G4tQA+zuN?38$u ztQVdt{r_A7)-t@Z+e9UI>w|$6Pn; zpF^mKS%{+7oUaB%9f)eANi?VDgQ-_$_-6MviE$d685%S|#Y5ci;c|1QS0zhR9>9*T z(->%ygRWetOyJxvW6NFeP@Cmv|!uKz*ze{x0Ixe|CMfYIYRZsL;d^s5O? zchSCWlvVe!wt2xOnR6YH>H2`Nqfc7jlWd|?91g#=5G{CiJ`^)rUVR;K@I%5e&b^-@ zsTyekg3HuY={t99#eIaqjk^-nLT|!En=apC^g0Vuu=R?TVcD+5DAC*sz@v=jA?;Tv zYOD6Q=qIhcyNva8$ICwz1Bn9AE*`ZP8?L{`>+z9~qfh=Y{E~L!sk*-8?qQ43$^4A( z-ylEPlw(Yc*T=T0Y9cu2q}k^y23+-hh3~)ZpLaZ;GQYWY(U{IJqxTE5`{zjubU&?M zyrjn&DOucfCrm~zvtr;adre5Lph5 ziWUsT9RSL)vAJKXafR({c|2cA=V~;mlWtJxd*aupX9>}w)Hj{KTTkSf0N%HS zv~+$rU;4=ixi5?d=03U8LKhriMrbFNy0%!(!QQ^Eh_(l*A%Q;X=oeS?*QOhUJX)F5 zM(`!lk2idi4$Vw`jWua{x0PILtAS8`_sn7X%yj3jdp++mTTQ(yEmP-~S_>J?{=T9r zu!3AH>AHI*?Q=qpb=R$721so`nx{cW(C9XiJZmJ#Q`gGXLk>L@;&Oz0Fj^K00#=9K zhIdLhnn*?%B&g75W?S`FwT})0ejCv}8oTw6X&B6O<_z|FG`2e&h6RD(Cb|0L1*o8F zstK5@=tqwEsw%+&>@!79Z(u!BD9e8&&-CYdSOC@N%#+*6KGQvH^(040QGtbyrCF4q z44Z$0m_d-PRcDJxFjlQPWz^ZeYGt~PnV0_PDK>OAC3OqoV9$2wBB2&I3*dQ$|JA9J zQ~O1z?7aHsgO@LAJ$}kv=jBFoMnDlj!!j-42=818!b1MmDe^#Q(^csL(amktCPSCuuaoG9xSaSJYxOk4?Tfu>O9q$A8sIwegvfhLZ=Ob zWD0!!WIi7Fui$jRVvC9FvC5}9nWfoJ{=IoQ?P10{%9!s&7R&-wSL?wVL+@ayGe}&!FjpfrU+(3qd;O|B%-1{N=8;m+~Ld9sZ;#-MR zOq^0zgWoh2@v;t;3evJ@?w@V%uRSRNKDrxGG%jNKJx+`=SNWU8PO-2^WRV~ki?tZ6 z^o`^DDXJ>1ndbF$b4gn-b=%2)GWZWDETVS8K+i!f{l4~ClRdil4}i}T#Q&ZuX!C4n ze==hi`3Q7?zl~-*zXS+`-tpk zip#F;J7!Z*GUCjbOe`N6U?6!Apxoh;o7n6rtC zqK8Y5jd(l-h4EYYzBC>&RV;SWiy4CXPxEyWJsFuST-G~#BrSYp&IU&2gd}!=sRsNm3BU>S!3wB zag%1<&+lI4?XZ0UKi|)n7cB>ZHra_AYCN^iq*)(R6F>glvl*p|2y6ltZ_D4bK>b~G zb`C&UP=QPM>4G|Ah`$uW0?niop0pUqrI_;FO#K(o?(kM^d$DyV?M&wE!3+ub@V6Ol zW*MyQ;bvl3^8+h6KEQiyIJ%ifzL4*>Cf9&Xy`N7!? zu^SG`OTMw+*)Pj&u5NH9^YqmpK6-Gw$?eY}rUUWc1tR!Cg3&&bF_2<0&a@y2df)-xyG55i{N-$#93BbkgG5v#C{ ziTi2P`#kaiwKF=?$Up6{4_x`1Qs}2fQaz6LeQj~A(?L~>85W~8j^jbYFF(qDpxAbF zTDSFlg)^c*Xh_V~$y$N^1#6?tAu*pCVV+0R1#v|;U`IRy@>B8a$!pD@l<;ic{;@K} zx!rmHit;1-GOiHToR_gaz#ptitL1agD|h_VPxoca`lXtot(IYWx$UtjolQmV4<|JO zm8Ohc^ELGuyqR*3l3yAq2Haos_b;=Avn#Z6ywQQn(fgG=eH5t(xxsnWrK3t;(zJpc zi)67pi?QyU?JK?Wl7W>E=)9AoYJEOCL2u=0fxIe@gwTfomC`L~f%Bps=C5^%3h`cg z!)K0zm0SqAnE|tipd_Q9qxqlH#5_s;t_e@i6~JFS?)?0pU=jDgmF<6PasB#tX}<2+Wn7IsXn8bHN1XPM_{OS9I0whit_<+>lS7(fcy+R;PS# z8wj-%{PZ-BGJ5dvaBck5`kX%IG?4G>5oT<~r-}VP0R;o}5fK|f3&#B=C}7j1O>?;_ zJyYLQ@;t~%V%9+4u!gF%dbufcnj#`=$f9oOgzP0D%e-l}z$e8_{7ZxqV$%0(?V&iK ze%(*Hw&Tob9+>a+1BG?JZj02?3sdPwi7d(Y*9MdYi7v-G{^lFl3asoeT@Wj1x)WO= zxHI~bq`541%_Nft6|JdI$iye(ltc^R-;^(oKDe4K^_j|}TL`kdc6{b+i_iJb9z<+Z zX12*}a6_^%;2~$PS67kA~RY-3<*I zZKFL5q3fYGOs%|i7h%`V{PJsjwJs@uz&zk_zPw9HrgE7efch+e5f}9udSof-vq0{* zWb~7uv!a=Xrn|;>J#+Ol^C!2*Bx<|&w;^W${;1H=TF~#>dc-NIpz^mKr04|b3)sZv zB2+D|rsn8DbD(m9Hu$0NiA=|~V#~3j-D+O1lxF~e-B)vd1>J3lCKwRpsmlj09dXq6 z-;47_dHU6kH-9A8b!ae#{NjrPW6<8)&|nBcdx&f99sAbrl2r%klV&vY$Oa^`({Anv>9y~S4k zV7KA?tDm0q()Lm(qQUoC3~9_l-`KO?5iJh>jLp5v>mlSa00Q$@j}Wg9JA+q<=%|iF zL%r90yN2d}r_}-ie{WrQyxq3nKA)9j)_0vzg1zGD{*y}JfrXB~HoL0-$KZB;L)vA@ zxlh-H1Fq7SM;P)X(@;Fh`aWR}2oVs~NL9In>rEDM3bn}6#_^}1R2?@|!YWLq@d`^w zgG`!$oU-dYd$)ceT}JQXd}(DkHbVl=;MQV**F+u6oU!qD9LG<&HL_N!y1_sY&*`YG z>4ZpiORFTbJ%TU)wZbDm)l0H5^F0}e^L7-++{+#|5 zfv+3xb&Fjbbfd)a;zm`{y)N=W+4HU1wHqOgYU_MI&rc?LJyVLsFE?U(MaDafy}hxe z`s{gj1WbE-JPj?~wqFA%J!+k$l=R)&z=04hJse3mk+f55vmkt>4^aMIJCmBF+#2*{ z%-K;1QsZXBxqAFha!Adqvuly_am*@6rPrs49``39qFumSbhQmr1|5o<6ptKJ>_2tD z&$z^(y2*s)s?Hu!9MZgA2NORgl z+RKBJX1Pg5m#DKzuVjDS&O$fkE-+JNUAoT@EL4C(S)PTC(I=a6sj88o1ftV{2L=W6 zy{^J3Bm3=fe_F^@+dX)W|cduwqQv0QF8SO?(jLNo59?N&;pVcTV zNoJ9Y{Ku=Q$+SGTy2{_EhyhuIHp5BUeQew`T_lpDcEWSDUr1Kok5giTy4Q<8q3y9D zJ~Tm|DD8N?Ru%Bzh<*?QA}V($^OS|>UGUvkTBY2RTGT6tOMaPxVWevk<M8ct*3a zDPwAl%jJm(gfM-kC`Y(_DeJuzUYulE8bQ5qtJ|Je1|#g4`0f#W?G{9q{b1`oAIjy| zBfcXehL(nJHVjX^Z6Evf&}j2KK4Ov-2u!R*)c3BDg z&RJ_#HUjfHgzU^VQYLvRQ&?&DU)*gqmkCBb+uO7wW(|eUJ$&*%QP@)TC zgheYmNPmbX`6jB?BN=y1&nv;{Q`^+s>+Ik|3H_r9Q)nFARHa-np2Ksx1zEp8npVvh zVZ|P?_OJizN(oU0rmk-NERFra57k{c>3!A%jQT{rN@LbH33>iVrt?nS2j1w0U19ori75Mx6{G zyAMzk3$fUvqAMpC3YfoFDuCioN#wD2Mx{T5*z1kA2;vP1*{r)ts4OZu^IW6T!6hyt zS}d%lS#&+VH%I42zcc}=q7z+qKIlQEx;UEm@M@#kkNU+{DcbN?l?ssP27pDZs(6MD zf^067oyn1ExT_;-pbI|d1kZovZ#o(n)m_f3jAMU^S3~Rvj;Nkf+&bMDxvQpPO>MYC%&xcJP#R(JbN#g2hV4?_`DcZy)b+;50#&qEwaY2QNp($vf$Zl`bvglh7nIa6@RzZJYo zlrhISw%#1k47hMcv^WbLv-yG0#4o$}MwW?lOU#(jksUDs7bzc_cXRbBF<DeH{wPiBUdhRm;mzDc5n5UE*d4;%z)wv! z$_v40mG2C-FSr^&p7O>+iz=u0!p|@s73=@Lb{uapH$$z1E#i6~eWit-Q^YTAtlZ41 z?GwM4lcP?HJ|CWxnfc|h6Rs?QC&7Ub7G?qfN$JPfsp=35qAM2HyqXK)hr=V~tNznJ z>htKzFpFpB=M(awR&)L=n+wSg8%&YF)5X;e%D%-9PQ4;ufMv{(*6y|{qqI-xXKvA& zj%A2pjYilOQO|~s`E&@=E+b=l@TaZRLeCYmv*Th|S|#$%wHuVSnb>rmn`L|tRw8#% zP*fk5ub|)zh00eZx$pOW^>N&W-GBR&QMcZ|Jo*i;Gkw!eRTuBjcMC4@8GY%Ir6C+e zsI!r!&SF;)=RQi`FSjk z%k!x411w(SHxsu^kRRlytHH&ZKT|E?AKXnef9cgz0REt6v@E3QyDl2zCI3fl-Y%?0*{mgFc-{S@eh zMALDR@=rz`$%P+xF|sFER1zn9X$)9XYcJj21Fo1k-B=J?IiPIX!v}+1xg&n5e{%Ar z;MSu2miAjA(YyztBG%h1*0$Te@g45zEIFX9aOesJF2e{-%EgcIiaU}-2`&^}P7evd zQ^6Iel|*#B2I)DHFBFmeNU%HE$^r9A2k0px^Ec26s@AiYiTkDs)=Z+=x4Tqpf{Q6E zDeII-j=1EYL`&VoWEobl5-S8Y6$>D#Xq-g!+?a7?34}m?fTxbcAJ8Ci)f+rWA6kkA zr6f{bnC$T+@7D5IAFmq4(1SVtC052VZ-v8*A0)~#)kt$B zJou}r2i~ejAr?$|EUJf-m07;IM(VQAVD{V@0DH_?vT<_(S^Kt#YH`#)iRLT9cFemq=OfLP7dE5xGi=hT%s70q^PM41(d#)>jk7$8Wp>B}J zUN)*CbMdyKTM0_hEEyG&>;ZGFzf)9KnkmB-OJ|+k>Xj^I7$#S!DE26J4r-9gH`}F2 zg&cD9KyA|<5mhsgg%D8_%(P6ygBhMvOCGT!o@g)%2^5DZoj8V3(5axr6_&jdQJng) zZz857oKDdol9l!EWQlO~FZ4$3esK3W=Lo!YS=+|1?ko^pLUCNY+_K4%fQj$w)MS`;9G2t+QEk&bfUN|*T8N+fsIygP-!<)P*RDGrHOKS!Mg2bXtB zaXO_-8F{$rCoU}PWG5%}q{q~v1iU;(iXx^jYr=V<@cWJ_{WLl4q>T-J|CCY>E}E&y z&XxAYp5~S)%$pV#<&-C}q>({oQdQDyVD`GuwgyYLopRR?0iw|>Z~!=)8?6SuZBH3r zg>z)OE=(!1^FI@Hlp7$*18+Z{oE(FU0~KV*T5T1+V5((;hfY2P`b&Okvd9LgRDn$^V*`>+^#LG1A}<|Js_m2=>XePk zz~-Wxi%-e3>{_bMx5R#V|4uPhr_6TC#1Ek+djn8Xw_>|+)8QeHN-dcZ0Xo|LIm7G4 zqkmOoUBCdtrVvHxJFX;4TrEJe>W3Mo9;(-E&-V?p3Zn7*Cv-_@8c-VFDZ{FMDh1kE z0mCY5viR{NvbU`jh~34AiOrM|>2y3^Di+X*p@0Yg9u z)|y8Iw?DJ;^Zj!l#K1#ttdU05(|#nrfX;nkde^LA2p)3)hNsssscPC<5tkSUePS1N zeIXY9)92g5Ye>4*K{CdNy!f`mNP7r5EDHRr(SXtc>|Og(LqF>rvJ0S?$oA z*?M$A0z5OXc4oF0UO^Jyd-Qo|^?Ki;XR^ItEEqSZuKxP~Y6&D!$O;se7*TxQD-C8q zIE^7*bXi|ael(WFoc{f@b6JY~cj}OHu)tnWFn{aXKRJEzDji;$2nZSkq>2cL3B7luLkOT03%#qM z8tGsK8yyr2ASxir;e6-Y+1c6sYwvk>c4v2=-+f(&BVTsE%MP6oKtlkWh5<}y+MPs# zEk$MF!+G<;Vsm^G|1O68yP>#*ZaW3rPC}Zt@Q6!%8==aYm2=fna#Kir$qxs24M3|3 zUlo_;?|ffi1QTCB>>X{EUTR)gRDApDp-lepBYDHRGyuCRYtJtuj$5{T4PQ3igk%;^ z%AF^XR$7ht@Q($;!DXlm3zfKkN}M&9VJ)FXo7^{{dl(M}+=g2(oOJB!0=~9X8GH6T zarg7{+l18jo1YmZ9{2Y1rvay`0>#s>s;>lVG;JA9?DdW+zHyb|nrJf&$mAdv8BXY7 zCRjwc22Nm<-KKo!%UiQ*<^G#^a6A=anDJJhMh2g>B#Wvlt!$a5oD)40-aiLa}f;s<~-7Z~Lgh};XVX>3lYL!WtC&&(uQG0qH%-Vu4wju9zw+g27 z=sGhv_MW=f*I?M&U6AcYRUM`@;^vocQ6IjUF*^hL8ahWrLLZQi4HXi=ssN86R<#RP z^@9O!M+~MmCDn1@cS3}?Xs7VI(LiTI4cTA41SZ*}{X&ZWjk2!pIcm3z|5og@a86Tn zk-tpxRq52LpGMnzUj2@UxBl~?Jw__!)b}>w_JKOz$G+%f6n2kZ)bcsgfVYYTWuAnH#2d^Td7er7J?~AaK7cB6&JL?7HBY z6uok50S78P;Knn{K*QqGN>$_w|9-h3Cl4v$ro>64^p3%kgk%2P;R?ruFlob7ju69s zR7^|=k846dW*Fpi!hiyMH)U?-`TzaU74hdxP-NF8p?6{Q%&P>oR~f%8`>!tC_Kzv@ z_m=Hhc=hmA<9&MekBF6h_dT`H?bZw?O#SA88J9|Lvv<=OTHK#CS4zi5aRa4S8gp+d zF1o{XTN2ZhngoOuetl1T1O;KI~PX8))=;M|alv>koH#+KYBp z`De6!@3xQXscEfF*8H2Ll9B#EGhge^+;wl=C@a|q8qZbD>N_dThw||nX_rnb{MSwr zlY_)Ke{1|XFnwszKLg(nS#FfMm!HsVJvEmU^jgFi+x(OuW8RC=V;GJf=(Hz>@d*M&7{`gp_ReJiQP`fo3v{m7}&z|J4Uy8&XIZUJ!X3+VZvVL3WT)=c$P4GPSO<-6g@;-t4f+ zg{LPhXgPnG<2i{C#~zb@R%K4EK|VD@it0F;oZey)g%)L zMARWe*&F^W?VPa>pOSupact7&aKfiNFHysr(1jO%&vPouQ&8`}^yCw*6VBu=h!?k8 z+fwd$R}6`R`A{#zEef1}5tidZA-xcLOjI~k zSR_q&(#gJ1vwU&;A}^9*>N-JRuk$)M_cTA)YwP9t^i8UOVkhbe00u$!8PE zQ^l#I72C}iWZexG+DuSbR1`DG#HElx1IB#Jeu8uw0dZEpk9?N;xh5zMbEkHWE)mO_ zIrvr_oYQe?z-O{eKB(2;%)=?4Mh@8VYoF&$aA}$6=d}9CD}zkciJYM=qI$J85&+q& zCKV1TJxuT2j7#b5h1J-`*OK)UB zQ>Y^|Z>^m;`FaiI|3O>xs{Xq!pH0OG;7lc0GsGtEILE?+O%dVE<&eSd6TO~c6a&V-nW|E7C#(61^1I-&7pHbcHwwJthI8|qi!w^W~t$P`dvRh+3E@VV{IhR zpG3J_?@x`Y#hi*frotL(m=!1CJcxcZym-#^n%pv#+cX%5O`*(hURN#3V6bp70eXnw z#yH(qL#`bFaGowahJ`pU>Ub3&3r$6UF7F#4$FEpY4OF=9RGQ_%lzUg zLE*Qh*soDi&#m(4_tq8tV>1qq^Rqbb3}%(T8j>FPhLBChLN)uzieGoRj3m_u9xBax z8EZ2+6!KU&&QhFx4T_-)%p4TSI;wT|;!TAiXc0P|4{~CSH*5wM*ktQ41cdSgJRh4L z<~SXZ?VR(v@e-d?^9Kh$Iwo+M$A!}fn{-kYeP4^tAL3ARg&`$NNR4OO8F}JxywFVu z*LmfzV})vfG(?Q$3;~=akXs{k^9&W1;%UlS4HUHx&B=W;c@@+!>F_Ey)klj9$%ymaMS89PNaWXcEx*i$?qTYGXdu zxEnQQIOrTW?#t7%FhO^5>gmVS@X>N<`(f+;P?Z#fPleIx|BU(RPimcP<6)p7j)I6> zHQ1^*{}A6OlZDllz1HZcevmGru2otNs5Dy>enZg!)Uw}+mlR}}p2h)T!Qk2>%CX3v zxjBa9B+2&1f9cHNGAK|6n{xV^xYhW|5G#(yn04$KDJu1L&4Ug?W!o2D0~417@z1v4 z1Ej7e5q%kMWkv9d zoxqsdlWz^XJdCPdZf=L8ks=262}*}qp=(flt<40yW&P&PK zf@wi9yejP>OU_zw{)KGn(aKKk7OM*})ctcb_np~qvL2|fA54)8n=!c&KD6_O&zhyr z@5aN-RaY_uya{VC8M!NKfdcgAb40VCEPl2nJqJRZ?gO9F@sXEUcexyk@Imxl9E1&? zm&z?DuK4IcY`;I(@@Vz<`dY`u?Dl4dGR#;Y&7I*VD;nZiWxbgM-?=k*zb>Vw=)_m^MG zS{Lx2D#h-{!(HUIuC3gVxAUpzQ5kUAALMu(Xc5vU3(2ix{%6m6{P5k*O4~PFavywo z1n|6WjQv`XQTaaT%S^s#@%qQv7ab737}EgZW?Ybq%nC{6AH0k{C!f`~6;t(Bt?Isnb`WvY8bTa$Ys`ee3 zVEE)YT%RJ@JU!6HNN~@By)ND0NuXi}kKpM&`7I%JZmNcE@Who4Lr0T;cdp$q2C%Tt z6}N^*@5dtO%zRETXARj%R^e){~`gsETQs4d`i!mM&45G-lzOuD33WF zF37z&LKrd!xuJ6kiv8&ng9>B?IMh^UQ%})uu0;;%Z|7}ba23_!SAsb5}9tn zNH;5!TTZ^+|!z=%R zWzV#v*qw^|`cUwo!DYMsH$;E5!bIn&OrhcqLKvpAPvWrbHbsOg|D-YoK2^#8(8xZRUf$evY5dXXJ>ZK^ zMeE-0YgfWMN$DQBTj*(2Pjd`*MtwL~DbhOlb8ruInN7|Mm*mCwV3`-1DZ0LRb@$t< zzLgGQ8ALIKoM?qsNiO$7d^cI&@l8K}Vcd_1L)J3>LiHhe6hYo079`<7jsOWZGb+w7 z+06dOAU^dBTth5>9^`oU%cv#_{CV+sF`Ov_VSm8WlCBK~C~KN#G1>72={-Ja_^E0U zRiNNvFfPwiUQ-ZlyBwQ?%Q2LN!faIfi zL^;kMtdDrWfXVI%+7Ba_0Yr_hwuJb#{wbXJVqxT^)+-x?RvhKceN8#*Hm*=!xU!Q? zqd1Cwq9VqP;YC#m{K{UqW>5BJ-1I&R5C||gzItaH#DW6>rjjJ!b2$Y75SGb+t&Fv1!a9;5_a6lYz= zg$!$R&GmWLMFp?nl8&o|UMz_y5O|X0hZXI>p}Dw4<^Q}B6L>C)e$IPUYxOSg9;^vc zGzw!qMX>0WDN3$O%sM{dX_!3qqq_}7{2|(x zuZ%B1K7ICmc~|S5y{Zm*^3Kz#RYmw74xTm32a7w6iTn129eJCiHrW<1aT(11f`Icf zdr#y=7vN%!NzlBL{{KC_n?Ga{zUiH(kE56M{pf{}NvSDfhj!^rGI5-NIqw+{O$ydU z3v=LOO6D!fa)!!cYn(NAB-~~)gAO!R_U?z`+yOf2ynMDvqSYhTV$1r404pyr=A&m-kJ09e2z)36R#KYd6VN$Me& zg>1OemrMfvIRptLOMZ2q8rNWaZE$LB^DLCi!Sgbv8Fx@de`Z~M*4&w$?mQ2$VWq>q z0XVjC=od=Ee7Ese+6cEPaFHR8Iwy&7@^govPQFZsza~Cyfa}4m&*-CWW-n0MEaubS zMOo^#{wR&#i74N_R*a(g{dFArVrhr+wl|Q2f1|9ddj{n@;fnpOE?)5l(^TXMSMKug zo*Q-IME#QkVh3JGY{Jj0|0PfxH zDhZM2`77yDpfvE-=|Q&8*EqI8z%ma@k}R0M5xAR%AKS&nsZD>eoN^yDJy@b(!iB98 zpIP~KWaJdhadY zABGc;EO!2F615~0<%RRy2v8)srmKTBLV4NR`zO z-Wa(c!GD!7PYAdzndj*p!mqF?-bpXf4t=#)oRV=l-QDe*MVK0EwQ(U!J{KFo7CY+tA!T?Kdi-tbiZCFB$S1VSKnbun+pDQeb4JnSA1TpA;84xxGnR3(s1jC#s~iNKYmtDvzpg}QN2kxZ_awSG z*vh|xKc%TOWr|(nx~G5ozw!ew?AQWF`Eg^!)nYtWDP5EXaB_PP?fhRzL5dOshh4%U zG>TdHb6U0r*_UfnpKF<71(y=uw-y_;Cw^?c;r{ex{|o6kcf#e#aWq69-4m$L{96!7 zgj7n#Pd~(wsI9;d99OQWHmz8wPhqXJ!{u!UW-#7~KIm~>JL0zJ?P5__1FuYVr!1jZ z7D(fsiWj0p0)WT7k?T|qXR3F(d?}fF-pfBGF<4_AbHiQg@0~UVa&0_D(`#V#k zMZ3Qi0A7kHUW`;~p9azYLL-{koE9&A`5llDc2i`P(J!pK9QEK#*aPlw#qU%k=+CU~ z!=FQzF;V!98Wv%CH7|GxM)Jf(orwa!i;RiB!#Ho@K3XAcVg;xqy!s?lFc+)2=;t}p z8*(1XHn^LUKP4fu{Jw4`QW@Gtg16Ejax}<`#~^3iS2nqor|~Om|NO~90i$K2=xE11 z)^$p&OaD=MR9~0yO%_-cV?6$yug6_>;0>^Piy4V66)%v6-?-RCK$WDj4I-B`UVJ^j z_NgAgLzz8wOn=Io@X4j2-cD)Iv8rP9TI;j@e!awAP|JGz>?9I+5dyo`&3LCU7=LkN zYlv2!E{)Wr`So+j3@Q9M^Ys-sT-H8pmxkLf#_LnAe|>`dlu|djfg@em;{~~D z4rRVMmL@a0TG>7j(6c*f$9^fgCk@N+lO3M#@F4V0*x)PMTH(`iS4v6X^ZI>ncc3iK z&rHsji*bGIoYxqrIUI;z$<70pld3*#)JG-p42i!~(Y-J$`giupHfvn{vs9h?%HB4# z$L}e)C>G&>$Jxgn?^p@HnI`g)X|D9O`znnPHV?5uE$EQ-5P#gzQaNq`;&9rD67fLz zDd-DiFhu2cVg5%w4acqXz*m;wSB4uv{gHuQ34_BMxN_Y0Pfs((Q%^509I=Z2Wz&6^ znPB}%_$suo_DkI@$l%6n8tz|jotpsu@D?tz+_k<=x2LmC3K%4eyIahi4sZHGfFW{tx|0@IcJp|lkYJwc<%im7Fxinu$gF@nlSP78!GU!{#Yq9Kg zZ}jr}cY?X+5Rp2sA8IYjAby6fB5ElV_q@IXJ;b+B*rU=yKlYEi&&U(rhNxtgZBdq! zQg%hY|K@jb{YtLg4&Y)$&ir2;Cui;XbuV-X%6fM#4a|k>`aZ7?jl$igu=6aa*}eA> z`0mFuy@QGa*-@Z@!BQc@3Rl>RBCucH`$`~9-PL?SSGG;(=_004gghCl&F06D=1S zqFam6B2;n04|M!uUqyvTk zN9B1766?6z-ID|y2{S?&H<;G0ev|m+WS|$7pc^j@YG_D>Z#Y(|?NH|@We*yICGn+b(LdKU+yMbAsm@KY35vviKQo{y(8lwMRB z+9(n|Guil+MsiLV8#ajmv=Kn>nx+rluw*-)UGMg`{WA$4#GzL;u#S7)^9a=nL)Le{ zA*SEXWxO|Dh1VttCfV|Th=NqpJj%(;17V7>z-(pX*8Hz3fs4V%PM!r@8Vyx?f97Ay zz?@`M6O3K4K8@q#&eJ0M;w&5s;qz?psk#?v= z=SJs-0rjME9YGRQR=q04Rwn7%0h-Er+f`H6q8ZCot@kA9x@R1s?uuAb2Cb)rE?1&FBT+3^P}%P)u;bT%X}K#hit$#&fJszIk6F+k^MlV-s``9|Kl3e182c z^{MqMndf8Z0-L0#O__3V;&O|pz+Osg@S*ET>*Els(VL-;*gSgz^BT*6eX{`ZU z(f)0J^IA}F`i1w_Rs$WE?-+Ch(VZ?p}H<@}T1D z{%l2}&=LtC81J?GyH>3Q$TIac31u@>}?@Q(fj{&%HDk0&%!^)nortUc1M~57i|QbIjE@ z%D7VrEfaZ;#;)RL273f3V|;ZfFM|SL=iwe55{*A3tS#&-q%Gq#c_0FYRD^0)2-g`G zqJZIf%1zVbLFs{1Qa-UfaOH_Y8IYb4I_M zfD|%}4eMEZ6uoK-t{*fgi-n%PCCu5?GiU8%;p$O@nC?e@%8k4%d3OcIO@#9WMu}j( zQn;3|6v}tnB{Nh?P7Uu!q==}L_gfmtB8e69&EOrUEOC!FVt=^W6gcVxURf)}cKBNw zzQyc7z1g>48Yo3_Y_&E;W z>L?fGWXl46%@T@LGQ=*;E8O|`A(-l(->3aVte4g4R8oklBaaeu?w}X`PreyNz*(GA zB`V)c=-^mM2{5(-cq8BZr?)m^D^RiKG>l?(}e4$=anh2K>T7d_Jc3_8rQH;XMNHx zYL}P8MW3S#5HXE=prr*JQ9OU{Xjn8(G}ZU7bok%4N$V_@XIgmWBa+dc1^%xkZSar^ zGsN%B;4=9qyk2v$98<&H%gZdfapku6B6?QhdIiCJpaFAfRWEeR_KL_+v+fTeJGdoa z5Zh}Hd&Fya1b|J1LiY>#go`l8zGmGoBQ+(k1smW*H0+5d@>$M_wF-5_IEm&`pODb_ z`kR~7vmf*nKjcb&Bw%arqJx^nbg5iN&9F$cA8$STSIVtjMfCpDTQ}|CIzRj%#Du|C z?7#*(?PsJSi;{1ABz`FtO~hC&f{S?KMro-3$f$7=`oA~Sm*}`B=%nLOjzmw9OD5!3 z5twR;>p;vkd6q=b4l*mAL&p>yzK{O<`oF&4wsgbL!jpWNx@feQ?$BlDB)&w*fcb4n z^tdPL=(sr%G>gh2qsMU3FKN`-E?E%$RPb+1@Ego(nA7<#bb}Q7_!7GoA7+mAGNjrM zG<*GsLMZ}AC@PtFnOKVAm3ku+79vuTb6xPZFd+VBhABFa$uYTz9%rC{7-X?cQp|I~ z+i@QJc(43AsAeA4el3bgL!J z#yb){_@eK|v2>dpXl@R&C8MA_apDbij6sc}$t0|R6fXmS%@}zyI>_cqLU3UnPs;se zYph;+PBVM{AYtxxA$m6c4TEDr75zi8?101pRpQvdA=+2%yjPNqO^Yvc=03D@vkO%Y zveQ>t6^&VsI7ydu#Pj|jV)dlacv$MFI@>s<;!SEswqM3XbIy1@%Idhmg{#$rrPVzWUG!AFL7UiHjOB%YI9v4-_q8 zt|{I)2tO5B?J$oi&z0{Yq$?CTtN5gQv6iQFS3-8oPDNz%4AdO~=w{Nw4p#4#-FH|dEX(EvlIP@l`8}z4tjsz7n4zr%^s;GCjx^^*SIqmv27cZOl2P+e?KLq$O!Rh#r+@2qKCAB7!zjfH zh*x_?FN5W_!orc&EsoEZChl z%CW)V*v_fy(kKJYcE_YEi`vOC%mcaK8;x>ilEsWig(z%@^Dp9*uKYZTE7tB!>S% zo6I-mn%HCJz1zgTLvP!v zc*#IbFsMhR2C7|H+oIecXS6vD{i+E5WJb#O8AsNB+Y=jv{uy-CPbuTl+aZ!@f55qO z8<>iQo@iR7_247k5cqgUkVtFY`e#SCk%Tp5T4-&;rJei30#5fF(6@1j8$xAIg4vN4 zY#Qaozx?SPeRrYCg1kGaN5|VE_=m2EyFB9=L(o_h% z^$Xs1-tPXrv5~tSCojFXKu#QLTxm(2C-!*|OR6cnMslozE0=oo+2y)FTHzjMbxf{K zGYT0p%x=qek;!4(Km7NO_Dw7?3IL0u2srL|95GlyxfA*re5EYL;8*-4_t2$btNu6V zkuV|dQZa-cEd02?ZF@n5zF0NzuC*ol3C3#zD~}cjJj1ZKeoc?T|5k|feD+ojy-P_0 z{6%RqERxMWY(~Grd=|nM9>cJB z!N*nJhoR)~Yz{!dOz4cah)be#Uw5S3 LV452an+0c_8!u*E!dK8wbTu(TF_lnUW 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 z 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�TigAItpzw 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%0A5SULA!RPE=U2Fw8aoYe;o;`TId1gh+w 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

)C2 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 SD6c3{5b7Uq>;M7*)cyyhL9=-P literal 0 HcmV?d00001 From 75d768c9369c46fd007bc00947e549b1f7a85846 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 16:04:02 +0300 Subject: [PATCH 026/152] tiny fix. --- .../homer/{homer-lazy2-.gif => homer-lazy-2.gif} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/images/homer/{homer-lazy2-.gif => homer-lazy-2.gif} (100%) diff --git a/assets/images/homer/homer-lazy2-.gif b/assets/images/homer/homer-lazy-2.gif similarity index 100% rename from assets/images/homer/homer-lazy2-.gif rename to assets/images/homer/homer-lazy-2.gif From d31823c1d9d4bb9dd864622088154ffe52d7eedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:04:43 +0300 Subject: [PATCH 027/152] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00bf9d5..1cc80c5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@

homer

- +
+ +
:rocket::zap::sparkles: From 988bfb9e6b29028efe1634c9c1183a24f948a2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:06:35 +0300 Subject: [PATCH 028/152] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 1cc80c5..c44a28e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,12 @@ homer is code-first home & office automation system allowing complex interaction ## why? +
+ +
+
As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. +
## Requirements From 0382c65c05a6f06660d955dfc97f6ec5f091298e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:07:44 +0300 Subject: [PATCH 029/152] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c44a28e..9e59ef7 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,10 @@ homer is code-first home & office automation system allowing complex interaction ## why? -
+
-
+
As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together.
From a8c2b46f389f52e691652f864f64c607e04da809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:08:23 +0300 Subject: [PATCH 030/152] Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9e59ef7..52f6840 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,10 @@ homer is code-first home & office automation system allowing complex interaction ## why? -
- +
+
-
As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. -
## Requirements From b914218c6ed41c0f9876a0f3059ac7cf094330bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:09:07 +0300 Subject: [PATCH 031/152] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 52f6840..b31eb69 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ homer is code-first home & office automation system allowing complex interaction
+
As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. From 7a9237e7adb31234741eaf34dcd6692e1c53c9d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:09:32 +0300 Subject: [PATCH 032/152] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b31eb69..fbdcb1d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@
+
@@ -31,7 +32,6 @@ homer is code-first home & office automation system allowing complex interaction
-
As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. From 96cffa362d6bf19d0c56767e2fdab198494886d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:09:57 +0300 Subject: [PATCH 033/152] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fbdcb1d..5d52caa 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@
-
@@ -52,3 +51,7 @@ Windows: .\build.cmd Linux: ./build.sh MacOS: ./build.sh ``` + +
+ +
From 95985c883a1a33528d22f28dc95c07e9530207e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:10:32 +0300 Subject: [PATCH 034/152] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d52caa..f686c26 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,11 @@ homer is code-first home & office automation system allowing complex interaction ## why? +As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. +
-As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. ## Requirements From 12a4b03548ac5a799cf899adf37a3c0a914b7a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:31:31 +0300 Subject: [PATCH 035/152] Update README.md --- README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f686c26..82ddd72 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,7 @@
-
- -
- :rocket::zap::sparkles: -
-
- The complete home automation for Homer Simpson. +The complete home automation for Homer Simpson.

@@ -33,6 +27,7 @@ As current so called "home automation" systems are actually just "home informati
+homer, orchestrating the office.
## Requirements From f12a3ad6f416dac6f0106ced269814112bcde7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:31:55 +0300 Subject: [PATCH 036/152] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 82ddd72..d6b0636 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@
-The complete home automation for Homer Simpson. +
The complete home automation for Homer Simpson.

@@ -27,7 +27,7 @@ As current so called "home automation" systems are actually just "home informati
-homer, orchestrating the office. +
homer, orchestrating the office.
## Requirements From e03009dd1bef3f1bae4df387aeb4886ab3daca47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:33:10 +0300 Subject: [PATCH 037/152] Update README.md --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d6b0636..17e62e1 100644 --- a/README.md +++ b/README.md @@ -32,22 +32,25 @@ As current so called "home automation" systems are actually just "home informati ## Requirements +``` - dotnet core 3.1 - -## Tests - ``` -dotnet test -``` ## Building ``` +git clone https://github.com/bonesoul/homer Windows: .\build.cmd Linux: ./build.sh MacOS: ./build.sh ``` +## Tests + +``` +dotnet test +``` +
From fea98cab1d4acb2da5228036c6a5188d56747578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Thu, 6 Feb 2020 16:35:29 +0300 Subject: [PATCH 038/152] Update README.md --- README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 17e62e1..c2e1d04 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,21 @@ As current so called "home automation" systems are actually just "home informati
homer, orchestrating the office.
-## Requirements +## status + +still in early development stage. + +## voice control support? + +initially will have support for apple homekit, have plans for alexa & goole asistant support too. + +## requirements ``` - - dotnet core 3.1 +dotnet core 3.1 ``` -## Building +## building ``` git clone https://github.com/bonesoul/homer @@ -45,7 +53,7 @@ Linux: ./build.sh MacOS: ./build.sh ``` -## Tests +## tests ``` dotnet test From 572445b9f8bfae0b8d0c3d02f73391fb2208586d Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Thu, 6 Feb 2020 18:06:12 +0300 Subject: [PATCH 039/152] some tests. --- rust/Cargo.lock | 5 +++++ rust/Cargo.toml | 9 +++++++++ rust/src/main.rs | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 rust/Cargo.lock create mode 100644 rust/Cargo.toml create mode 100644 rust/src/main.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock new file mode 100644 index 0000000..72948f8 --- /dev/null +++ b/rust/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "homer" +version = "0.1.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 0000000..05d892d --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "homer" +version = "0.1.0" +authors = ["huseyin uslu "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/src/main.rs b/rust/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/rust/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} From c8a4929d5148309496c44b93b5246e8ef73c461b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 7 Feb 2020 06:15:23 +0000 Subject: [PATCH 040/152] Update dependency McMaster.Extensions.CommandLineUtils to v2.5.1 --- build/Homer.Build.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Homer.Build.csproj b/build/Homer.Build.csproj index f519159..a50783e 100644 --- a/build/Homer.Build.csproj +++ b/build/Homer.Build.csproj @@ -24,7 +24,7 @@ - + From 480579ab91c67c317c5bd1f263379188b697c5fd Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 11:55:56 +0300 Subject: [PATCH 041/152] more characteristic work. --- .../homekit/Characteristics/Characteristic.cs | 79 +++++++++++++++++++ .../Characteristics/ICharacteristic.cs | 48 +++++++++++ src/platforms/homekit/Services/IService.cs | 2 +- src/platforms/homekit/Services/Service.cs | 4 +- 4 files changed, 130 insertions(+), 3 deletions(-) diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 843f299..30d5e9a 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -42,6 +42,9 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp /// public dynamic Value { get; private set; } + /// + public int Subscriptions { get; } + /// public IReadOnlyList Permissions { get; } @@ -78,6 +81,52 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp /// public dynamic[] ValidValuesRange { get; } + /// + public event EventHandler Get; + + /// + public event EventHandler Set; + + /// + public event EventHandler OnSubscribe; + + /// + public event EventHandler OnUnsubscribe; + + /// + public event EventHandler Change; + + /** + * Characteristic represents a particular typed variable that can be assigned to a Service. For instance, a + * "Hue" Characteristic might store a 'float' value of type 'arcdegrees'. You could add the Hue Characteristic + * to a Service in order to store that value. A particular Characteristic is distinguished from others by its + * UUID. HomeKit provides a set of known Characteristic UUIDs defined in HomeKit.ts along with a + * corresponding concrete subclass. + * + * You can also define custom Characteristics by providing your own UUID. Custom Characteristics can be added + * to any native or custom Services, but Siri will likely not be able to work with these. + * + * Note that you can get the "value" of a Characteristic by accessing the "value" property directly, but this + * is really a "cached value". If you want to fetch the latest value, which may involve doing some work, then + * call getValue(). + * + * @event 'get' => function(callback(err, newValue), context) { } + * Emitted when someone calls getValue() on this Characteristic and desires the latest non-cached + * value. If there are any listeners to this event, one of them MUST call the callback in order + * for the value to ever be delivered. The `context` object is whatever was passed in by the initiator + * of this event (for instance whomever called `getValue`). + * + * @event 'set' => function(newValue, callback(err), context) { } + * Emitted when someone calls setValue() on this Characteristic with a desired new value. If there + * are any listeners to this event, one of them MUST call the callback in order for this.value to + * actually be set. The `context` object is whatever was passed in by the initiator of this change + * (for instance, whomever called `setValue`). + * + * @event 'change' => function({ oldValue, newValue, context }) { } + * Emitted after a change in our value has occurred. The new value will also be immediately accessible + * in this.value. The event object contains the new value as well as the context object originally + * passed in by the initiator of this change (if known). + */ protected Characteristic(string uuid, string displayName, CharacteristicFormat format, IReadOnlyList permissions, CharacteristicUnit unit = CharacteristicUnit.Unitless, bool eventNotificationsEnabled = false, string description = null, @@ -109,11 +158,41 @@ protected Characteristic(string uuid, string displayName, CharacteristicFormat f Value = GetDefaultValue(); } + public void Subscribe() + { + throw new NotImplementedException(); + } + + public void Unsubscribe() + { + throw new NotImplementedException(); + } + + public void GetValue() + { + throw new NotImplementedException(); + } + public void SetValue(dynamic value) { Value = value; } + public string ToHapJson() + { + throw new NotImplementedException(); + } + + private void ValidateValue(dynamic value) + { + + } + + private void AssignInstanceId() + { + + } + private dynamic GetDefaultValue() { return Format switch diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 3e07192..350d3a9 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -21,6 +21,7 @@ // Licensor: Hüseyin Uslu #endregion +using System; using DaanV2.UUID; namespace Homer.Platform.HomeKit.Characteristics @@ -63,10 +64,57 @@ public interface ICharacteristic ///

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 literal 0 HcmV?d00001 diff --git a/assets/images/homer/homer-lazy-3.gif b/assets/images/homer/homer-lazy-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f5a678bad1f0c50d15028f81a1fd907ad49e782 GIT binary patch literal 72276 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%0D}@ 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�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 SE88%o&Ehh(-lTV#K>z+S5eM(7v-7y{Gsolm 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

dynamic Value { get; } + /// + /// Number of subscriptions to event. + /// + int Subscriptions { get; } + + /// + /// Get event. + /// + event EventHandler Get; + + /// + /// Set event. + /// + event EventHandler Set; + + /// + /// Subscribe event. + /// + event EventHandler OnSubscribe; + + /// + /// Unsubscribe event. + /// + event EventHandler OnUnsubscribe; + + /// + /// Change event. + /// + event EventHandler Change; + + /// + /// Subscribe to characteristic. + /// + void Subscribe(); + + /// + /// Unsubscribe from characteristic. + /// + void Unsubscribe(); + + /// + /// Gets value of the characteristic. + /// + void GetValue(); + /// /// Sets value for the characteristic. /// /// void SetValue(dynamic value); + + string ToHapJson(); } } diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index ceb8c3b..07ec04f 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -142,6 +142,6 @@ public interface IService: IEntity ICharacteristic GetOptionalCharacteristicByInstanceId(int iid); - IService ToHapJson(); + string ToHapJson(); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index 34d81b9..ef2a122 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -211,9 +211,9 @@ public ICharacteristic GetOptionalCharacteristicByInstanceId(int iid) return (from x in _optionalCharacteristics where x.Value.InstanceId == iid select x.Value).FirstOrDefault(); } - public IService ToHapJson() + public string ToHapJson() { - return this; // allow chaining. + return ""; } } } From c6c553055f1096cb74e077fba52a2d908c5e042f Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 11:56:49 +0300 Subject: [PATCH 042/152] remove unused files. --- rust/Cargo.lock | 5 ----- rust/Cargo.toml | 9 --------- rust/src/main.rs | 3 --- 3 files changed, 17 deletions(-) delete mode 100644 rust/Cargo.lock delete mode 100644 rust/Cargo.toml delete mode 100644 rust/src/main.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock deleted file mode 100644 index 72948f8..0000000 --- a/rust/Cargo.lock +++ /dev/null @@ -1,5 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "homer" -version = "0.1.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml deleted file mode 100644 index 05d892d..0000000 --- a/rust/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "homer" -version = "0.1.0" -authors = ["huseyin uslu "] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] diff --git a/rust/src/main.rs b/rust/src/main.rs deleted file mode 100644 index e7a11a9..0000000 --- a/rust/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} From 4dd96abeb66afc53a1b011c4866839a779ea812b Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 12:20:57 +0300 Subject: [PATCH 043/152] added packages. --- src/core/Homer.Core.csproj | 39 +++++++++++++++++++ .../homekit/Homer.Platform.HomeKit.csproj | 22 +++++++++++ src/server/Homer.Server.csproj | 22 +++++++++++ 3 files changed, 83 insertions(+) diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj index 9ac4763..583f299 100644 --- a/src/core/Homer.Core.csproj +++ b/src/core/Homer.Core.csproj @@ -6,4 +6,43 @@ Homer.Core + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 8234b94..81621f0 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -4,6 +4,28 @@ netcoreapp3.1 + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/server/Homer.Server.csproj b/src/server/Homer.Server.csproj index c1cb060..cb96454 100644 --- a/src/server/Homer.Server.csproj +++ b/src/server/Homer.Server.csproj @@ -5,6 +5,28 @@ netcoreapp3.1 + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + From bac91317c43ee5d7b731d32d3c75591f56ee6310 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 12:57:29 +0300 Subject: [PATCH 044/152] implemented core internals. --- build/Homer.Build.csproj | 10 +- contrib/uuid.net/uuid.net.csproj | 1 + homer.sln | 98 +++++------ src/core/Homer.Core.csproj | 25 ++- src/core/Host/IServerHost.cs | 17 ++ src/core/Host/ServerHost.cs | 88 ++++++++++ src/core/Internals/Bootstrap/Bootstrapper.cs | 56 ++++++ src/core/Internals/Bootstrap/IBootstrapper.cs | 15 ++ src/core/Internals/Culture.cs | 20 +++ .../Internals/Factories/Core/CoreFactory.cs | 30 ++++ .../Internals/Factories/Core/ICoreFactory.cs | 16 ++ src/core/Internals/Logging/ILogManager.cs | 17 ++ src/core/Internals/Logging/LogManager.cs | 162 ++++++++++++++++++ src/core/Internals/Registries/CoreRegistry.cs | 26 +++ .../Internals/Registries/FactoryRegistry.cs | 26 +++ src/core/Internals/Registries/IRegistry.cs | 13 ++ .../Internals/Registries/ServiceRegistry.cs | 28 +++ .../Internals/Registries/StorageRegistry.cs | 24 +++ .../Configuration/ConfigurationService.cs | 123 +++++++++++++ .../Configuration/IConfigurationService.cs | 26 +++ .../Models/ConfigurationModel.cs | 13 ++ .../Models/IConfigurationModel.cs | 15 ++ src/core/Internals/Services/IService.cs | 9 + .../Services/Runtime/IRuntimeInfoService.cs | 39 +++++ .../Services/Runtime/RuntimeInfoService.cs | 122 +++++++++++++ src/core/Utils/IO/FileHelper.cs | 34 ++++ src/core/config/.gitignore | 1 + src/core/config/default.yaml | 19 ++ src/core/config/development.yaml | 1 + src/core/config/production.yaml | 15 ++ src/core/config/test.yaml | 1 + .../homekit/Homer.Platform.HomeKit.csproj | 1 + src/server/Homer.Server.csproj | 2 + src/server/Program.cs | 33 ++-- 34 files changed, 1054 insertions(+), 72 deletions(-) create mode 100644 src/core/Host/IServerHost.cs create mode 100644 src/core/Host/ServerHost.cs create mode 100644 src/core/Internals/Bootstrap/Bootstrapper.cs create mode 100644 src/core/Internals/Bootstrap/IBootstrapper.cs create mode 100644 src/core/Internals/Culture.cs create mode 100644 src/core/Internals/Factories/Core/CoreFactory.cs create mode 100644 src/core/Internals/Factories/Core/ICoreFactory.cs create mode 100644 src/core/Internals/Logging/ILogManager.cs create mode 100644 src/core/Internals/Logging/LogManager.cs create mode 100644 src/core/Internals/Registries/CoreRegistry.cs create mode 100644 src/core/Internals/Registries/FactoryRegistry.cs create mode 100644 src/core/Internals/Registries/IRegistry.cs create mode 100644 src/core/Internals/Registries/ServiceRegistry.cs create mode 100644 src/core/Internals/Registries/StorageRegistry.cs create mode 100644 src/core/Internals/Services/Configuration/ConfigurationService.cs create mode 100644 src/core/Internals/Services/Configuration/IConfigurationService.cs create mode 100644 src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs create mode 100644 src/core/Internals/Services/IService.cs create mode 100644 src/core/Internals/Services/Runtime/IRuntimeInfoService.cs create mode 100644 src/core/Internals/Services/Runtime/RuntimeInfoService.cs create mode 100644 src/core/Utils/IO/FileHelper.cs create mode 100644 src/core/config/.gitignore create mode 100644 src/core/config/default.yaml create mode 100644 src/core/config/development.yaml create mode 100644 src/core/config/production.yaml create mode 100644 src/core/config/test.yaml diff --git a/build/Homer.Build.csproj b/build/Homer.Build.csproj index a50783e..d06341b 100644 --- a/build/Homer.Build.csproj +++ b/build/Homer.Build.csproj @@ -3,13 +3,17 @@ Exe netcoreapp3.1 - AnyCPU;x64 + AnyCPU;x64;x86 + + + + @@ -18,6 +22,10 @@ + + + + diff --git a/contrib/uuid.net/uuid.net.csproj b/contrib/uuid.net/uuid.net.csproj index cb63190..33eb583 100644 --- a/contrib/uuid.net/uuid.net.csproj +++ b/contrib/uuid.net/uuid.net.csproj @@ -2,6 +2,7 @@ netcoreapp3.1 + AnyCPU;x64;x86 diff --git a/homer.sln b/homer.sln index f89311d..0243de1 100644 --- a/homer.sln +++ b/homer.sln @@ -3,10 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29709.97 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Core", "src\core\Homer.Core.csproj", "{DA1CF614-7D2E-49BA-B27F-4334B964C2E0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Contrib", "Contrib", "{EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED96F7FE-6FF3-4C84-9976-46D2C8557E8A}" @@ -17,9 +13,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Build", "build\Homer. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.net\uuid.net.csproj", "{A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{44EBF15C-12ED-47D3-9005-D5B0C3A74EC4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Core", "src\core\Homer.Core.csproj", "{DE52E76D-1044-4EFC-974A-30389D2AE72D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Server", "src\server\Homer.Server.csproj", "{BBB13930-B43C-4332-B005-9DCCF09DD418}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Server", "src\server\Homer.Server.csproj", "{40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,75 +27,73 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x64.ActiveCfg = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x64.Build.0 = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x86.ActiveCfg = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Debug|x86.Build.0 = Debug|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|Any CPU.Build.0 = Release|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x64.ActiveCfg = Release|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x64.Build.0 = Release|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.ActiveCfg = Release|Any CPU - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0}.Release|x86.Build.0 = Release|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.ActiveCfg = Debug|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.Build.0 = Debug|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.ActiveCfg = Debug|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.Build.0 = Debug|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.ActiveCfg = Debug|x64 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x64.Build.0 = Debug|x64 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.ActiveCfg = Debug|x86 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Debug|x86.Build.0 = Debug|x86 {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|Any CPU.ActiveCfg = Release|Any CPU {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|Any CPU.Build.0 = Release|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.ActiveCfg = Release|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.Build.0 = Release|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.ActiveCfg = Release|Any CPU - {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.Build.0 = Release|Any CPU + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.ActiveCfg = Release|x64 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x64.Build.0 = Release|x64 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.ActiveCfg = Release|x86 + {75D7361A-EEC0-489C-AA21-3B0511668D9D}.Release|x86.Build.0 = Release|x86 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|Any CPU.Build.0 = Debug|Any CPU {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x64.ActiveCfg = Debug|x64 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x64.Build.0 = Debug|x64 - {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.ActiveCfg = Debug|Any CPU - {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.Build.0 = Debug|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.ActiveCfg = Debug|x64 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Debug|x86.Build.0 = Debug|x64 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|Any CPU.ActiveCfg = Release|Any CPU {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|Any CPU.Build.0 = Release|Any CPU {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x64.ActiveCfg = Release|x64 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x64.Build.0 = Release|x64 - {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.ActiveCfg = Release|Any CPU - {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.Build.0 = Release|Any CPU + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.ActiveCfg = Release|x86 + {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.Build.0 = Release|x86 {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.ActiveCfg = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.Build.0 = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.ActiveCfg = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.Build.0 = Debug|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.ActiveCfg = Debug|x64 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.Build.0 = Debug|x64 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.ActiveCfg = Debug|x86 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.Build.0 = Debug|x86 {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.Build.0 = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.ActiveCfg = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.Build.0 = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.ActiveCfg = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.Build.0 = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x64.ActiveCfg = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x64.Build.0 = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x86.ActiveCfg = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Debug|x86.Build.0 = Debug|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|Any CPU.Build.0 = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x64.ActiveCfg = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x64.Build.0 = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x86.ActiveCfg = Release|Any CPU - {BBB13930-B43C-4332-B005-9DCCF09DD418}.Release|x86.Build.0 = Release|Any CPU + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.ActiveCfg = Release|x64 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.Build.0 = Release|x64 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.ActiveCfg = Release|x86 + {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.Build.0 = Release|x86 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|x64.ActiveCfg = Debug|x64 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|x64.Build.0 = Debug|x64 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|x86.ActiveCfg = Debug|x86 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|x86.Build.0 = Debug|x86 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|Any CPU.Build.0 = Release|Any CPU + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x64.ActiveCfg = Release|x64 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x64.Build.0 = Release|x64 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x86.ActiveCfg = Release|x86 + {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x86.Build.0 = Release|x86 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x64.ActiveCfg = Debug|x64 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x64.Build.0 = Debug|x64 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x86.ActiveCfg = Debug|x86 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x86.Build.0 = Debug|x86 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|Any CPU.Build.0 = Release|Any CPU + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x64.ActiveCfg = Release|x64 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x64.Build.0 = Release|x64 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x86.ActiveCfg = Release|x86 + {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {DA1CF614-7D2E-49BA-B27F-4334B964C2E0} = {9EA2E57A-D4CA-481B-AA3F-7A6E4E84A106} {75D7361A-EEC0-489C-AA21-3B0511668D9D} = {ED96F7FE-6FF3-4C84-9976-46D2C8557E8A} {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} - {BBB13930-B43C-4332-B005-9DCCF09DD418} = {44EBF15C-12ED-47D3-9005-D5B0C3A74EC4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj index 583f299..923e66c 100644 --- a/src/core/Homer.Core.csproj +++ b/src/core/Homer.Core.csproj @@ -4,12 +4,9 @@ netcoreapp3.1 Homer.Core Homer.Core + AnyCPU;x64;x86 - - - - all @@ -45,4 +42,24 @@ + + + + + + + + Always + + + Always + + + Always + + + Always + + + diff --git a/src/core/Host/IServerHost.cs b/src/core/Host/IServerHost.cs new file mode 100644 index 0000000..c314b52 --- /dev/null +++ b/src/core/Host/IServerHost.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Homer.Core.Internals.Registries; + +namespace Homer.Core.Host +{ + public interface IServerHost + { + /// + /// Initializes service host. + /// + /// + /// + /// does host need networking support? + Task InitializeAsync(IReadOnlyList registries, string[] args, bool needsNetworkingSupport = false); + } +} diff --git a/src/core/Host/ServerHost.cs b/src/core/Host/ServerHost.cs new file mode 100644 index 0000000..316efcf --- /dev/null +++ b/src/core/Host/ServerHost.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using Homer.Core.Internals; +using Homer.Core.Internals.Bootstrap; +using Homer.Core.Internals.Factories.Core; +using Homer.Core.Internals.Registries; +using Homer.Core.Internals.Services.Configuration; +using Homer.Core.Internals.Services.Runtime; +using Serilog; +using Stashbox; + +namespace Homer.Core.Host +{ + /// + /// Service host. + /// + public class ServerHost : IServerHost + { + private readonly Bootstrapper _bootstrapper; + + private ILogger _logger; // logger to use with unhandled exceptions. + + public ServerHost(Bootstrapper bootstrapper) + { + _bootstrapper = bootstrapper; + } + + /// + public async Task InitializeAsync(IReadOnlyList registries, string[] args, bool needsNetworkingSupport = false) + { + // init unhandled exception handler. + AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; // Catch any unhandled exceptions if we are in release mode. + + // setup default culture. + CultureInfo.DefaultThreadCurrentCulture = Culture.Default; + CultureInfo.DefaultThreadCurrentUICulture = Culture.Default; + + // init bootstrapper. + _bootstrapper.Run(registries.ToList()); + + // load the runtime service. + var runtimeInfoService = _bootstrapper.Container.Resolve(); + + // load the configuration. + var configurationService = _bootstrapper.Container.Resolve(); + if (!configurationService.Load(args)) Environment.Exit(-1); // if we can't load the config, exit the process. + + // init the logger. + var coreFactory = _bootstrapper.Container.Resolve(); // get core object factory. + coreFactory.GetLogManager(); // resolve log manager, so it gets internalized. + _logger = Log.ForContext(); // create logger to be used later. + + // print startup banner & info. + runtimeInfoService.PrintBanner(); // print startup banner. + configurationService.LogSummary(); // log the configuration summary. + } + + /// + /// Unhandled exception emitter. + /// + /// + /// + private void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) + { + if (!(e.ExceptionObject is Exception exception)) // if we can't get the exception, whine about it. + { + _logger.Error("can't get exception object from UnhandledExceptionEventArgs"); + throw new ArgumentNullException(nameof(e)); + } + + if (!e.IsTerminating) + { + _logger.Fatal(exception, "terminating because of unhandled exception: {Message:l}", exception.Message); + } + else + { + _logger.Error(exception, "caught unhandled exception: {Message:l}", exception.Message); + +#if !DEBUG + Environment.Exit(-1); // prevent console window from being closed when we are in development mode. +#endif + } + } + } +} diff --git a/src/core/Internals/Bootstrap/Bootstrapper.cs b/src/core/Internals/Bootstrap/Bootstrapper.cs new file mode 100644 index 0000000..fef6ece --- /dev/null +++ b/src/core/Internals/Bootstrap/Bootstrapper.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using Homer.Core.Internals.Registries; +using Stashbox; + +namespace Homer.Core.Internals.Bootstrap +{ + /// + /// IoC container kernel bootstrapper + /// + public class Bootstrapper : IBootstrapper + { + /// + public StashboxContainer Container { get; } + + // list of registries. + private readonly List _registries; + + /// + /// Creates a new instance of bootstrapper. + /// + public Bootstrapper() + { + Container = new StashboxContainer(); // create the container. + + // create the list of registries. + _registries = new List + { + new CoreRegistry(Container), + new FactoryRegistry(Container), + new ServiceRegistry(Container), + new StorageRegistry(Container), + }; + } + + /// + /// Runs and handles the registries attached. + /// + /// + public void Run(IList additional) + { + _registries.AddRange(additional); // add additional registries if any. + AttachRegistries(); // handle main registries. + } + + /// + /// Attaches the registries. + /// + private void AttachRegistries() + { + foreach (var registry in _registries) // loop through registries. + { + registry.Attach(); // attach the registry. + } + } + } +} diff --git a/src/core/Internals/Bootstrap/IBootstrapper.cs b/src/core/Internals/Bootstrap/IBootstrapper.cs new file mode 100644 index 0000000..c43d257 --- /dev/null +++ b/src/core/Internals/Bootstrap/IBootstrapper.cs @@ -0,0 +1,15 @@ +using Stashbox; + +namespace Homer.Core.Internals.Bootstrap +{ + /// + /// Interface for IoC container kernel bootstrapper + /// + public interface IBootstrapper + { + /// + /// The IoC container + /// + StashboxContainer Container { get; } + } +} diff --git a/src/core/Internals/Culture.cs b/src/core/Internals/Culture.cs new file mode 100644 index 0000000..51dcfeb --- /dev/null +++ b/src/core/Internals/Culture.cs @@ -0,0 +1,20 @@ +using System.Globalization; + +namespace Homer.Core.Internals +{ + /// + /// Culture info. + /// + public static class Culture + { + /// + /// Default culture + /// + public static CultureInfo Default { get; } + + static Culture() + { + Default = new CultureInfo("en-US"); + } + } +} diff --git a/src/core/Internals/Factories/Core/CoreFactory.cs b/src/core/Internals/Factories/Core/CoreFactory.cs new file mode 100644 index 0000000..3953b1c --- /dev/null +++ b/src/core/Internals/Factories/Core/CoreFactory.cs @@ -0,0 +1,30 @@ +using System; +using Homer.Core.Internals.Logging; +using Stashbox; + +namespace Homer.Core.Internals.Factories.Core +{ + /// + /// Factory for core objects. + /// + public class CoreFactory : ICoreFactory + { + // ioc container. + private readonly IDependencyResolver _resolver; + + /// + /// Creates a new instance of core factory. + /// + /// IoC container + public CoreFactory(IDependencyResolver resolver) + { + _resolver = resolver ?? throw new ArgumentNullException(nameof(resolver)); + } + + /// + public ILogManager GetLogManager() + { + return _resolver.Resolve(); + } + } +} diff --git a/src/core/Internals/Factories/Core/ICoreFactory.cs b/src/core/Internals/Factories/Core/ICoreFactory.cs new file mode 100644 index 0000000..fd8c6b5 --- /dev/null +++ b/src/core/Internals/Factories/Core/ICoreFactory.cs @@ -0,0 +1,16 @@ +using Homer.Core.Internals.Logging; + +namespace Homer.Core.Internals.Factories.Core +{ + /// + /// Interface for core object factory. + /// + public interface ICoreFactory + { + /// + /// Returns log manager. + /// + /// + ILogManager GetLogManager(); + } +} diff --git a/src/core/Internals/Logging/ILogManager.cs b/src/core/Internals/Logging/ILogManager.cs new file mode 100644 index 0000000..6df1ee8 --- /dev/null +++ b/src/core/Internals/Logging/ILogManager.cs @@ -0,0 +1,17 @@ +using Serilog; + +namespace Homer.Core.Internals.Logging +{ + /// + /// Interface for log manager. + /// + public interface ILogManager + { + /// + /// Creates a separate task logger. + /// + /// name of the log file + /// + ILogger GetPluginLogger(string name); + } +} diff --git a/src/core/Internals/Logging/LogManager.cs b/src/core/Internals/Logging/LogManager.cs new file mode 100644 index 0000000..c3d0a42 --- /dev/null +++ b/src/core/Internals/Logging/LogManager.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Homer.Core.Internals.Services.Configuration; +using Homer.Core.Utils.IO; +using Serilog; +using Serilog.Core; +using Serilog.Events; +using Serilog.Sinks.SystemConsole.Themes; + +namespace Homer.Core.Internals.Logging +{ + /// + /// Log manager. + /// _ + public class LogManager : ILogManager + { + // the log root. + private string _logRoot; + + // the service attached the logs. + private readonly string _service; + + // console log template for master log. + private const string MasterLogConsoleTemplate = "{Timestamp:HH:mm:ss} [{Level:u3}] [{Source:l}] {Message}{NewLine}{Exception}"; + + // file log template for master log. + private const string MasterLogFileTemplate = "{Timestamp} [{Level:u3}] [{Source:l}] {Message}{NewLine}{Exception}"; + + // template for custom logs. + private const string JobFileLoggerTemplate = "{Timestamp} [{Level:u3}] [{Source:l}] {Message}{NewLine}{Exception}"; + + // console template for custom logs. + private const string JobConsoleLoggerTemplate = "{Timestamp:HH:mm:ss} [{Level:u3}] [{Source:l}] {Message}{NewLine}{Exception}"; + + // job loggers. + private readonly IDictionary _pluginLoggers; + + // configuration service + private readonly IConfigurationService _configurationService; + + public LogManager(IConfigurationService configurationService) + { + _configurationService = configurationService; + _pluginLoggers = new Dictionary(); // list of custom job loggers. + CheckLogDirectory(); // check the log directory exists, create it if needed. + + // get the project name + var service = Assembly.GetEntryAssembly()?.GetName().Name; + _service = service?.Substring(service.IndexOf('.', StringComparison.CurrentCulture) + 1); + + CreateMasterLogger(); // create the main logger. + } + + /// + /// Checks log directory and creates if it does not exist. + /// + private void CheckLogDirectory() + { + _logRoot = Path.Combine(FileHelper.AssemblyRoot, "logs"); // get log folder. + if (!Directory.Exists(_logRoot)) Directory.CreateDirectory(_logRoot); // make sure log root exists, else create it. + } + + /// + /// Creates master logger. + /// + private void CreateMasterLogger() + { + // check for job logger's root path. + var root = Path.Combine(_logRoot, _service.Replace('.', '/')); // get the root path. + if (!Directory.Exists(root)) Directory.CreateDirectory(root); // if doesn't exist create it. + var path = Path.Combine(root, $"task.log"); // get the path. + + var builder = new LoggerConfiguration() + .Enrich.WithThreadId() // enrich with thread id. + .Enrich.With(new SourceEnricher()) // used for enriching logs with sources. + .MinimumLevel.Verbose(); // lower the default minimum level to verbose as sinks can only rise them but not lower. + + if (_configurationService.Configuration.Logs.Master.Console.Enabled) // if console log is enabled. + builder = builder.WriteTo.Console(GetLogLevel(_configurationService.Configuration.Logs.Master.Console.Level), MasterLogConsoleTemplate, theme: AnsiConsoleTheme.Code); + + if (_configurationService.Configuration.Logs.Master.File.Enabled) // if file log is enabled. + builder = builder.WriteTo.File(path, GetLogLevel(_configurationService.Configuration.Logs.Master.File.Level), MasterLogFileTemplate); + + Log.Logger = builder.CreateLogger(); // create the logger. + } + + /// + public ILogger GetPluginLogger(string name) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + + if (_pluginLoggers.ContainsKey(name)) // if the requested job logger already exists, + return _pluginLoggers[name]; // return a reference to it. + + // check for job logger's root path. + var root = Path.Combine(_logRoot, _service.Replace('.', '/')); // get the root path. + if (!Directory.Exists(root)) Directory.CreateDirectory(root); // if doesn't exist create it. + var path = Path.Combine(root, $"{name}.log"); // get the path. + + var builder = new LoggerConfiguration() // create the logger. + .Enrich.With(new SourceEnricher()) // used for enriching logs with sources. + .MinimumLevel.Verbose(); // lower the default minimum level to verbose as sinks can only rise them but not lower. + + if (_configurationService.Configuration.Logs.Jobs.Console.Enabled) // if console log is enabled. + builder = builder.WriteTo.Console(GetLogLevel(_configurationService.Configuration.Logs.Jobs.Console.Level), JobConsoleLoggerTemplate, theme: AnsiConsoleTheme.Code); + + if (_configurationService.Configuration.Logs.Jobs.File.Enabled) // if file log is enabled. + builder = builder.WriteTo.File(path, GetLogLevel(_configurationService.Configuration.Logs.Jobs.File.Level), JobFileLoggerTemplate); + + _pluginLoggers[name] = builder.CreateLogger(); // create the logger. + + return _pluginLoggers[name]; + } + + /// + /// Encrichs the log + /// + private class SourceEnricher : ILogEventEnricher + { + public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) + { + logEvent.AddPropertyIfAbsent(logEvent.Properties.Keys.Contains("SourceContext") + ? propertyFactory.CreateProperty("Source", logEvent.Properties["SourceContext"].ToString().Replace("\"", "", true, Culture.Default).Split('.').Last()) + : propertyFactory.CreateProperty("Source", "n/a")); + } + } + + private LogEventLevel GetLogLevel(string input) + { + LogEventLevel level; + switch (input) + { + case "verbose": + level = LogEventLevel.Verbose; + break; + case "debug": + level = LogEventLevel.Debug; + break; + case "info": + level = LogEventLevel.Information; + break; + case "warning": + level = LogEventLevel.Warning; + break; + case "error": + level = LogEventLevel.Error; + break; + case "fatal": + level = LogEventLevel.Fatal; + break; + default: + level = LogEventLevel.Verbose; + break; + } + + return level; + } + } +} diff --git a/src/core/Internals/Registries/CoreRegistry.cs b/src/core/Internals/Registries/CoreRegistry.cs new file mode 100644 index 0000000..3026fab --- /dev/null +++ b/src/core/Internals/Registries/CoreRegistry.cs @@ -0,0 +1,26 @@ +using System; +using Homer.Core.Internals.Logging; +using Stashbox; + +namespace Homer.Core.Internals.Registries +{ + /// + /// Core object registry. + /// + public class CoreRegistry : IRegistry + { + // ioc container. + private readonly StashboxContainer _container; + + public CoreRegistry(StashboxContainer container) + { + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + /// + public void Attach() + { + _container.RegisterSingleton(); + } + } +} diff --git a/src/core/Internals/Registries/FactoryRegistry.cs b/src/core/Internals/Registries/FactoryRegistry.cs new file mode 100644 index 0000000..c256e39 --- /dev/null +++ b/src/core/Internals/Registries/FactoryRegistry.cs @@ -0,0 +1,26 @@ +using System; +using Homer.Core.Internals.Factories.Core; +using Stashbox; + +namespace Homer.Core.Internals.Registries +{ + /// + /// Factory registry. + /// + public class FactoryRegistry : IRegistry + { + // ioc container. + private readonly StashboxContainer _container; + + public FactoryRegistry(StashboxContainer container) + { + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + /// + public void Attach() + { + _container.RegisterSingleton(); + } + } +} diff --git a/src/core/Internals/Registries/IRegistry.cs b/src/core/Internals/Registries/IRegistry.cs new file mode 100644 index 0000000..232128e --- /dev/null +++ b/src/core/Internals/Registries/IRegistry.cs @@ -0,0 +1,13 @@ +namespace Homer.Core.Internals.Registries +{ + /// + /// Interface for IoC container registries. + /// + public interface IRegistry + { + /// + /// Attach the registry so that it can register it's members. + /// + void Attach(); + } +} diff --git a/src/core/Internals/Registries/ServiceRegistry.cs b/src/core/Internals/Registries/ServiceRegistry.cs new file mode 100644 index 0000000..23a01ca --- /dev/null +++ b/src/core/Internals/Registries/ServiceRegistry.cs @@ -0,0 +1,28 @@ +using System; +using Homer.Core.Internals.Services.Configuration; +using Homer.Core.Internals.Services.Runtime; +using Stashbox; + +namespace Homer.Core.Internals.Registries +{ + /// + /// Service registry. + /// + public class ServiceRegistry : IRegistry + { + // ioc container. + private readonly StashboxContainer _container; + + public ServiceRegistry(StashboxContainer container) + { + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + /// + public void Attach() + { + _container.RegisterSingleton(); + _container.RegisterSingleton(); + } + } +} diff --git a/src/core/Internals/Registries/StorageRegistry.cs b/src/core/Internals/Registries/StorageRegistry.cs new file mode 100644 index 0000000..4e6fd8a --- /dev/null +++ b/src/core/Internals/Registries/StorageRegistry.cs @@ -0,0 +1,24 @@ +using System; +using Stashbox; + +namespace Homer.Core.Internals.Registries +{ + /// + /// Storage registry. + /// + public class StorageRegistry : IRegistry + { + // ioc container. + private readonly StashboxContainer _container; + + public StorageRegistry(StashboxContainer container) + { + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + /// + public void Attach() + { + } + } +} diff --git a/src/core/Internals/Services/Configuration/ConfigurationService.cs b/src/core/Internals/Services/Configuration/ConfigurationService.cs new file mode 100644 index 0000000..af283f8 --- /dev/null +++ b/src/core/Internals/Services/Configuration/ConfigurationService.cs @@ -0,0 +1,123 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using Homer.Core.Internals.Services.Configuration.Models; +using Homer.Core.Internals.Services.Runtime; +using Homer.Core.Utils.IO; +using Microsoft.Extensions.Configuration; +using NetEscapades.Configuration.Yaml; +using Serilog; + +namespace Homer.Core.Internals.Services.Configuration +{ + /// + /// Configuration service that loads config files and serves the data. + /// + public class ConfigurationService : IConfigurationService + { + /// + public IConfigurationModel Configuration { get; private set; } + + private IConfigurationRoot _builder; + + private readonly IRuntimeInfoService _runtimeInfoService; + + public ConfigurationService(IRuntimeInfoService runtimeInfoService) + { + _runtimeInfoService = runtimeInfoService ?? throw new ArgumentNullException(nameof(runtimeInfoService)); + Configuration = new ConfigurationModel(); + } + + /// + public bool Load(string[] args) + { + try + { + var basePath = Path.Combine(FileHelper.AssemblyRoot, "config"); // base path for logs. + + _builder = new ConfigurationBuilder() + .SetBasePath(basePath) // set the base path. + .LoadCoreYamlConfiguration(_runtimeInfoService) // load core yaml configuration. + //.LoadPluginYamlConfiguration(_runtimeInfoService) // load services yaml configuration. + .AddEnvironmentVariables() // add environment variables. + .AddCommandLine(args) // add command line arguments. + .Build(); // build the configuration root. + + _builder.Bind(Configuration); // bind the configuration. + + return true; + } + catch (InvalidOperationException e) + { + Console.WriteLine($"can not parse configuration: {e.Message} - {(e.InnerException != null ? e.InnerException.Message : "")}"); // we can't use the logging service yet. + return false; + } + catch (FileNotFoundException e) + { + Console.WriteLine($"cannot load configuration file: {e.FileName}"); // we can't use the logging service yet. + return false; + } + } + + /// + public void LogSummary() + { + var logger = Log.ForContext(); // get the master logger reference. + var files = _builder.Providers.OfType().Select(yamlProvider => yamlProvider.Source.Path).ToList(); + logger.Information("loaded yaml configs: {Files:l}", files); + } + } + + public static class ConfigurationBuilderExtensions + { + /// + /// Loads yaml core yaml configuration. + /// + /// + /// + /// + public static IConfigurationBuilder LoadCoreYamlConfiguration(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService) + { + if (runtimeInfoService == null) throw new ArgumentNullException(nameof(runtimeInfoService)); + return builder.LoadYamlFiles(runtimeInfoService); + } + + public static IConfigurationBuilder LoadPluginYamlConfiguration(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService) + { + if (runtimeInfoService == null) throw new ArgumentNullException(nameof(runtimeInfoService)); + + // get services config path; + var servicePath = $"{Assembly.GetEntryAssembly()?.GetName().Name}/"; + servicePath = servicePath?.Substring(servicePath.IndexOf('.', StringComparison.CurrentCulture) + 1); + servicePath = servicePath?.Replace('.', '/'); + + return servicePath == "testhost/" + ? builder // skip loading per-service configuration files while testing core project. + : builder.LoadYamlFiles(runtimeInfoService, servicePath); // load per-service configuration. + } + + private static IConfigurationBuilder LoadYamlFiles(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService, string root = "") + { + builder.AddYamlFile($"{root}default.yaml", false); // add default.yaml + + // handle test.yaml, development.yaml, production.yaml. + switch (runtimeInfoService.BuildType) + { + case BuildType.Test: + builder.AddYamlFile($"{root}test.yaml", false); // if we are running within unit tests. + break; + case BuildType.Development: + builder.AddYamlFile($"{root}development.yaml", false); // on debug builds, add development.yaml too. + break; + case BuildType.Production: + builder.AddYamlFile($"{root}production.yaml", false); // on release builds, instead use production.yaml. + break; + } + + builder.AddYamlFile($"{root}local.yaml", true); // if local.yaml exists add it to builder too. + + return builder; + } + } +} diff --git a/src/core/Internals/Services/Configuration/IConfigurationService.cs b/src/core/Internals/Services/Configuration/IConfigurationService.cs new file mode 100644 index 0000000..73c8989 --- /dev/null +++ b/src/core/Internals/Services/Configuration/IConfigurationService.cs @@ -0,0 +1,26 @@ +using Homer.Core.Internals.Services.Configuration.Models; + +namespace Homer.Core.Internals.Services.Configuration +{ + /// + /// Interface for configuration service that loads config files and serves the data. + /// + public interface IConfigurationService : IService + { + /// + /// The configuration data. + /// + IConfigurationModel Configuration { get; } + + /// + /// Loads configuration; + /// + /// + bool Load(string[] args); + + /// + /// Logs the configuration summary. + /// + void LogSummary(); + } +} diff --git a/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs b/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs new file mode 100644 index 0000000..530331b --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs @@ -0,0 +1,13 @@ +using Homer.Core.Internals.Services.Configuration.Models.Logs; + +namespace Homer.Core.Internals.Services.Configuration.Models +{ + /// + /// Base engine config data model. + /// + public class ConfigurationModel : IConfigurationModel + { + /// + public LogsModel Logs { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs b/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs new file mode 100644 index 0000000..95dec22 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs @@ -0,0 +1,15 @@ +using Homer.Core.Internals.Services.Configuration.Models.Logs; + +namespace Homer.Core.Internals.Services.Configuration.Models +{ + /// + /// Interface for config data. + /// + public interface IConfigurationModel + { + /// + /// Logs configuration. + /// + LogsModel Logs { get; set; } + } +} diff --git a/src/core/Internals/Services/IService.cs b/src/core/Internals/Services/IService.cs new file mode 100644 index 0000000..f9d612b --- /dev/null +++ b/src/core/Internals/Services/IService.cs @@ -0,0 +1,9 @@ +namespace Homer.Core.Internals.Services +{ + /// + /// Interface for services. + /// + public interface IService + { + } +} diff --git a/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs b/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs new file mode 100644 index 0000000..2e00c3f --- /dev/null +++ b/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs @@ -0,0 +1,39 @@ +namespace Homer.Core.Internals.Services.Runtime +{ + /// + /// Runtime info service. + /// + public interface IRuntimeInfoService : IService + { + /// + /// Returns build type. + /// + BuildType BuildType { get; } + + /// + /// The dotnet core version we are running on. + /// + string DotnetCoreRuntimeVersion { get; } + + /// + /// Are we running within a unit-test session? + /// + /// + bool IsRunningUnitTests { get; } + + /// + /// Returns operating system. + /// + OperatingSystem OperatingSystem { get; } + + /// + /// Returns the name of the operating system. + /// + string OperatingSystemName { get; } + + /// + /// prints information about runtime. + /// + void PrintBanner(); + } +} diff --git a/src/core/Internals/Services/Runtime/RuntimeInfoService.cs b/src/core/Internals/Services/Runtime/RuntimeInfoService.cs new file mode 100644 index 0000000..c09ee3c --- /dev/null +++ b/src/core/Internals/Services/Runtime/RuntimeInfoService.cs @@ -0,0 +1,122 @@ +using System; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using Microsoft.Extensions.PlatformAbstractions; +using Serilog; + +namespace Homer.Core.Internals.Services.Runtime +{ + /// + /// Runtime info service + /// + public class RuntimeInfoService : IRuntimeInfoService + { + /// + public BuildType BuildType + { + get + { + if (IsRunningUnitTests) return BuildType.Test; // check for +#if DEBUG + return BuildType.Development; +#else + return BuildType.Production; +#endif + } + } + + /// + public string DotnetCoreRuntimeVersion + { + get + { + var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly; + var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); + var netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App"); + + if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2) + return assemblyPath[netCoreAppIndex + 1]; + + return null; + } + } + + /// + public bool IsRunningUnitTests => AppDomain.CurrentDomain.GetAssemblies().Any(x => x.FullName.StartsWith("xunit.", true, Culture.Default)); + + /// + public OperatingSystem OperatingSystem + { + get + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return OperatingSystem.Windows; + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return OperatingSystem.Linux; + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) return OperatingSystem.MacOS; + else return OperatingSystem.Unknown; + } + } + + /// + public string OperatingSystemName + { + get + { + switch (OperatingSystem) + { + case OperatingSystem.Windows: + return "win"; + case OperatingSystem.Linux: + return "linux"; + case OperatingSystem.MacOS: + return "macos"; + case OperatingSystem.Unknown: + default: + return "unknown"; + } + } + } + + /// + public void PrintBanner() + { + var project = Assembly.GetEntryAssembly()?.GetName().Name; // get the calling cli project's name. + var logger = Log.ForContext(); + + var version = GitVersionInformation.FullSemVer; + var platform = RuntimeInformation.ProcessArchitecture.ToString().ToLower(Culture.Default); + var architecture = RuntimeInformation.ProcessArchitecture.ToString().ToLower(Culture.Default); + var osDescription = RuntimeInformation.OSDescription.Trim(); + + logger.Information("------------------------------------------------------"); + logger.Information("homer, Copyright (c) 2020, Hüseyin Uslu"); + logger.Information("------------------------------------------------------"); + logger.Information("{Project:l} warming-up: {Version:l} [{ProcessArchitecture:l}]", project, version, platform); + logger.Information("running on {Os:l} [{Description:l}]", $"{OperatingSystemName}-{architecture}", osDescription); + logger.Information("dotnet core {CoreVersion:l}, runtime: {Runtime:l}", PlatformServices.Default.Application.RuntimeFramework.Version, DotnetCoreRuntimeVersion); + logger.Information("running over {ProcessorCount} core system", Environment.ProcessorCount); + logger.Information("------------------------------------------------------"); + } + } + + /// + /// Build types enum. + /// + public enum BuildType + { + Development, + Production, + Test + } + + /// + /// operating systems enum. + /// + public enum OperatingSystem + { + Unknown = 0, + Windows = 1, + Linux = 2, + MacOS = 3 + } +} diff --git a/src/core/Utils/IO/FileHelper.cs b/src/core/Utils/IO/FileHelper.cs new file mode 100644 index 0000000..e2db6c6 --- /dev/null +++ b/src/core/Utils/IO/FileHelper.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; + +namespace Homer.Core.Utils.IO +{ + /// + /// File helpers. + /// + public static class FileHelper + { + /// + /// The current assemblies root. + /// + public static string AssemblyRoot => AppDomain.CurrentDomain.BaseDirectory; + + /// + /// Loads a file. + /// + /// + /// + public static string LoadFile(string file) + { + // Get the absolute path to the JSON file + var path = Path.IsPathRooted(file) + ? file + : Path.GetRelativePath(Directory.GetCurrentDirectory(), file); + + if (!File.Exists(path)) throw new ArgumentException($"Could not find file at path: {path}"); + + var data = File.ReadAllText(path); // Load the file + return data; + } + } +} diff --git a/src/core/config/.gitignore b/src/core/config/.gitignore new file mode 100644 index 0000000..bd5d334 --- /dev/null +++ b/src/core/config/.gitignore @@ -0,0 +1 @@ +local.yaml diff --git a/src/core/config/default.yaml b/src/core/config/default.yaml new file mode 100644 index 0000000..4dc6e04 --- /dev/null +++ b/src/core/config/default.yaml @@ -0,0 +1,19 @@ +############################ +# Logging config. +############################ +logs: + master: + console: # console logging. + enabled: true # enable console log? + level: verbose # minimum log level. + file: # file logging. + enabled: true # enable loggin to file? + level: verbose # minimum log level. + jobs: + console: # console logging. + enabled: true # enable console log? + level: verbose # minimum log level. + file: # file logging. + enabled: true # enable loggin to file? + level: verbose # minimum log level. + diff --git a/src/core/config/development.yaml b/src/core/config/development.yaml new file mode 100644 index 0000000..30259b2 --- /dev/null +++ b/src/core/config/development.yaml @@ -0,0 +1 @@ + diff --git a/src/core/config/production.yaml b/src/core/config/production.yaml new file mode 100644 index 0000000..fb119ab --- /dev/null +++ b/src/core/config/production.yaml @@ -0,0 +1,15 @@ +logs: + master: + console: + enabled: true + level: info + file: + enabled: true + level: debug + jobs: + console: + enabled: false + level: info + file: + enabled: true + level: debug diff --git a/src/core/config/test.yaml b/src/core/config/test.yaml new file mode 100644 index 0000000..19a76f1 --- /dev/null +++ b/src/core/config/test.yaml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 81621f0..d9fef02 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -2,6 +2,7 @@ netcoreapp3.1 + AnyCPU;x64;x86 diff --git a/src/server/Homer.Server.csproj b/src/server/Homer.Server.csproj index cb96454..0647e4f 100644 --- a/src/server/Homer.Server.csproj +++ b/src/server/Homer.Server.csproj @@ -3,6 +3,8 @@ Exe netcoreapp3.1 + AnyCPU;x64;x86 + Homer diff --git a/src/server/Program.cs b/src/server/Program.cs index 66d31ab..e4adab2 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -21,30 +21,33 @@ // Licensor: Hüseyin Uslu #endregion -using System; +using System.Collections.Generic; using System.Threading.Tasks; -using DaanV2.UUID; -using Homer.Platform.HomeKit.Characteristics.Definitions; -using Homer.Platform.HomeKit.Services; +using Homer.Core.Host; +using Homer.Core.Internals.Bootstrap; +using Homer.Core.Internals.Registries; +using Homer.Core.Internals.Services.Configuration; +using Stashbox; namespace Homer.Server { - public class Program + public static class Program { public static async Task Main(string[] args) { - try - { - var uuid = UUIDFactory.CreateUUID(4, 2); - var service = new Service(uuid, "test") - .SetCharacteristic(typeof(ManufacturerCharacteristic), "Default - Manufacturer") - .SetCharacteristic(typeof(ModelCharacteristic), "Default-Model") - .SetCharacteristic(typeof(SerialNumberCharacteristic), "Default-SerialNumber"); - } - catch (Exception e) + var bootstrapper = new Bootstrapper(); // IoC kernel bootstrapper. + var serviceHost = new ServerHost(bootstrapper); // service host. + + // setup registries + var registries = new List { + }; + + // initialize service host. + await serviceHost.InitializeAsync(registries, args, true); - } + // initialize jobs. + var configurationService = bootstrapper.Container.Resolve(); // resolve configuration service. } } } From dc6c6c401da7dda5bf8db8994f7ab91205ab65a6 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 13:00:32 +0300 Subject: [PATCH 045/152] fixed missing files. --- .gitignore | 2 +- .../Models/Logs/ConsoleLogModel.cs | 25 +++++++++++++++++++ .../Configuration/Models/Logs/FileLogModel.cs | 25 +++++++++++++++++++ .../Configuration/Models/Logs/JobsLogModel.cs | 25 +++++++++++++++++++ .../Configuration/Models/Logs/LogsModel.cs | 25 +++++++++++++++++++ .../Models/Logs/MasterLogModel.cs | 25 +++++++++++++++++++ 6 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs diff --git a/.gitignore b/.gitignore index dfcfd56..695b506 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,7 @@ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ -[Ll]ogs/ +[Ll]og/ # Visual Studio 2015/2017 cache/options directory .vs/ diff --git a/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs new file mode 100644 index 0000000..c64a2b8 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs @@ -0,0 +1,25 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Logs +{ + public class ConsoleLogModel + { + /// + /// Is enabled? + /// + public bool Enabled { get; set; } + + /// + /// Log level. + /// + public string Level { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs new file mode 100644 index 0000000..67198b6 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs @@ -0,0 +1,25 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Logs +{ + public class FileLogModel + { + /// + /// Is enabled? + /// + public bool Enabled { get; set; } + + /// + /// Log level. + /// + public string Level { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs new file mode 100644 index 0000000..1b0c800 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs @@ -0,0 +1,25 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Logs +{ + public class JobsLogModel + { + /// + /// Console log. + /// + public ConsoleLogModel Console { get; set; } + + /// + /// File log. + /// + public FileLogModel File { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs new file mode 100644 index 0000000..2cf1e73 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs @@ -0,0 +1,25 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Logs +{ + public class LogsModel + { + /// + /// Master log. + /// + public MasterLogModel Master { get; set; } + + /// + /// Scheduler log. + /// + public JobsLogModel Jobs { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs new file mode 100644 index 0000000..bceef5e --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs @@ -0,0 +1,25 @@ +#region license +// +// hypeengine +// +// Copyright (c) 2016 - 2019, Int6ware +// +// This file is part of hypeengine project. Unauthorized copying of this file, via any medium is strictly prohibited. +// The hypeengine or its components/sources can not be copied and/or distributed without the express permission of Int6ware. +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Logs +{ + public class MasterLogModel + { + /// + /// Console log. + /// + public ConsoleLogModel Console { get; set; } + + /// + /// File log. + /// + public FileLogModel File { get; set; } + } +} From 96d191f1d92c297458e19379c925b8cc8b562982 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 13:26:55 +0300 Subject: [PATCH 046/152] started working on bonjour server. --- src/core/Host/IServerHost.cs | 3 +-- src/core/Host/ServerHost.cs | 2 +- src/server/Homer.Server.csproj | 1 + src/server/Internals/ServerRegistry.cs | 25 ++++++++++++++++++++++ src/server/Program.cs | 12 +++++++---- src/server/Servers/BonjourServer.cs | 29 ++++++++++++++++++++++++++ src/server/Servers/IBonjourServer.cs | 8 +++++++ src/server/Servers/IServer.cs | 19 +++++++++++++++++ 8 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 src/server/Internals/ServerRegistry.cs create mode 100644 src/server/Servers/BonjourServer.cs create mode 100644 src/server/Servers/IBonjourServer.cs create mode 100644 src/server/Servers/IServer.cs diff --git a/src/core/Host/IServerHost.cs b/src/core/Host/IServerHost.cs index c314b52..732509e 100644 --- a/src/core/Host/IServerHost.cs +++ b/src/core/Host/IServerHost.cs @@ -11,7 +11,6 @@ public interface IServerHost ///
/// /// - /// does host need networking support? - Task InitializeAsync(IReadOnlyList registries, string[] args, bool needsNetworkingSupport = false); + Task InitializeAsync(IReadOnlyList registries, string[] args); } } diff --git a/src/core/Host/ServerHost.cs b/src/core/Host/ServerHost.cs index 316efcf..dce6f6f 100644 --- a/src/core/Host/ServerHost.cs +++ b/src/core/Host/ServerHost.cs @@ -29,7 +29,7 @@ public ServerHost(Bootstrapper bootstrapper) } /// - public async Task InitializeAsync(IReadOnlyList registries, string[] args, bool needsNetworkingSupport = false) + public async Task InitializeAsync(IReadOnlyList registries, string[] args) { // init unhandled exception handler. AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; // Catch any unhandled exceptions if we are in release mode. diff --git a/src/server/Homer.Server.csproj b/src/server/Homer.Server.csproj index 0647e4f..728ea6a 100644 --- a/src/server/Homer.Server.csproj +++ b/src/server/Homer.Server.csproj @@ -8,6 +8,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/server/Internals/ServerRegistry.cs b/src/server/Internals/ServerRegistry.cs new file mode 100644 index 0000000..627c8d4 --- /dev/null +++ b/src/server/Internals/ServerRegistry.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Homer.Core.Internals.Registries; +using Homer.Server.Servers; +using Stashbox; + +namespace Homer.Server.Internals +{ + public class ServerRegistry : IRegistry + { + // ioc container. + private readonly StashboxContainer _container; + + public ServerRegistry(StashboxContainer container) + { + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + public void Attach() + { + _container.RegisterSingleton(); + } + } +} diff --git a/src/server/Program.cs b/src/server/Program.cs index e4adab2..7c07b00 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -27,6 +27,8 @@ using Homer.Core.Internals.Bootstrap; using Homer.Core.Internals.Registries; using Homer.Core.Internals.Services.Configuration; +using Homer.Server.Internals; +using Homer.Server.Servers; using Stashbox; namespace Homer.Server @@ -36,18 +38,20 @@ public static class Program public static async Task Main(string[] args) { var bootstrapper = new Bootstrapper(); // IoC kernel bootstrapper. - var serviceHost = new ServerHost(bootstrapper); // service host. + var host = new ServerHost(bootstrapper); // server host. // setup registries var registries = new List { + new Internals.ServerRegistry(bootstrapper.Container) }; // initialize service host. - await serviceHost.InitializeAsync(registries, args, true); + await host.InitializeAsync(registries, args); - // initialize jobs. - var configurationService = bootstrapper.Container.Resolve(); // resolve configuration service. + // initialize bonjour server. + var bonjourServer = bootstrapper.Container.Resolve(); // resolve bonjour service. + await bonjourServer.RunAsync(); } } } diff --git a/src/server/Servers/BonjourServer.cs b/src/server/Servers/BonjourServer.cs new file mode 100644 index 0000000..b701f8d --- /dev/null +++ b/src/server/Servers/BonjourServer.cs @@ -0,0 +1,29 @@ +using System; +using System.Threading.Tasks; +using Serilog; +using Serilog.Core; + +namespace Homer.Server.Servers +{ + public class BonjourServer: IBonjourServer + { + public ILogger Logger { get; } + + public BonjourServer() + { + Logger = Log.ForContext(); + } + + public async Task RunAsync() + { + try + { + Logger.Information("starting bonjour server.."); + } + catch (Exception e) + { + Logger.Error("task failed.."); + } + } + } +} diff --git a/src/server/Servers/IBonjourServer.cs b/src/server/Servers/IBonjourServer.cs new file mode 100644 index 0000000..6dc7f68 --- /dev/null +++ b/src/server/Servers/IBonjourServer.cs @@ -0,0 +1,8 @@ +using Serilog; + +namespace Homer.Server.Servers +{ + public interface IBonjourServer: IServer + { + } +} diff --git a/src/server/Servers/IServer.cs b/src/server/Servers/IServer.cs new file mode 100644 index 0000000..8b3b70c --- /dev/null +++ b/src/server/Servers/IServer.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Serilog; + +namespace Homer.Server.Servers +{ + public interface IServer + { + /// + /// Master logger instance. + /// + ILogger Logger { get;} + + /// + /// Runs the job. + /// + /// + Task RunAsync(); + } +} From a01016681616232c4cca5fdd7e13082e1e56d1e8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 13:29:04 +0300 Subject: [PATCH 047/152] fixed namespaces. --- contrib/uuid.net/Classes/UUID/UUID - Get.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Initialize.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Nill.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Operator.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Overrides.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Properties.cs | 3 ++- contrib/uuid.net/Classes/UUID/UUID - Variables.cs | 3 ++- .../Generator Base/Generator Base - IUUIDGenerator.cs | 5 ++++- .../Classes/Generator Info/Generator Info - Initialize.cs | 4 +++- .../Classes/Generator Info/Generator Info - Properties.cs | 5 ++++- .../Classes/Generator Info/Generator Info - Variables.cs | 5 ++++- .../Static Classes/Converter/Converter - Initialize.cs | 3 ++- .../Static Classes/Converter/Converter - Load.cs | 3 ++- .../Static Classes/Converter/Converter - To Byte Array.cs | 3 ++- .../Static Classes/Converter/Converter - To Char Array.cs | 3 ++- .../Static Classes/Converter/Converter - Variables.cs | 3 ++- .../Generator Variant 1 - GeneratorBase.cs | 7 ++++++- .../Generator Variant 1 - Initialize.cs | 3 ++- .../Generator Variant 1 - Properties.cs | 3 ++- .../Generator Variant 1/Generator Variant 1 - Variable.cs | 3 ++- .../Random Generator Base - GeneratorBase.cs | 6 +++++- .../Random Generator Base - Initialize.cs | 3 ++- .../Random Generator Base - Properties.cs | 4 +++- .../Random Generator Base - Variables.cs | 4 +++- .../Generator Variant 1 - Initialize.cs | 4 +++- .../Generator Variant 1 - RandomGeneratorBase.cs | 6 +++++- .../Generator Variant 2 - Initialize.cs | 5 ++++- .../Generator Variant 2 - RandomGeneratorBase.cs | 6 +++++- .../Generator Variant 1 - GeneratorBase.cs | 7 ++++++- .../Generator Variant 1 - Initialize.cs | 3 ++- .../Generator Variant 1 - Properties.cs | 3 ++- .../Generator Variant 1/Generator Variant 1 - Variables.cs | 3 ++- .../uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs | 4 +++- .../Static Classes/UUID Factory/UUID Factory - Context.cs | 5 +++-- .../UUID Factory/UUID Factory - Create Generator.cs | 4 +++- .../UUID Factory/UUID Factory - Create UUID.cs | 5 ++++- .../Static Classes/UUID Factory/UUID Factory - Get.cs | 5 +++-- .../UUID Factory/UUID Factory - Initialize.cs | 4 ++-- .../Static Classes/UUID Factory/UUID Factory - Load.cs | 6 ++++-- .../UUID Factory/UUID Factory - Variables.cs | 5 +++-- .../UUID Validator/UUID Validator - Initialize.cs | 2 +- .../UUID Validator/UUID Validator - Validate.cs | 4 +++- src/platforms/homekit/Accessories/Accessory.cs | 3 ++- src/platforms/homekit/Bridges/Bridge.cs | 3 ++- src/platforms/homekit/Characteristics/Characteristic.cs | 3 ++- src/platforms/homekit/Characteristics/ICharacteristic.cs | 2 +- src/platforms/homekit/Entity/IEntity.cs | 2 +- src/platforms/homekit/Services/Service.cs | 3 ++- 48 files changed, 132 insertions(+), 53 deletions(-) diff --git a/contrib/uuid.net/Classes/UUID/UUID - Get.cs b/contrib/uuid.net/Classes/UUID/UUID - Get.cs index 4f2e39f..5eda991 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Get.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Get.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID { /// Returns the version of this UUID /// The version number that is stored within the UUID diff --git a/contrib/uuid.net/Classes/UUID/UUID - Initialize.cs b/contrib/uuid.net/Classes/UUID/UUID - Initialize.cs index a1a95b9..f2ba3bf 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Initialize.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Initialize.cs @@ -13,10 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Runtime.Serialization; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { /// The class that holds the information of a string [Serializable, DataContract] public partial class UUID { diff --git a/contrib/uuid.net/Classes/UUID/UUID - Nill.cs b/contrib/uuid.net/Classes/UUID/UUID - Nill.cs index ff0dc41..e0dd618 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Nill.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Nill.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID { /// Returns a 'nill' or empty UUID public static readonly UUID Nill = new UUID(new Char[] { diff --git a/contrib/uuid.net/Classes/UUID/UUID - Operator.cs b/contrib/uuid.net/Classes/UUID/UUID - Operator.cs index 7f68c64..1e9e9a6 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Operator.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Operator.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID { /// Compare two if they are equal to each other diff --git a/contrib/uuid.net/Classes/UUID/UUID - Overrides.cs b/contrib/uuid.net/Classes/UUID/UUID - Overrides.cs index 706287d..3a77b36 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Overrides.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Overrides.cs @@ -13,10 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Collections.Generic; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID : IEquatable { /// Returns the representation of the UUID diff --git a/contrib/uuid.net/Classes/UUID/UUID - Properties.cs b/contrib/uuid.net/Classes/UUID/UUID - Properties.cs index 0198caa..e20e22e 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Properties.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Properties.cs @@ -13,10 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Runtime.Serialization; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID { /// Gets or sets the chars of this [DataMember] diff --git a/contrib/uuid.net/Classes/UUID/UUID - Variables.cs b/contrib/uuid.net/Classes/UUID/UUID - Variables.cs index 1f52903..3663ad6 100644 --- a/contrib/uuid.net/Classes/UUID/UUID - Variables.cs +++ b/contrib/uuid.net/Classes/UUID/UUID - Variables.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID { +namespace uuid.net.Classes.UUID { public partial class UUID { /// Gets or sets the chars of this private protected Char[] _Chars; diff --git a/contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs b/contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs index a6fd870..9602ebb 100644 --- a/contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs +++ b/contrib/uuid.net/Generators/Abstract Classes/Generator Base/Generator Base - IUUIDGenerator.cs @@ -13,9 +13,12 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Abstract_Classes.Generator_Base { public abstract partial class GeneratorBase : IUUIDGenerator { /// Gets the version of the generator public abstract Int32 Version { get; } diff --git a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs index 6e96a2d..5d24edb 100644 --- a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs +++ b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Initialize.cs @@ -14,7 +14,9 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -namespace DaanV2.UUID.Generators { +using uuid.net.Interfaces.IUUID_Generator; + +namespace uuid.net.Generators.Classes.Generator_Info { /// The class that holds the information of a generator public partial class GeneratorInfo { /// Creates a new instance of diff --git a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs index 3fdaac1..60fd848 100644 --- a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs +++ b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Properties.cs @@ -13,9 +13,12 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Classes.Generator_Info { public partial class GeneratorInfo { /// Gets or sets the version of the UUID generator diff --git a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs index 3910c08..c20d742 100644 --- a/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs +++ b/contrib/uuid.net/Generators/Classes/Generator Info/Generator Info - Variables.cs @@ -13,9 +13,12 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Classes.Generator_Info { public partial class GeneratorInfo { /// The version of the UUID generator private Int32 _Version; diff --git a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs index 7bb171f..2ba665b 100644 --- a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs +++ b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Initialize.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Static_Classes.Converter { /// The class responsible for converting data public static partial class Converter { /// Creates a new instance of diff --git a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs index f53a37a..f30f885 100644 --- a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs +++ b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Load.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Threading; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Static_Classes.Converter { public static partial class Converter { /// Loads and construct this if it is needed public static void Load() { diff --git a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs index 9a315c9..5cb418f 100644 --- a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs +++ b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Byte Array.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Static_Classes.Converter { public static partial class Converter { /// Converts a to a using hexadecimal /// The array to convert to , array needs to be 35 items diff --git a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs index a788513..b424482 100644 --- a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs +++ b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - To Char Array.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Static_Classes.Converter { public static partial class Converter { /// Converts a to using hexidecimal. Size needs to be atleast 16 /// The that need to be converted to . The size needs to be atleast 16 items diff --git a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs index 633d0dc..9c503a5 100644 --- a/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs +++ b/contrib/uuid.net/Generators/Static Classes/Converter/Converter - Variables.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID.Generators { +namespace uuid.net.Generators.Static_Classes.Converter { public static partial class Converter { /// An that can be used to convert to using hexidecimal private static Char[] _ToChars; diff --git a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs index 78999e3..1c921f9 100644 --- a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs +++ b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs @@ -13,10 +13,15 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Text; +using uuid.net.Classes.UUID; +using uuid.net.Generators.Abstract_Classes.Generator_Base; +using uuid.net.Generators.Static_Classes.Converter; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators.Version3 { +namespace uuid.net.Generators.Version3.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 : GeneratorBase { /// Gets the version of this public override Int32 Version => 3; diff --git a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs index a567922..b2e5839 100644 --- a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs +++ b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version3 { +namespace uuid.net.Generators.Version3.Classes.Generator_Variant_1 { /// The UUID Generator Version 3, Variant 1 public partial class GeneratorVariant1 { /// Creates a new instance of diff --git a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs index 632a4cd..f9f0f84 100644 --- a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs +++ b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version3 { +namespace uuid.net.Generators.Version3.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 { /// The hasher used to generate the UUID public MD5 Hasher { get => this._Hasher; set => this._Hasher = value; } diff --git a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs index 25efa06..7e68c70 100644 --- a/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs +++ b/contrib/uuid.net/Generators/Version3/Classes/Generator Variant 1/Generator Variant 1 - Variable.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version3 { +namespace uuid.net.Generators.Version3.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 { /// The hasher used to generate UUID private MD5 _Hasher; diff --git a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs index 14c77e0..a307378 100644 --- a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs +++ b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - GeneratorBase.cs @@ -13,9 +13,13 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Generators.Abstract_Classes.Generator_Base; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base { public abstract partial class RandomGeneratorBase : GeneratorBase { /// Gets the version of the generator public abstract override Int32 Version { get; } diff --git a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs index a39c5a2..4073582 100644 --- a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs +++ b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Initialize.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base { /// An abstract class that has a built in random generator public abstract partial class RandomGeneratorBase { /// Creates a new instance of diff --git a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs index ae1f534..7fdc01d 100644 --- a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs +++ b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Properties.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base { public abstract partial class RandomGeneratorBase { /// Gets or sets the random number generator used for generating public Random NumberGenerator { get => this._NumberGenerator; set => this._NumberGenerator = value; } diff --git a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs index a9d20f7..3c21c8c 100644 --- a/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs +++ b/contrib/uuid.net/Generators/Version4/Abstract Classes/Random Generator Base/Random Generator Base - Variables.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base { public abstract partial class RandomGeneratorBase { /// The number generator used for generating the private protected Random _NumberGenerator; diff --git a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs index cff54fd..dfa4b00 100644 --- a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs +++ b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Generators.Abstract_Classes.Generator_Base; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Classes.Generator_Variant_1 { /// The UUID generator version 4, variant 1 public partial class GeneratorVariant1 { diff --git a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs index cc1639f..7fc600c 100644 --- a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs +++ b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 1/Generator Variant 1 - RandomGeneratorBase.cs @@ -13,9 +13,13 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Generators.Static_Classes.Converter; +using uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 : RandomGeneratorBase { /// Gets the version of the UUID generator public override Int32 Version => 4; diff --git a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs index a5fb593..7f85c81 100644 --- a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs +++ b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - Initialize.cs @@ -13,9 +13,12 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Generators.Abstract_Classes.Generator_Base; +using uuid.net.Generators.Version4.Classes.Generator_Variant_1; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Classes.Generator_Variant_2 { /// The UUID generator Version 4, Variant 2 public partial class GeneratorVariant2 { diff --git a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs index 5f5ab4f..7c608e6 100644 --- a/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs +++ b/contrib/uuid.net/Generators/Version4/Classes/Generator Variant 2/Generator Variant 2 - RandomGeneratorBase.cs @@ -13,9 +13,13 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Generators.Static_Classes.Converter; +using uuid.net.Generators.Version4.Abstract_Classes.Random_Generator_Base; -namespace DaanV2.UUID.Generators.Version4 { +namespace uuid.net.Generators.Version4.Classes.Generator_Variant_2 { public partial class GeneratorVariant2 : RandomGeneratorBase { /// Gets the version of the UUID generator public override Int32 Version => 4; diff --git a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs index fa9dde9..e533201 100644 --- a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs +++ b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - GeneratorBase.cs @@ -13,10 +13,15 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Text; +using uuid.net.Classes.UUID; +using uuid.net.Generators.Abstract_Classes.Generator_Base; +using uuid.net.Generators.Static_Classes.Converter; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID.Generators.Version5 { +namespace uuid.net.Generators.Version5.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 : GeneratorBase { /// Gets the version of the UUID generator public override Int32 Version => 5; diff --git a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs index 271436f..e9455b6 100644 --- a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs +++ b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Initialize.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version5 { +namespace uuid.net.Generators.Version5.Classes.Generator_Variant_1 { /// The UUID Generator Version 5, Variant 1 public partial class GeneratorVariant1 { /// Creates a new instance of diff --git a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs index 4bba064..2a46442 100644 --- a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs +++ b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Properties.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version5 { +namespace uuid.net.Generators.Version5.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 { /// Gets or sets the hasher used to generate UUID public SHA1 Hasher { get => this._Hasher; set => this._Hasher = value; } diff --git a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs index 0bf1677..425354f 100644 --- a/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs +++ b/contrib/uuid.net/Generators/Version5/Classes/Generator Variant 1/Generator Variant 1 - Variables.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System.Security.Cryptography; -namespace DaanV2.UUID.Generators.Version5 { +namespace uuid.net.Generators.Version5.Classes.Generator_Variant_1 { public partial class GeneratorVariant1 { /// The hasher used to generate UUID private SHA1 _Hasher; diff --git a/contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs b/contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs index 36e0f79..5169219 100644 --- a/contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs +++ b/contrib/uuid.net/Interfaces/IUUID Generator/IUUID Generator.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; -namespace DaanV2.UUID { +namespace uuid.net.Interfaces.IUUID_Generator { /// The interface responsible for determing how a generator should behave public interface IUUIDGenerator { diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs index aaa05e9..0e32c34 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Context.cs @@ -13,10 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -using DaanV2.UUID.Generators; +using uuid.net.Generators.Classes.Generator_Info; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// Returns the type needed for the generator needs diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs index d4e906c..f2d99cd 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create Generator.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// Creates the specified generator or returns null /// The version of the generator to create diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs index c89cb11..099ff54 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Create UUID.cs @@ -13,9 +13,12 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// Generate a using the specified version and variant /// The version of the generator diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs index 7a5b193..cbc32a2 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Get.cs @@ -13,10 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; -using DaanV2.UUID.Generators; +using uuid.net.Generators.Classes.Generator_Info; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// Returns an array of available version of generators /// An array of contaning version numbering diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs index 2236f35..451898b 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Initialize.cs @@ -14,9 +14,9 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -using DaanV2.UUID.Generators; +using uuid.net.Generators.Classes.Generator_Info; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { /// the static class that handles the generations of UUIDs or generators through version numbering public static partial class UUIDFactory { /// Creates a new instance of diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs index 348dc05..56e0d2f 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Load.cs @@ -13,11 +13,13 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; using System.Reflection; -using DaanV2.UUID.Generators; +using uuid.net.Generators.Classes.Generator_Info; +using uuid.net.Interfaces.IUUID_Generator; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// Loads all s public static void Load() { diff --git a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs index fd8f6ba..7cc7e3f 100644 --- a/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs +++ b/contrib/uuid.net/Static Classes/UUID Factory/UUID Factory - Variables.cs @@ -13,9 +13,10 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -using DaanV2.UUID.Generators; -namespace DaanV2.UUID { +using uuid.net.Generators.Classes.Generator_Info; + +namespace uuid.net.Static_Classes.UUID_Factory { public static partial class UUIDFactory { /// The Generators private static GeneratorInfo[][] _Generators; diff --git a/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs index 846dc6f..6d0e949 100644 --- a/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs +++ b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Initialize.cs @@ -14,7 +14,7 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Validator { /// The static class that is responisble for validating UUIDs public static partial class UUIDValidator { /// Creates a new instance of diff --git a/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs index 8125cfd..d3d1e3b 100644 --- a/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs +++ b/contrib/uuid.net/Static Classes/UUID Validator/UUID Validator - Validate.cs @@ -13,9 +13,11 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ + using System; +using uuid.net.Classes.UUID; -namespace DaanV2.UUID { +namespace uuid.net.Static_Classes.UUID_Validator { public static partial class UUIDValidator { /// Validates the , Checks if it is properly formatted, right version and variant /// The to check diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index 3b4bb4b..f99287c 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -24,9 +24,10 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using DaanV2.UUID; using Homer.Platform.HomeKit.Bridges; using Homer.Platform.HomeKit.Services; +using uuid.net.Classes.UUID; +using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Accessories { diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index 7092337..cf4b222 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -24,9 +24,10 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using DaanV2.UUID; using Homer.Platform.HomeKit.Accessories; using Homer.Platform.HomeKit.Services; +using uuid.net.Classes.UUID; +using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Bridges { diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 30d5e9a..74da6e8 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -23,8 +23,9 @@ using System; using System.Collections.Generic; -using DaanV2.UUID; using Homer.Platform.HomeKit.Events; +using uuid.net.Classes.UUID; +using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Characteristics { diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 350d3a9..52df252 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -22,7 +22,7 @@ #endregion using System; -using DaanV2.UUID; +using uuid.net.Classes.UUID; namespace Homer.Platform.HomeKit.Characteristics { diff --git a/src/platforms/homekit/Entity/IEntity.cs b/src/platforms/homekit/Entity/IEntity.cs index 6aca525..d7ae3a8 100644 --- a/src/platforms/homekit/Entity/IEntity.cs +++ b/src/platforms/homekit/Entity/IEntity.cs @@ -21,7 +21,7 @@ // Licensor: Hüseyin Uslu #endregion -using DaanV2.UUID; +using uuid.net.Classes.UUID; namespace Homer.Platform.HomeKit.Entity { diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index ef2a122..1e92ee9 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -25,10 +25,11 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using DaanV2.UUID; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Events; +using uuid.net.Classes.UUID; +using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Services { From 414fa7cab7e6b6773a71bc95195e5ad5875b34ff Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 14:06:29 +0300 Subject: [PATCH 048/152] trying bonjour support. --- src/server/Internals/ServerRegistry.cs | 2 - src/server/Program.cs | 7 ++- src/server/Servers/BonjourServer.cs | 73 +++++++++++++++++++++++++- src/server/Servers/IBonjourServer.cs | 4 +- 4 files changed, 78 insertions(+), 8 deletions(-) diff --git a/src/server/Internals/ServerRegistry.cs b/src/server/Internals/ServerRegistry.cs index 627c8d4..7d9a3e7 100644 --- a/src/server/Internals/ServerRegistry.cs +++ b/src/server/Internals/ServerRegistry.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; using Homer.Core.Internals.Registries; using Homer.Server.Servers; using Stashbox; diff --git a/src/server/Program.cs b/src/server/Program.cs index 7c07b00..8be4404 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -21,13 +21,13 @@ // Licensor: Hüseyin Uslu #endregion +using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using Homer.Core.Host; using Homer.Core.Internals.Bootstrap; using Homer.Core.Internals.Registries; -using Homer.Core.Internals.Services.Configuration; -using Homer.Server.Internals; using Homer.Server.Servers; using Stashbox; @@ -52,6 +52,9 @@ public static async Task Main(string[] args) // initialize bonjour server. var bonjourServer = bootstrapper.Container.Resolve(); // resolve bonjour service. await bonjourServer.RunAsync(); + + Console.ReadLine(); // read a line. + await Task.Run(() => Thread.Sleep(Timeout.Infinite)); // let the program continue to run within docker. } } } diff --git a/src/server/Servers/BonjourServer.cs b/src/server/Servers/BonjourServer.cs index b701f8d..5451e0d 100644 --- a/src/server/Servers/BonjourServer.cs +++ b/src/server/Servers/BonjourServer.cs @@ -1,7 +1,7 @@ using System; using System.Threading.Tasks; +using ArkaneSystems.Arkane.Zeroconf; using Serilog; -using Serilog.Core; namespace Homer.Server.Servers { @@ -9,9 +9,40 @@ public class BonjourServer: IBonjourServer { public ILogger Logger { get; } + private RegisterService _service; + + private TxtRecord _txtRecord; + public BonjourServer() { Logger = Log.ForContext(); + + _service = new RegisterService + { + Name = "homer", + RegType = "_hap._tcp", + ReplyDomain = "local.", + Port = 3689 + }; + + // for details + // https://github.com/KhaosT/HAP-NodeJS/blob/75913a6e5fb8ef99d36a21057da7f1452955e7fb/src/lib/Advertiser.ts#L38 + _txtRecord = new TxtRecord + { + {"md", "homer"}, // display name. + {"c#", "1"}, // "accessory conf" - represents the "configuration version" of an Accessory. Increasing this "version number" signals iOS devices to re-fetch /accessories data. + {"ff", "0"}, + {"id", "22:32:43:54:54:01"}, // username?? + {"pv", "1.0"}, // protocolVersion, + {"s#", "1"}, // "accessory state" + {"sf", "1"}, // "sf == 1" means "discoverable by HomeKit iOS clients" + {"ci", "2"} // category + // "sh": this._setupHash + }; + + _service.TxtRecord = _txtRecord; + + _service.Response += _service_Response; } public async Task RunAsync() @@ -19,11 +50,51 @@ public async Task RunAsync() try { Logger.Information("starting bonjour server.."); + _service.Register(); + Browse(); } catch (Exception e) { Logger.Error("task failed.."); } } + + private void Browse() + { + var browser = new ServiceBrowser(); + + browser.ServiceAdded += delegate (object o, ServiceBrowseEventArgs aargs) + { + Logger.Information("Found Service: {0}", aargs.Service.Name); + + aargs.Service.Resolved += delegate (object oo, ServiceResolvedEventArgs argss) + { + IResolvableService s = (IResolvableService)argss.Service; + Console.WriteLine("Resolved Service: {0} - {1}:{2} ({3} TXT record entries)", + s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count); + }; + + aargs.Service.Resolve(); + }; + + browser.Browse("_hap._tcp", "local"); + } + + private void _service_Response(object o, RegisterServiceEventArgs args) + { + switch (args.ServiceError) + { + case ServiceErrorCode.NameConflict: + Logger.Error("*** Name Collision! '{0}' is already registered", + args.Service.Name); + break; + case ServiceErrorCode.None: + Logger.Information("*** Registered name = '{0}'", args.Service.Name); + break; + case ServiceErrorCode.Unknown: + Logger.Error("*** Error registering name = '{0}'", args.Service.Name); + break; + } + } } } diff --git a/src/server/Servers/IBonjourServer.cs b/src/server/Servers/IBonjourServer.cs index 6dc7f68..031c44f 100644 --- a/src/server/Servers/IBonjourServer.cs +++ b/src/server/Servers/IBonjourServer.cs @@ -1,6 +1,4 @@ -using Serilog; - -namespace Homer.Server.Servers +namespace Homer.Server.Servers { public interface IBonjourServer: IServer { From 90a4e2181dd9c8abf444063887bb267c907f6347 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 14:08:30 +0300 Subject: [PATCH 049/152] tiny fix. --- src/server/Internals/ServerRegistry.cs | 2 +- src/server/Program.cs | 6 +++--- .../Servers/{BonjourServer.cs => BonjourTestServer.cs} | 8 ++++---- .../Servers/{IBonjourServer.cs => IBonjourTestServer.cs} | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename src/server/Servers/{BonjourServer.cs => BonjourTestServer.cs} (94%) rename src/server/Servers/{IBonjourServer.cs => IBonjourTestServer.cs} (50%) diff --git a/src/server/Internals/ServerRegistry.cs b/src/server/Internals/ServerRegistry.cs index 7d9a3e7..b7bbe42 100644 --- a/src/server/Internals/ServerRegistry.cs +++ b/src/server/Internals/ServerRegistry.cs @@ -17,7 +17,7 @@ public ServerRegistry(StashboxContainer container) public void Attach() { - _container.RegisterSingleton(); + _container.RegisterSingleton(); } } } diff --git a/src/server/Program.cs b/src/server/Program.cs index 8be4404..a55545d 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -49,9 +49,9 @@ public static async Task Main(string[] args) // initialize service host. await host.InitializeAsync(registries, args); - // initialize bonjour server. - var bonjourServer = bootstrapper.Container.Resolve(); // resolve bonjour service. - await bonjourServer.RunAsync(); + //// initialize bonjour server. + //var bonjourServer = bootstrapper.Container.Resolve(); // resolve bonjour service. + //await bonjourServer.RunAsync(); Console.ReadLine(); // read a line. await Task.Run(() => Thread.Sleep(Timeout.Infinite)); // let the program continue to run within docker. diff --git a/src/server/Servers/BonjourServer.cs b/src/server/Servers/BonjourTestServer.cs similarity index 94% rename from src/server/Servers/BonjourServer.cs rename to src/server/Servers/BonjourTestServer.cs index 5451e0d..01429ba 100644 --- a/src/server/Servers/BonjourServer.cs +++ b/src/server/Servers/BonjourTestServer.cs @@ -5,7 +5,7 @@ namespace Homer.Server.Servers { - public class BonjourServer: IBonjourServer + public class BonjourTestServer: IBonjourTestServer { public ILogger Logger { get; } @@ -13,9 +13,9 @@ public class BonjourServer: IBonjourServer private TxtRecord _txtRecord; - public BonjourServer() + public BonjourTestServer() { - Logger = Log.ForContext(); + Logger = Log.ForContext(); _service = new RegisterService { @@ -51,7 +51,7 @@ public async Task RunAsync() { Logger.Information("starting bonjour server.."); _service.Register(); - Browse(); + //Browse(); } catch (Exception e) { diff --git a/src/server/Servers/IBonjourServer.cs b/src/server/Servers/IBonjourTestServer.cs similarity index 50% rename from src/server/Servers/IBonjourServer.cs rename to src/server/Servers/IBonjourTestServer.cs index 031c44f..f44997d 100644 --- a/src/server/Servers/IBonjourServer.cs +++ b/src/server/Servers/IBonjourTestServer.cs @@ -1,6 +1,6 @@ namespace Homer.Server.Servers { - public interface IBonjourServer: IServer + public interface IBonjourTestServer: IServer { } } From dbf56d404144fb28bce8bb25328054c22ead6eb8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 14:11:43 +0300 Subject: [PATCH 050/152] another fix. --- src/server/Internals/ServerRegistry.cs | 3 +- src/server/Program.cs | 6 -- src/server/Servers/BonjourTestServer.cs | 100 ----------------------- src/server/Servers/IBonjourTestServer.cs | 6 -- src/server/Servers/IServer.cs | 19 ----- 5 files changed, 1 insertion(+), 133 deletions(-) delete mode 100644 src/server/Servers/BonjourTestServer.cs delete mode 100644 src/server/Servers/IBonjourTestServer.cs delete mode 100644 src/server/Servers/IServer.cs diff --git a/src/server/Internals/ServerRegistry.cs b/src/server/Internals/ServerRegistry.cs index b7bbe42..014f68d 100644 --- a/src/server/Internals/ServerRegistry.cs +++ b/src/server/Internals/ServerRegistry.cs @@ -1,6 +1,5 @@ using System; using Homer.Core.Internals.Registries; -using Homer.Server.Servers; using Stashbox; namespace Homer.Server.Internals @@ -17,7 +16,7 @@ public ServerRegistry(StashboxContainer container) public void Attach() { - _container.RegisterSingleton(); + } } } diff --git a/src/server/Program.cs b/src/server/Program.cs index a55545d..64c1478 100644 --- a/src/server/Program.cs +++ b/src/server/Program.cs @@ -28,8 +28,6 @@ using Homer.Core.Host; using Homer.Core.Internals.Bootstrap; using Homer.Core.Internals.Registries; -using Homer.Server.Servers; -using Stashbox; namespace Homer.Server { @@ -49,10 +47,6 @@ public static async Task Main(string[] args) // initialize service host. await host.InitializeAsync(registries, args); - //// initialize bonjour server. - //var bonjourServer = bootstrapper.Container.Resolve(); // resolve bonjour service. - //await bonjourServer.RunAsync(); - Console.ReadLine(); // read a line. await Task.Run(() => Thread.Sleep(Timeout.Infinite)); // let the program continue to run within docker. } diff --git a/src/server/Servers/BonjourTestServer.cs b/src/server/Servers/BonjourTestServer.cs deleted file mode 100644 index 01429ba..0000000 --- a/src/server/Servers/BonjourTestServer.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Threading.Tasks; -using ArkaneSystems.Arkane.Zeroconf; -using Serilog; - -namespace Homer.Server.Servers -{ - public class BonjourTestServer: IBonjourTestServer - { - public ILogger Logger { get; } - - private RegisterService _service; - - private TxtRecord _txtRecord; - - public BonjourTestServer() - { - Logger = Log.ForContext(); - - _service = new RegisterService - { - Name = "homer", - RegType = "_hap._tcp", - ReplyDomain = "local.", - Port = 3689 - }; - - // for details - // https://github.com/KhaosT/HAP-NodeJS/blob/75913a6e5fb8ef99d36a21057da7f1452955e7fb/src/lib/Advertiser.ts#L38 - _txtRecord = new TxtRecord - { - {"md", "homer"}, // display name. - {"c#", "1"}, // "accessory conf" - represents the "configuration version" of an Accessory. Increasing this "version number" signals iOS devices to re-fetch /accessories data. - {"ff", "0"}, - {"id", "22:32:43:54:54:01"}, // username?? - {"pv", "1.0"}, // protocolVersion, - {"s#", "1"}, // "accessory state" - {"sf", "1"}, // "sf == 1" means "discoverable by HomeKit iOS clients" - {"ci", "2"} // category - // "sh": this._setupHash - }; - - _service.TxtRecord = _txtRecord; - - _service.Response += _service_Response; - } - - public async Task RunAsync() - { - try - { - Logger.Information("starting bonjour server.."); - _service.Register(); - //Browse(); - } - catch (Exception e) - { - Logger.Error("task failed.."); - } - } - - private void Browse() - { - var browser = new ServiceBrowser(); - - browser.ServiceAdded += delegate (object o, ServiceBrowseEventArgs aargs) - { - Logger.Information("Found Service: {0}", aargs.Service.Name); - - aargs.Service.Resolved += delegate (object oo, ServiceResolvedEventArgs argss) - { - IResolvableService s = (IResolvableService)argss.Service; - Console.WriteLine("Resolved Service: {0} - {1}:{2} ({3} TXT record entries)", - s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count); - }; - - aargs.Service.Resolve(); - }; - - browser.Browse("_hap._tcp", "local"); - } - - private void _service_Response(object o, RegisterServiceEventArgs args) - { - switch (args.ServiceError) - { - case ServiceErrorCode.NameConflict: - Logger.Error("*** Name Collision! '{0}' is already registered", - args.Service.Name); - break; - case ServiceErrorCode.None: - Logger.Information("*** Registered name = '{0}'", args.Service.Name); - break; - case ServiceErrorCode.Unknown: - Logger.Error("*** Error registering name = '{0}'", args.Service.Name); - break; - } - } - } -} diff --git a/src/server/Servers/IBonjourTestServer.cs b/src/server/Servers/IBonjourTestServer.cs deleted file mode 100644 index f44997d..0000000 --- a/src/server/Servers/IBonjourTestServer.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Homer.Server.Servers -{ - public interface IBonjourTestServer: IServer - { - } -} diff --git a/src/server/Servers/IServer.cs b/src/server/Servers/IServer.cs deleted file mode 100644 index 8b3b70c..0000000 --- a/src/server/Servers/IServer.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Threading.Tasks; -using Serilog; - -namespace Homer.Server.Servers -{ - public interface IServer - { - /// - /// Master logger instance. - /// - ILogger Logger { get;} - - /// - /// Runs the job. - /// - /// - Task RunAsync(); - } -} From 4ff4b5391f2b89e9a491b45d4277bff082f3fb09 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 14:20:58 +0300 Subject: [PATCH 051/152] renamed project homer.server as homer. --- build/Build.cs | 2 +- homer.sln | 26 +++++++++---------- .../Homer.csproj} | 0 .../Internals/ServerRegistry.cs | 5 ++-- src/{server => homer}/Program.cs | 9 ++++++- src/homer/Servers/IServer.cs | 19 ++++++++++++++ src/homer/Servers/Server.cs | 16 ++++++++++++ 7 files changed, 60 insertions(+), 17 deletions(-) rename src/{server/Homer.Server.csproj => homer/Homer.csproj} (100%) rename src/{server => homer}/Internals/ServerRegistry.cs (80%) rename src/{server => homer}/Program.cs (90%) create mode 100644 src/homer/Servers/IServer.cs create mode 100644 src/homer/Servers/Server.cs diff --git a/build/Build.cs b/build/Build.cs index 2063dbe..e30e6d3 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -72,7 +72,7 @@ public void OnExecute(CommandLineApplication app) "contrib/uuid.net/uuid.net.csproj", "src/platforms/homekit/Homer.Platform.HomeKit.csproj", "src/core/Homer.Core.csproj", - "src/server/Homer.Server.csproj" + "src/homer/Homer.csproj" }; var testProjects = new string[] diff --git a/homer.sln b/homer.sln index 0243de1..12c152e 100644 --- a/homer.sln +++ b/homer.sln @@ -15,7 +15,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.ne EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Core", "src\core\Homer.Core.csproj", "{DE52E76D-1044-4EFC-974A-30389D2AE72D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Server", "src\server\Homer.Server.csproj", "{40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer", "src\homer\Homer.csproj", "{D362FFFD-D370-41BF-AA7B-596D0540A8C1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -75,18 +75,18 @@ Global {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x64.Build.0 = Release|x64 {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x86.ActiveCfg = Release|x86 {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Release|x86.Build.0 = Release|x86 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x64.ActiveCfg = Debug|x64 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x64.Build.0 = Debug|x64 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x86.ActiveCfg = Debug|x86 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Debug|x86.Build.0 = Debug|x86 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|Any CPU.ActiveCfg = Release|Any CPU - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|Any CPU.Build.0 = Release|Any CPU - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x64.ActiveCfg = Release|x64 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x64.Build.0 = Release|x64 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x86.ActiveCfg = Release|x86 - {40BEFB32-6E28-4732-AFFA-F5A7F0B84E22}.Release|x86.Build.0 = Release|x86 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|x64.ActiveCfg = Debug|x64 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|x64.Build.0 = Debug|x64 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|x86.ActiveCfg = Debug|x86 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Debug|x86.Build.0 = Debug|x86 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|Any CPU.Build.0 = Release|Any CPU + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x64.ActiveCfg = Release|x64 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x64.Build.0 = Release|x64 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x86.ActiveCfg = Release|x86 + {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/server/Homer.Server.csproj b/src/homer/Homer.csproj similarity index 100% rename from src/server/Homer.Server.csproj rename to src/homer/Homer.csproj diff --git a/src/server/Internals/ServerRegistry.cs b/src/homer/Internals/ServerRegistry.cs similarity index 80% rename from src/server/Internals/ServerRegistry.cs rename to src/homer/Internals/ServerRegistry.cs index 014f68d..b0a0259 100644 --- a/src/server/Internals/ServerRegistry.cs +++ b/src/homer/Internals/ServerRegistry.cs @@ -1,8 +1,9 @@ using System; using Homer.Core.Internals.Registries; +using Homer.Servers; using Stashbox; -namespace Homer.Server.Internals +namespace Homer.Internals { public class ServerRegistry : IRegistry { @@ -16,7 +17,7 @@ public ServerRegistry(StashboxContainer container) public void Attach() { - + _container.RegisterSingleton(); } } } diff --git a/src/server/Program.cs b/src/homer/Program.cs similarity index 90% rename from src/server/Program.cs rename to src/homer/Program.cs index 64c1478..126f5f8 100644 --- a/src/server/Program.cs +++ b/src/homer/Program.cs @@ -28,8 +28,11 @@ using Homer.Core.Host; using Homer.Core.Internals.Bootstrap; using Homer.Core.Internals.Registries; +using Homer.Core.Internals.Services.Runtime; +using Homer.Servers; +using Stashbox; -namespace Homer.Server +namespace Homer { public static class Program { @@ -47,6 +50,10 @@ public static async Task Main(string[] args) // initialize service host. await host.InitializeAsync(registries, args); + // resolver server. + var server = bootstrapper.Container.Resolve(); + await server.RunAsync(); + Console.ReadLine(); // read a line. await Task.Run(() => Thread.Sleep(Timeout.Infinite)); // let the program continue to run within docker. } diff --git a/src/homer/Servers/IServer.cs b/src/homer/Servers/IServer.cs new file mode 100644 index 0000000..e29f188 --- /dev/null +++ b/src/homer/Servers/IServer.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Serilog; + +namespace Homer.Servers +{ + public interface IServer + { + /// + /// Master logger instance. + /// + ILogger Logger { get; } + + /// + /// Runs the job. + /// + /// + Task RunAsync(); + } +} diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs new file mode 100644 index 0000000..95ab5ad --- /dev/null +++ b/src/homer/Servers/Server.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading.Tasks; +using Serilog; + +namespace Homer.Servers +{ + public class Server : IServer + { + public ILogger Logger { get; set; } + + public async Task RunAsync() + { + throw new NotImplementedException(); + } + } +} From b555e88e9784dec517f2bca93b28d1b8c44e39b4 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 14:38:03 +0300 Subject: [PATCH 052/152] more work. --- src/homer/Servers/Server.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 95ab5ad..ce60882 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -1,6 +1,9 @@ using System; using System.Threading.Tasks; +using Homer.Platform.HomeKit.Bridges; using Serilog; +using uuid.net.Generators.Abstract_Classes.Generator_Base; +using uuid.net.Static_Classes.UUID_Factory; namespace Homer.Servers { @@ -10,7 +13,17 @@ public class Server : IServer public async Task RunAsync() { - throw new NotImplementedException(); + try + { + var generator = UUIDFactory.CreateGenerator(5, 1); + var uuid = generator.Generate("homer"); + + var bridge = new Bridge(uuid, "homer"); + } + catch (Exception e) + { + Logger.Error("server initialization failed..."); + } } } } From 8bf2ee78432eca21afe00590837cb3b56039679d Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 7 Feb 2020 17:05:29 +0300 Subject: [PATCH 053/152] bridgesetupmanager work. --- src/homer/Internals/ServerRegistry.cs | 25 +++++- src/homer/Program.cs | 1 - src/homer/Servers/IServer.cs | 25 +++++- src/homer/Servers/Server.cs | 30 ++++++- .../homekit/Accessories/Accessory.cs | 71 ++++++---------- .../homekit/Accessories/AccessoryBase.cs | 83 +++++++++++++++++++ .../homekit/Accessories/IAccessory.cs | 2 +- .../homekit/Accessories/IAccessoryBase.cs | 9 +- src/platforms/homekit/Bridges/Bridge.cs | 43 +--------- src/platforms/homekit/Bridges/IBridge.cs | 2 +- .../Bridges/Setup/BridgeSetupManager.cs | 62 ++++++++++++++ .../ControlPointCharacteristic.cs | 44 ++++++++++ .../Characteristics/StateCharacteristic.cs | 43 ++++++++++ .../Characteristics/VersionCharacteristic.cs | 43 ++++++++++ .../Bridges/Setup/Setup/SetupService.cs | 35 ++++++++ .../homekit/Characteristics/Characteristic.cs | 4 +- .../FirmwareRevisonCharacteristic.cs | 41 +++++++++ .../AccessoryInformationService.cs | 33 ++++++++ 18 files changed, 499 insertions(+), 97 deletions(-) create mode 100644 src/platforms/homekit/Accessories/AccessoryBase.cs create mode 100644 src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs create mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs create mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs create mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs create mode 100644 src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs create mode 100644 src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs diff --git a/src/homer/Internals/ServerRegistry.cs b/src/homer/Internals/ServerRegistry.cs index b0a0259..f690bed 100644 --- a/src/homer/Internals/ServerRegistry.cs +++ b/src/homer/Internals/ServerRegistry.cs @@ -1,4 +1,27 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using Homer.Core.Internals.Registries; using Homer.Servers; using Stashbox; diff --git a/src/homer/Program.cs b/src/homer/Program.cs index 126f5f8..3c2ea74 100644 --- a/src/homer/Program.cs +++ b/src/homer/Program.cs @@ -28,7 +28,6 @@ using Homer.Core.Host; using Homer.Core.Internals.Bootstrap; using Homer.Core.Internals.Registries; -using Homer.Core.Internals.Services.Runtime; using Homer.Servers; using Stashbox; diff --git a/src/homer/Servers/IServer.cs b/src/homer/Servers/IServer.cs index e29f188..b6147f0 100644 --- a/src/homer/Servers/IServer.cs +++ b/src/homer/Servers/IServer.cs @@ -1,4 +1,27 @@ -using System.Threading.Tasks; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Threading.Tasks; using Serilog; namespace Homer.Servers diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index ce60882..c342c88 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -1,8 +1,30 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; using System.Threading.Tasks; -using Homer.Platform.HomeKit.Bridges; +using Homer.Platform.HomeKit.Bridges.Setup; using Serilog; -using uuid.net.Generators.Abstract_Classes.Generator_Base; using uuid.net.Static_Classes.UUID_Factory; namespace Homer.Servers @@ -18,7 +40,7 @@ public async Task RunAsync() var generator = UUIDFactory.CreateGenerator(5, 1); var uuid = generator.Generate("homer"); - var bridge = new Bridge(uuid, "homer"); + var bridge = new BridgeSetupManager(uuid, "homer"); } catch (Exception e) { diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index f99287c..118e64b 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -21,60 +21,41 @@ // Licensor: Hüseyin Uslu #endregion -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using Homer.Platform.HomeKit.Bridges; -using Homer.Platform.HomeKit.Services; -using uuid.net.Classes.UUID; -using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Accessories { - public class Accessory : IAccessory + public class Accessory : AccessoryBase, IAccessory { - /// - public UUID Uuid { get; } - - /// - public string DisplayName { get; } - - /// - public bool IsBridged { get; } - - /// - public bool IsReacheable { get; } - - /// - public AccessoryCategory Category { get; } - - /// - public IReadOnlyList Services { get; } - /// public IBridge ParentBridge { get; } - /// - /// internal list of services. - /// - private List _services; - - public Accessory(string uuid, string displayName) + protected Accessory(string uuid, string displayName, bool isBridged = false, bool isReachable = true, AccessoryCategory category = AccessoryCategory.Other) + : base(uuid, displayName, isBridged, isReachable, category) { - Uuid = uuid ?? throw new ArgumentException("Accessories must be created with a valid UUID.", nameof(uuid)); - if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); - - if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; - else throw new ArgumentException("Accessories must be created with a non-empty displayName.", nameof(displayName)); - - IsBridged = false; - IsReacheable = true; - Category = AccessoryCategory.Other; - - _services = new List(); - Services = new ReadOnlyCollection(_services); - - // create our initial "Accessory Information" Service that all Accessories are expected to have. } } } diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs new file mode 100644 index 0000000..b3c8bf5 --- /dev/null +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -0,0 +1,83 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Services; +using Homer.Platform.HomeKit.Services.Definitions; +using uuid.net.Classes.UUID; +using uuid.net.Static_Classes.UUID_Validator; + +namespace Homer.Platform.HomeKit.Accessories +{ + public class AccessoryBase : IAccessoryBase + { + public UUID Uuid { get; } + + public string DisplayName { get; } + + public bool IsBridged { get; } + + public bool IsReachable { get; } + + public AccessoryCategory Category { get; } + + public IReadOnlyList Services { get; } + + /// + /// internal list of services. + /// + private List _services; + + protected AccessoryBase(string uuid, string displayName, bool isBridged, bool isReachable, AccessoryCategory category) + { + Uuid = uuid ?? throw new ArgumentException("Must be created with a valid UUID.", nameof(uuid)); + if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); + + if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; + else throw new ArgumentException("Must be created with a non-empty displayName.", nameof(displayName)); + + IsBridged = isBridged; + IsReachable = isReachable; + Category = category; + + _services = new List(); + Services = new ReadOnlyCollection(_services); + + // create our initial "Accessory Information" Service that all Accessories are expected to have. + AddService(new AccessoryInformationService()) + .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") + .SetCharacteristic(typeof(ModelCharacteristic), "Homer") + .SetCharacteristic(typeof(SerialNumberCharacteristic), "CC:22:3D:E3:CE:30") + .SetCharacteristic(typeof(FirmwareRevisonCharacteristic), "0.1"); + } + + public IService AddService(IService service) + { + _services.Add(service); + return service; // allow chaining. + } + } +} diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/src/platforms/homekit/Accessories/IAccessory.cs index 76285f4..aadf839 100644 --- a/src/platforms/homekit/Accessories/IAccessory.cs +++ b/src/platforms/homekit/Accessories/IAccessory.cs @@ -28,7 +28,7 @@ namespace Homer.Platform.HomeKit.Accessories /// /// Accessory interface. /// - public interface IAccessory : IAccessoryBase + public interface IAccessory { /// /// if accessory is bridged, this property points to the bridge which bridges this accessory diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 8dc6349..3430689 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -40,7 +40,7 @@ public interface IAccessoryBase : IEntity /// /// Is accessory reachable? /// - bool IsReacheable { get; } + bool IsReachable { get; } /// /// Accessory category. @@ -51,5 +51,12 @@ public interface IAccessoryBase : IEntity /// Services exposed by accessory. /// IReadOnlyList Services { get; } + + /// + /// Adds service. + /// + /// + /// + IService AddService(IService service); } } diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index cf4b222..3db691b 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -21,67 +21,30 @@ // Licensor: Hüseyin Uslu #endregion -using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Services; -using uuid.net.Classes.UUID; -using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Bridges { - public class Bridge : IBridge + public class Bridge : AccessoryBase, IBridge { const int MaxAccessories = 149; // Maximum number of bridged accessories per bridge. - /// - public UUID Uuid { get; } - - /// - public string DisplayName { get; } - - /// - public bool IsBridged { get; } - - /// - public bool IsReacheable { get; } - - /// - public AccessoryCategory Category { get; } - /// public IReadOnlyList Accessories { get; } - /// - public IReadOnlyList Services { get; } - /// /// internal list of accessories. /// private List _accessories; - /// - /// internal list of services. - /// - private List _services; - - public Bridge(string uuid, string displayName) + protected Bridge(string uuid, string displayName, bool isReachable = true) + : base(uuid, displayName, isReachable, true, AccessoryCategory.Bridge) { - Uuid = uuid ?? throw new ArgumentException("Bridges must be created with a valid UUID.", nameof(uuid)); - if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); - - if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; - else throw new ArgumentException("Bridges must be created with a non-empty displayName.", nameof(displayName)); - - IsBridged = false; // a bridge can not be bridged again. - Category = AccessoryCategory.Bridge; // set category. - _accessories = new List(); - _services = new List(); Accessories = new ReadOnlyCollection(_accessories); - Services = new ReadOnlyCollection(_services); } } } diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index b3119ef..9b13fc3 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -29,7 +29,7 @@ namespace Homer.Platform.HomeKit.Bridges /// /// Bridge interface. /// - public interface IBridge : IAccessoryBase + public interface IBridge { /// /// List of accessories we are bridging. diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs new file mode 100644 index 0000000..0aad419 --- /dev/null +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -0,0 +1,62 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System; +using Homer.Platform.HomeKit.Bridges.Setup.Characteristics; +using Homer.Platform.HomeKit.Bridges.Setup.Setup; + +namespace Homer.Platform.HomeKit.Bridges.Setup +{ + public class BridgeSetupManager : Bridge + { + public BridgeSetupManager(string uuid, string displayName) + : base(uuid, displayName) + { + // create setup service. + var setupService = new SetupService(); + + // create handler characteristic. + var controlPointCharacteristic = new ControlPointCharacteristic(); + controlPointCharacteristic.Get += HandleReadRequest; + controlPointCharacteristic.Set += HandleWriteRequest; + + // add characteristics. + setupService.AddCharacteristic(new StateCharacteristic()) + .AddCharacteristic(new VersionCharacteristic()) + .AddCharacteristic(controlPointCharacteristic); + + AddService(setupService); + } + + + private void HandleReadRequest(object sender, EventArgs e) + { + throw new NotImplementedException(); + } + + private void HandleWriteRequest(object sender, EventArgs e) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs new file mode 100644 index 0000000..0d6804d --- /dev/null +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; +using Homer.Platform.HomeKit.Characteristics; + +namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics +{ + public class ControlPointCharacteristic: Characteristic + { + public ControlPointCharacteristic() : base( + "5819A4C2-E1B0-4C9D-B761-3EB1AFF43073", + "Control Point", + CharacteristicFormat.Data, + new List() + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.WriteResponse, + CharacteristicPermission.Events + }) + { + } + } +} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs new file mode 100644 index 0000000..b824e80 --- /dev/null +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; +using Homer.Platform.HomeKit.Characteristics; + +namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics +{ + public class StateCharacteristic: Characteristic + { + public StateCharacteristic() : base( + "77474A2F-FA98-485E-97BE-4762458774D8", + "State", + CharacteristicFormat.Uint8, + new List() + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events + }, minValue: 0, maxValue: 1, minStep: 1, value: 0) + { + } + } +} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs new file mode 100644 index 0000000..b26af63 --- /dev/null +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; +using Homer.Platform.HomeKit.Characteristics; + +namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics +{ + public class VersionCharacteristic : Characteristic + { + public VersionCharacteristic() : base( + "FD9FE4CC-D06F-4FFE-96C6-595D464E1026", + "Version", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events + }, value: "1.0") + { + } + } +} diff --git a/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs b/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs new file mode 100644 index 0000000..992756e --- /dev/null +++ b/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs @@ -0,0 +1,35 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Services; + +namespace Homer.Platform.HomeKit.Bridges.Setup.Setup +{ + public class SetupService : Service + { + public SetupService() + : base("49FB9D4D-0FEA-4BF1-8FA6-E7B18AB86DCE", "Setup") + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 74da6e8..a7063e4 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -132,7 +132,7 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp protected Characteristic(string uuid, string displayName, CharacteristicFormat format, IReadOnlyList permissions, CharacteristicUnit unit = CharacteristicUnit.Unitless, bool eventNotificationsEnabled = false, string description = null, dynamic minValue = null, dynamic maxValue = null, dynamic minStep = null, int maxLength = 64, int maxDataLength = 2097152, - IList validValues = null, dynamic[] validValuesRange = null) + IList validValues = null, dynamic[] validValuesRange = null, dynamic value = null) { Uuid = uuid ?? throw new ArgumentException("Characteristics must be created with a valid UUID.", nameof(uuid)); if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); @@ -156,7 +156,7 @@ protected Characteristic(string uuid, string displayName, CharacteristicFormat f ValidValues = validValues; ValidValuesRange = validValuesRange; - Value = GetDefaultValue(); + Value = value ?? GetDefaultValue(); } public void Subscribe() diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs new file mode 100644 index 0000000..7a8902c --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class FirmwareRevisonCharacteristic: Characteristic + { + public FirmwareRevisonCharacteristic() : base( + "00000052-0000-1000-8000-0026BB765291", + "Firmware Revision", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs new file mode 100644 index 0000000..7cdfc3a --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -0,0 +1,33 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class AccessoryInformationService: Service + { + public AccessoryInformationService() + : base("0000003E-0000-1000-8000-0026BB765291", "Accessory Information") + { + } + } +} From 23e89710fda5d97db8694e11cb75756cfbffa67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Fri, 7 Feb 2020 17:14:55 +0300 Subject: [PATCH 054/152] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c2e1d04..877e900 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,9 @@ As current so called "home automation" systems are actually just "home informati still in early development stage. +- initially working on homekit support. +- will soon be able to pair with homekit. + ## voice control support? initially will have support for apple homekit, have plans for alexa & goole asistant support too. From b5ea46735f7016fa7dfc50bca54078fd28730201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Fri, 7 Feb 2020 17:21:38 +0300 Subject: [PATCH 055/152] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 877e900..f96fa04 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,10 @@ still in early development stage. initially will have support for apple homekit, have plans for alexa & goole asistant support too. +## runtimes + +homer can run on a wide range of platforms including x86, x64, ARM32 and ARM64 - including Raspberry Pi or variants. Check [dotnet core runtime](https://github.com/dotnet/runtime/blob/master/src/libraries/pkg/Microsoft.NETCore.Platforms/runtime.json) too see all available runtimes. + ## requirements ``` From 2f41fcfa21e7dcc8f7eeb7adf87936cf62bb963e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Fri, 7 Feb 2020 17:24:40 +0300 Subject: [PATCH 056/152] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f96fa04..862d30f 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,16 @@ still in early development stage. initially will have support for apple homekit, have plans for alexa & goole asistant support too. -## runtimes +## platforms homer can run on a wide range of platforms including x86, x64, ARM32 and ARM64 - including Raspberry Pi or variants. Check [dotnet core runtime](https://github.com/dotnet/runtime/blob/master/src/libraries/pkg/Microsoft.NETCore.Platforms/runtime.json) too see all available runtimes. +## operating systems + +- Windows +- macOS +- Linux (Redhat, Fedora, Debian, Ubuntu, Mint, openSUSE, SLES, Alphine, Rasbian..) + ## requirements ``` From 115585cdee6ec7c84c7a1325711316f67d89b9c6 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Sat, 8 Feb 2020 02:45:18 +0300 Subject: [PATCH 057/152] added hkas metadata. initial characteristics class metada generation done. --- contrib/importer/data/default.metadata.plist | Bin 0 -> 21836 bytes contrib/importer/data/version.plist | 18 +++ contrib/importer/import.js | 98 ++++++++++++++ contrib/importer/package-lock.json | 125 ++++++++++++++++++ contrib/importer/package.json | 25 ++++ .../homekit/Accessories/AccessoryBase.cs | 27 ++-- .../homekit/Accessories/IAccessoryBase.cs | 5 +- .../Bridges/Setup/BridgeSetupManager.cs | 20 ++- .../homekit/Characteristics/Characteristic.cs | 8 +- ...c.cs => FirmwareRevisionCharacteristic.cs} | 4 +- .../Definitions/IdentityCharacteristic.cs | 20 +++ .../Definitions/ManufacturerCharacteristic.cs | 5 +- .../Definitions/ProductData.cs | 10 ++ .../Definitions/VersionCharacteristic.cs | 20 +++ .../Characteristics/ICharacteristicProps.cs | 4 +- .../AccessoryInformationService.cs | 11 +- .../Definitions/ProtocolInformationService.cs | 14 ++ src/platforms/homekit/Services/Service.cs | 4 + 18 files changed, 392 insertions(+), 26 deletions(-) create mode 100644 contrib/importer/data/default.metadata.plist create mode 100644 contrib/importer/data/version.plist create mode 100644 contrib/importer/import.js create mode 100644 contrib/importer/package-lock.json create mode 100644 contrib/importer/package.json rename src/platforms/homekit/Characteristics/Definitions/{FirmwareRevisonCharacteristic.cs => FirmwareRevisionCharacteristic.cs} (93%) create mode 100644 src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ProductData.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs create mode 100644 src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs diff --git a/contrib/importer/data/default.metadata.plist b/contrib/importer/data/default.metadata.plist new file mode 100644 index 0000000000000000000000000000000000000000..fccad35aa3fd96b6ec964db6c6f5a01f9308a325 GIT binary patch literal 21836 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 Y_ssE`2a)j~A*SE#5z}wW&zXn*2m7D%SpWb4 literal 0 HcmV?d00001 diff --git a/contrib/importer/data/version.plist b/contrib/importer/data/version.plist new file mode 100644 index 0000000..539497f --- /dev/null +++ b/contrib/importer/data/version.plist @@ -0,0 +1,18 @@ + + + + + BuildAliasOf + HomeKitAccessorySimulator + BuildVersion + 1727 + CFBundleShortVersionString + 125 + CFBundleVersion + 125 + ProjectName + HomeKitAccessorySimulator + SourceVersion + 135003000000000 + + diff --git a/contrib/importer/import.js b/contrib/importer/import.js new file mode 100644 index 0000000..f15e21c --- /dev/null +++ b/contrib/importer/import.js @@ -0,0 +1,98 @@ +// based on: https://github.com/KhaosT/HAP-NodeJS/blob/master/src/lib/gen/importAsClasses.ts + +// originally from: https://github.com/KhaosT/HAP-NodeJS/blob/master/src/lib/gen/importAsClasses.ts + +const fs = require('fs'); +const path = require('path'); +const plist = require('simple-plist'); + +var plistPath = './data/default.metadata.plist'; +var metadata = plist.readFileSync(plistPath); + +var outputPath = path.join(__dirname, 'HomeKitTypes.txt'); +var output = fs.createWriteStream(outputPath); + +var characteristics = {}; + +for (var index in metadata.Characteristics) { + var characteristic = metadata.Characteristics[index]; + var classyName = characteristic.Name.replace(/[\s\-]/g, ""); // "Target Door State" -> "TargetDoorState" + classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5" + + characteristics[characteristic.UUID] = classyName; + + output.write(`using System.Collections.Generic;\n\n`); + output.write(`namespace Homer.Platform.HomeKit.Characteristics.Definitions\n{\n`); + output.write(` public class ${classyName}Characteristic : Characteristic\n {\n`); + + if (characteristic.Constraints && characteristic.Constraints.ValidValues) { + // this characteristic can only have one of a defined set of values (like an enum). Define the values as static members of our subclass. + output.write(` // possible values:\n`); + + for (var value in characteristic.Constraints.ValidValues) { + var name = characteristic.Constraints.ValidValues[value]; + + var constName = name.toUpperCase().replace(/[^\w]+/g, '_'); + if ((/^[1-9]/).test(constName)) constName = "_" + constName; // variables can't start with a number + + output.write(` public static int ${constName} = ${value};\n`); + } + output.write('\n'); + } + + output.write(` public ${classyName}Characteristic() : base(\n`); + output.write(` uuid: "${characteristic.UUID}",\n`); + output.write(` displayName: "${characteristic.Name}",\n`); + + output.write(` format: CharacteristicFormat.${capitalize(characteristic.Format)},\n`); + + output.write(` permissions: new List\n {\n`); + for (var i in characteristic.Properties) { + var perms = getCharacteristicPermsKey(characteristic.Properties[i]); + if (perms) { + output.write(` CharacteristicPermission.${getCharacteristicPermsKey(characteristic.Properties[i])},\n`); + } + } + output.write(` },\n`); + + if (characteristic.Unit) + output.write(` unit: CharacteristicUnit.${capitalize(characteristic.Unit)},\n`); + + // apply any basic constraints if present + if (characteristic.Constraints && typeof characteristic.Constraints.MaximumValue !== 'undefined') + output.write(` maxValue: ${characteristic.Constraints.MaximumValue},\n`); + + if (characteristic.Constraints && typeof characteristic.Constraints.MinimumValue !== 'undefined') + output.write(` minValue: ${characteristic.Constraints.MinimumValue},\n`); + + if (characteristic.Constraints && typeof characteristic.Constraints.StepValue !== 'undefined') + output.write(` minStep: ${characteristic.Constraints.StepValue},\n`); + + if (characteristic.Constraints && characteristic.Constraints.ValidValues) { + output.write(` validValues: new List\n {\n`); + for (var value in characteristic.Constraints.ValidValues) { + output.write(` ${value},\n`); + } + output.write(` }\n`); + } + + output.write(` )\n`); + output.write(` {\n }\n }\n}\n`); + + output.write(`\n\n`); +} + +function capitalize(s) { + if (typeof s !== 'string') return '' + return s.charAt(0).toUpperCase() + s.slice(1) +} + +function getCharacteristicPermsKey(perm) { + switch (perm) { + case "read": return "PairedRead"; + case "write": return "PairedWrite"; + case "cnotify": return "Events"; + case "uncnotify": return undefined; + default: throw new Error("Unknown characteristic permission '" + perm + "'"); + } +} \ No newline at end of file diff --git a/contrib/importer/package-lock.json b/contrib/importer/package-lock.json new file mode 100644 index 0000000..9fb2c71 --- /dev/null +++ b/contrib/importer/package-lock.json @@ -0,0 +1,125 @@ +{ + "name": "hkas_importer", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "requires": { + "big-integer": "^1.6.44" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "simple-plist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", + "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", + "requires": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + }, + "ts-node": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", + "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/contrib/importer/package.json b/contrib/importer/package.json new file mode 100644 index 0000000..958a099 --- /dev/null +++ b/contrib/importer/package.json @@ -0,0 +1,25 @@ +{ + "name": "hkas_importer", + "version": "0.1.0", + "description": "homekit accessory simulator data importer", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bonesoul/homer.git" + }, + "keywords": [ + "homekit" + ], + "author": "Hüseyin Uslu", + "license": "MIT", + "bugs": { + "url": "https://github.com/bonesoul/homer/issues" + }, + "homepage": "https://github.com/bonesoul/homer#readme", + "dependencies": { + "simple-plist": "^1.1.0" + } +} diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index b3c8bf5..d7ac4f1 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -44,12 +44,12 @@ public class AccessoryBase : IAccessoryBase public AccessoryCategory Category { get; } - public IReadOnlyList Services { get; } + public IReadOnlyDictionary Services { get; } /// /// internal list of services. /// - private List _services; + private Dictionary _services; protected AccessoryBase(string uuid, string displayName, bool isBridged, bool isReachable, AccessoryCategory category) { @@ -63,21 +63,28 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is IsReachable = isReachable; Category = category; - _services = new List(); - Services = new ReadOnlyCollection(_services); + _services = new Dictionary(); + Services = new ReadOnlyDictionary(_services); // create our initial "Accessory Information" Service that all Accessories are expected to have. AddService(new AccessoryInformationService()) - .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") - .SetCharacteristic(typeof(ModelCharacteristic), "Homer") - .SetCharacteristic(typeof(SerialNumberCharacteristic), "CC:22:3D:E3:CE:30") - .SetCharacteristic(typeof(FirmwareRevisonCharacteristic), "0.1"); + .SetCharacteristic(typeof(ManufacturerCharacteristic), "Default-Manufacturer") + .SetCharacteristic(typeof(ModelCharacteristic), "Default-Model") + .SetCharacteristic(typeof(SerialNumberCharacteristic), "Default-SerialNumber") + .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); } public IService AddService(IService service) { - _services.Add(service); - return service; // allow chaining. + if (service == null) throw new ArgumentNullException(nameof(service)); + + _services.Add(service.GetType(), service); + return service; + } + + public IService GetService(Type service) + { + return _services.ContainsKey(service) ? _services[service] : null; } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 3430689..3a1a40d 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -21,6 +21,7 @@ // Licensor: Hüseyin Uslu #endregion +using System; using System.Collections.Generic; using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; @@ -50,7 +51,7 @@ public interface IAccessoryBase : IEntity /// /// Services exposed by accessory. /// - IReadOnlyList Services { get; } + IReadOnlyDictionary Services { get; } /// /// Adds service. @@ -58,5 +59,7 @@ public interface IAccessoryBase : IEntity /// /// IService AddService(IService service); + + IService GetService(Type t); } } diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs index 0aad419..66e4875 100644 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -24,6 +24,9 @@ using System; using Homer.Platform.HomeKit.Bridges.Setup.Characteristics; using Homer.Platform.HomeKit.Bridges.Setup.Setup; +using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Services.Definitions; +using VersionCharacteristic = Homer.Platform.HomeKit.Bridges.Setup.Characteristics.VersionCharacteristic; namespace Homer.Platform.HomeKit.Bridges.Setup { @@ -32,20 +35,25 @@ public class BridgeSetupManager : Bridge public BridgeSetupManager(string uuid, string displayName) : base(uuid, displayName) { - // create setup service. - var setupService = new SetupService(); - // create handler characteristic. var controlPointCharacteristic = new ControlPointCharacteristic(); controlPointCharacteristic.Get += HandleReadRequest; controlPointCharacteristic.Set += HandleWriteRequest; - // add characteristics. - setupService.AddCharacteristic(new StateCharacteristic()) + // add characteristics to setup service. + + // create setup service. + AddService(new SetupService()) + .AddCharacteristic(new StateCharacteristic()) .AddCharacteristic(new VersionCharacteristic()) .AddCharacteristic(controlPointCharacteristic); - AddService(setupService); + // set accessory information service characteristics + GetService(typeof(AccessoryInformationService)) + .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") + .SetCharacteristic(typeof(ModelCharacteristic), "Homer") + .SetCharacteristic(typeof(SerialNumberCharacteristic), "CC:22:3D:E3:CE:30") + .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); } diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index a7063e4..ff599dc 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -23,12 +23,14 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using Homer.Platform.HomeKit.Events; using uuid.net.Classes.UUID; using uuid.net.Static_Classes.UUID_Validator; namespace Homer.Platform.HomeKit.Characteristics { + [DebuggerDisplay("Name = {DisplayName}, Value = {Value}")] public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProps { /// @@ -77,10 +79,10 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp public int MaxDataLength { get; } /// - public IList ValidValues { get; } + public IList ValidValues { get; } /// - public dynamic[] ValidValuesRange { get; } + public int[] ValidValuesRange { get; } /// public event EventHandler Get; @@ -132,7 +134,7 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp protected Characteristic(string uuid, string displayName, CharacteristicFormat format, IReadOnlyList permissions, CharacteristicUnit unit = CharacteristicUnit.Unitless, bool eventNotificationsEnabled = false, string description = null, dynamic minValue = null, dynamic maxValue = null, dynamic minStep = null, int maxLength = 64, int maxDataLength = 2097152, - IList validValues = null, dynamic[] validValuesRange = null, dynamic value = null) + IList validValues = null, int[] validValuesRange = null, dynamic value = null) { Uuid = uuid ?? throw new ArgumentException("Characteristics must be created with a valid UUID.", nameof(uuid)); if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs similarity index 93% rename from src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs rename to src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs index 7a8902c..a703ba6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisonCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs @@ -25,9 +25,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class FirmwareRevisonCharacteristic: Characteristic + public class FirmwareRevisionCharacteristic: Characteristic { - public FirmwareRevisonCharacteristic() : base( + public FirmwareRevisionCharacteristic() : base( "00000052-0000-1000-8000-0026BB765291", "Firmware Revision", CharacteristicFormat.String, diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs new file mode 100644 index 0000000..40597e1 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class IdentityCharacteristic : Characteristic + { + public IdentityCharacteristic() : base( + "00000014-0000-1000-8000-0026BB765291", + "Identify", + CharacteristicFormat.Bool, + new List() + { + CharacteristicPermission.WriteResponse + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index acfe36e..7c5770b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -31,9 +31,12 @@ public ManufacturerCharacteristic() : base( "00000020-0000-1000-8000-0026BB765291", "Manufacturer", CharacteristicFormat.String, - new List() + new List { CharacteristicPermission.PairedRead + },validValues: new List + { + }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/ProductData.cs b/src/platforms/homekit/Characteristics/Definitions/ProductData.cs new file mode 100644 index 0000000..d675315 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ProductData.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ProductData + { + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs new file mode 100644 index 0000000..dabe672 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class VersionCharacteristic:Characteristic + { + public VersionCharacteristic() : base( + "00000037-0000-1000-8000-0026BB76529", + "Version", + CharacteristicFormat.String, + new List() + { + CharacteristicPermission.PairedRead + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs index 628b2b3..0da23e0 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristicProps.cs @@ -93,12 +93,12 @@ public interface ICharacteristicProps /// (Optional) /// An array of numbers where each element represents a valid value. /// - IList ValidValues { get; } + IList ValidValues { get; } /// /// (Optional) /// A 2 element array representing the starting value and ending value of the range of valid values. /// - dynamic[] ValidValuesRange { get; } + int[] ValidValuesRange { get; } } } diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index 7cdfc3a..03e0eda 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -21,13 +21,22 @@ // Licensor: Hüseyin Uslu #endregion +using Homer.Platform.HomeKit.Characteristics.Definitions; + namespace Homer.Platform.HomeKit.Services.Definitions { public class AccessoryInformationService: Service { - public AccessoryInformationService() + public AccessoryInformationService() : base("0000003E-0000-1000-8000-0026BB765291", "Accessory Information") { + // required characteristics. + AddCharacteristic(typeof(IdentityCharacteristic)) + .AddCharacteristic(typeof(ManufacturerCharacteristic)) + .AddCharacteristic(typeof(ModelCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SerialNumberCharacteristic)) + .AddCharacteristic(typeof(FirmwareRevisionCharacteristic)); } } } diff --git a/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs b/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs new file mode 100644 index 0000000..df31804 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs @@ -0,0 +1,14 @@ +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ProtocolInformationService: Service + { + public ProtocolInformationService() + : base("000000A2-0000-1000-8000-0026BB765291", "Protocol Information") + { + // required characteristics. + AddCharacteristic(typeof(VersionCharacteristic)); + } + } +} diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index 1e92ee9..5c93f22 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -24,6 +24,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; @@ -33,6 +34,7 @@ namespace Homer.Platform.HomeKit.Services { + [DebuggerDisplay("Name = {" + nameof(DisplayName) + "}")] public class Service : EventEmitter, IService { /// @@ -114,6 +116,8 @@ public ICharacteristic GetOptionalCharacteristic(Type characteristic) public IService AddCharacteristic(ICharacteristic characteristic) { + if (characteristic == null) throw new ArgumentNullException(nameof(characteristic)); + _characteristics.Add(characteristic.GetType(), characteristic); OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. return this; // allow chaining. From a1c50c9cf9d1e25251dd0e93bd410a8f495e3251 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Sun, 9 Feb 2020 03:00:08 +0300 Subject: [PATCH 058/152] updated import.js done generating all pre-defined characteristics. --- contrib/importer/import.js | 77 +++++++++++++------ .../AccessoryFlagsCharacteristic.cs | 22 +++--- .../Definitions/ActiveCharacteristic.cs | 52 +++++++++++++ .../AdministratorOnlyAccessCharacteristic.cs | 43 +++++++++++ .../AirParticulateDensityCharacteristic.cs | 45 +++++++++++ .../AirParticulateSizeCharacteristic.cs | 51 ++++++++++++ .../Definitions/AirQualityCharacteristic.cs | 59 ++++++++++++++ .../AudioFeedbackCharacteristic.cs | 43 +++++++++++ .../Definitions/BatteryLevelCharacteristic.cs | 46 +++++++++++ .../Definitions/BrightnessCharacteristic.cs | 47 +++++++++++ .../CarbonDioxideDetectedCharacteristic.cs | 51 ++++++++++++ .../CarbonDioxideLevelCharacteristic.cs | 44 +++++++++++ .../CarbonDioxidePeakLevelCharacteristic.cs | 44 +++++++++++ .../CarbonMonoxideDetectedCharacteristic.cs | 51 ++++++++++++ .../CarbonMonoxideLevelCharacteristic.cs | 44 +++++++++++ .../CarbonMonoxidePeakLevelCharacteristic.cs | 44 +++++++++++ .../ChargingStateCharacteristic.cs | 53 +++++++++++++ .../ColorTemperatureCharacteristic.cs | 46 +++++++++++ .../ContactSensorStateCharacteristic.cs | 51 ++++++++++++ ...olingThresholdTemperatureCharacteristic.cs | 47 +++++++++++ .../CurrentAirPurifierStateCharacteristic.cs | 53 +++++++++++++ .../CurrentAmbientLightLevelCharacteristic.cs | 45 +++++++++++ .../CurrentDoorStateCharacteristic.cs | 57 ++++++++++++++ .../CurrentFanStateCharacteristic.cs | 53 +++++++++++++ .../CurrentHeaterCoolerStateCharacteristic.cs | 55 +++++++++++++ ...urrentHeatingCoolingStateCharacteristic.cs | 53 +++++++++++++ ...urrentHorizontalTiltAngleCharacteristic.cs | 46 +++++++++++ ...midifierDehumidifierStateCharacteristic.cs | 55 +++++++++++++ .../CurrentPositionCharacteristic.cs | 46 +++++++++++ .../CurrentRelativeHumidityCharacteristic.cs | 46 +++++++++++ .../CurrentSlatStateCharacteristic.cs | 53 +++++++++++++ .../CurrentTemperatureCharacteristic.cs | 46 +++++++++++ .../CurrentTiltAngleCharacteristic.cs | 46 +++++++++++ .../CurrentVerticalTiltAngleCharacteristic.cs | 46 +++++++++++ .../Definitions/DigitalZoomCharacteristic.cs | 43 +++++++++++ .../FilterChangeIndicationCharacteristic.cs | 51 ++++++++++++ .../FilterLifeLevelCharacteristic.cs | 44 +++++++++++ .../FirmwareRevisionCharacteristic.cs | 20 ++--- .../HardwareRevisionCharacteristic.cs | 41 ++++++++++ ...atingThresholdTemperatureCharacteristic.cs | 47 +++++++++++ .../Definitions/HoldPositionCharacteristic.cs | 41 ++++++++++ .../Definitions/HueCharacteristic.cs | 47 +++++++++++ .../Definitions/IdentifyCharacteristic.cs | 41 ++++++++++ .../Definitions/IdentityCharacteristic.cs | 20 ----- .../ImageMirroringCharacteristic.cs | 43 +++++++++++ .../ImageRotationCharacteristic.cs | 47 +++++++++++ .../Definitions/InUseCharacteristic.cs | 51 ++++++++++++ .../Definitions/IsConfiguredCharacteristic.cs | 52 +++++++++++++ .../Definitions/LeakDetectedCharacteristic.cs | 51 ++++++++++++ .../LockControlPointCharacteristic.cs | 41 ++++++++++ .../LockCurrentStateCharacteristic.cs | 55 +++++++++++++ .../LockLastKnownActionCharacteristic.cs | 65 ++++++++++++++++ ...gementAutoSecurityTimeoutCharacteristic.cs | 44 +++++++++++ .../LockPhysicalControlsCharacteristic.cs | 52 +++++++++++++ .../LockTargetStateCharacteristic.cs | 52 +++++++++++++ .../Definitions/LogsCharacteristic.cs | 42 ++++++++++ .../Definitions/ManufacturerCharacteristic.cs | 25 +++--- .../Definitions/ModelCharacteristic.cs | 22 +++--- .../MotionDetectedCharacteristic.cs | 42 ++++++++++ .../Definitions/MuteCharacteristic.cs | 43 +++++++++++ .../Definitions/NameCharacteristic.cs | 22 +++--- .../Definitions/NightVisionCharacteristic.cs | 43 +++++++++++ .../NitrogenDioxideDensityCharacteristic.cs | 45 +++++++++++ .../ObstructionDetectedCharacteristic.cs | 42 ++++++++++ .../OccupancyDetectedCharacteristic.cs | 51 ++++++++++++ .../Definitions/OnCharacteristic.cs | 43 +++++++++++ .../Definitions/OpticalZoomCharacteristic.cs | 43 +++++++++++ .../Definitions/OutletInUseCharacteristic.cs | 42 ++++++++++ .../Definitions/OzoneDensityCharacteristic.cs | 45 +++++++++++ .../Definitions/PM10DensityCharacteristic.cs | 45 +++++++++++ .../Definitions/PM2_5DensityCharacteristic.cs | 45 +++++++++++ .../Definitions/PairSetupCharacteristic.cs | 42 ++++++++++ .../Definitions/PairVerifyCharacteristic.cs | 42 ++++++++++ .../PairingFeaturesCharacteristic.cs | 41 ++++++++++ .../PairingPairingsCharacteristic.cs | 42 ++++++++++ .../PositionStateCharacteristic.cs | 53 +++++++++++++ .../Definitions/ProductData.cs | 10 --- .../Definitions/ProgramModeCharacteristic.cs | 53 +++++++++++++ .../ProgrammableSwitchEventCharacteristic.cs | 53 +++++++++++++ ...dityDehumidifierThresholdCharacteristic.cs | 47 +++++++++++ ...midityHumidifierThresholdCharacteristic.cs | 47 +++++++++++ .../RemainingDurationCharacteristic.cs | 45 +++++++++++ .../ResetFilterIndicationCharacteristic.cs | 44 +++++++++++ .../RotationDirectionCharacteristic.cs | 52 +++++++++++++ .../RotationSpeedCharacteristic.cs | 47 +++++++++++ .../Definitions/SaturationCharacteristic.cs | 47 +++++++++++ .../SecuritySystemAlarmTypeCharacteristic.cs | 45 +++++++++++ ...ecuritySystemCurrentStateCharacteristic.cs | 57 ++++++++++++++ ...SecuritySystemTargetStateCharacteristic.cs | 56 ++++++++++++++ ...tedRTPStreamConfigurationCharacteristic.cs | 42 ++++++++++ .../Definitions/SerialNumberCharacteristic.cs | 22 +++--- .../ServiceLabelIndexCharacteristic.cs | 44 +++++++++++ .../ServiceLabelNamespaceCharacteristic.cs | 50 ++++++++++++ .../Definitions/SetDurationCharacteristic.cs | 46 +++++++++++ .../SetupEndpointsCharacteristic.cs | 42 ++++++++++ .../Definitions/SlatTypeCharacteristic.cs | 50 ++++++++++++ .../SmokeDetectedCharacteristic.cs | 51 ++++++++++++ .../Definitions/StatusActiveCharacteristic.cs | 42 ++++++++++ .../Definitions/StatusFaultCharacteristic.cs | 51 ++++++++++++ .../Definitions/StatusJammedCharacteristic.cs | 51 ++++++++++++ .../StatusLowBatteryCharacteristic.cs | 51 ++++++++++++ .../StatusTamperedCharacteristic.cs | 51 ++++++++++++ .../StreamingStatusCharacteristic.cs | 42 ++++++++++ .../SulphurDioxideDensityCharacteristic.cs | 45 +++++++++++ ...dAudioStreamConfigurationCharacteristic.cs | 41 ++++++++++ ...SupportedRTPConfigurationCharacteristic.cs | 41 ++++++++++ ...dVideoStreamConfigurationCharacteristic.cs | 41 ++++++++++ .../Definitions/SwingModeCharacteristic.cs | 52 +++++++++++++ .../TargetAirPurifierStateCharacteristic.cs | 52 +++++++++++++ .../TargetAirQualityCharacteristic.cs | 54 +++++++++++++ .../TargetDoorStateCharacteristic.cs | 52 +++++++++++++ .../TargetFanStateCharacteristic.cs | 52 +++++++++++++ .../TargetHeaterCoolerStateCharacteristic.cs | 54 +++++++++++++ ...TargetHeatingCoolingStateCharacteristic.cs | 56 ++++++++++++++ ...TargetHorizontalTiltAngleCharacteristic.cs | 47 +++++++++++ ...midifierDehumidifierStateCharacteristic.cs | 54 +++++++++++++ .../TargetPositionCharacteristic.cs | 47 +++++++++++ .../TargetRelativeHumidityCharacteristic.cs | 47 +++++++++++ .../TargetSlatStateCharacteristic.cs | 52 +++++++++++++ .../TargetTemperatureCharacteristic.cs | 47 +++++++++++ .../TargetTiltAngleCharacteristic.cs | 47 +++++++++++ .../TargetVerticalTiltAngleCharacteristic.cs | 47 +++++++++++ .../TemperatureDisplayUnitsCharacteristic.cs | 52 +++++++++++++ .../Definitions/VOCDensityCharacteristic.cs | 45 +++++++++++ .../Definitions/ValveTypeCharacteristic.cs | 55 +++++++++++++ .../Definitions/VersionCharacteristic.cs | 40 +++++++--- .../Definitions/VolumeCharacteristic.cs | 47 +++++++++++ .../Definitions/WaterLevelCharacteristic.cs | 45 +++++++++++ .../homekit/Homer.Platform.HomeKit.csproj | 4 + .../AccessoryInformationService.cs | 2 +- 130 files changed, 5794 insertions(+), 130 deletions(-) create mode 100644 src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs delete mode 100644 src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs delete mode 100644 src/platforms/homekit/Characteristics/Definitions/ProductData.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs create mode 100644 src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs diff --git a/contrib/importer/import.js b/contrib/importer/import.js index f15e21c..b3bca11 100644 --- a/contrib/importer/import.js +++ b/contrib/importer/import.js @@ -9,9 +9,6 @@ const plist = require('simple-plist'); var plistPath = './data/default.metadata.plist'; var metadata = plist.readFileSync(plistPath); -var outputPath = path.join(__dirname, 'HomeKitTypes.txt'); -var output = fs.createWriteStream(outputPath); - var characteristics = {}; for (var index in metadata.Characteristics) { @@ -21,9 +18,35 @@ for (var index in metadata.Characteristics) { characteristics[characteristic.UUID] = classyName; - output.write(`using System.Collections.Generic;\n\n`); - output.write(`namespace Homer.Platform.HomeKit.Characteristics.Definitions\n{\n`); - output.write(` public class ${classyName}Characteristic : Characteristic\n {\n`); + var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); + var output = fs.createWriteStream(outputPath); + + output.write(`#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion\n\n`); + +output.write(`using System.Collections.Generic;\n\n`); +output.write(`namespace Homer.Platform.HomeKit.Characteristics.Definitions\n{\n`); + output.write(` public class ${classyName}Characteristic: Characteristic\n {\n`); if (characteristic.Constraints && characteristic.Constraints.ValidValues) { // this characteristic can only have one of a defined set of values (like an enum). Define the values as static members of our subclass. @@ -40,23 +63,14 @@ for (var index in metadata.Characteristics) { output.write('\n'); } - output.write(` public ${classyName}Characteristic() : base(\n`); + output.write(` public ${classyName}Characteristic(): base(\n`); output.write(` uuid: "${characteristic.UUID}",\n`); output.write(` displayName: "${characteristic.Name}",\n`); - output.write(` format: CharacteristicFormat.${capitalize(characteristic.Format)},\n`); - - output.write(` permissions: new List\n {\n`); - for (var i in characteristic.Properties) { - var perms = getCharacteristicPermsKey(characteristic.Properties[i]); - if (perms) { - output.write(` CharacteristicPermission.${getCharacteristicPermsKey(characteristic.Properties[i])},\n`); - } - } - output.write(` },\n`); + output.write(` format: CharacteristicFormat.${getCharacteristicFormat(characteristic.Format)},\n`); if (characteristic.Unit) - output.write(` unit: CharacteristicUnit.${capitalize(characteristic.Unit)},\n`); + output.write(` unit: CharacteristicUnit.${getCharacteristicUnit(characteristic.Unit)},\n`); // apply any basic constraints if present if (characteristic.Constraints && typeof characteristic.Constraints.MaximumValue !== 'undefined') @@ -73,13 +87,20 @@ for (var index in metadata.Characteristics) { for (var value in characteristic.Constraints.ValidValues) { output.write(` ${value},\n`); } - output.write(` }\n`); + output.write(` },\n`); } - output.write(` )\n`); - output.write(` {\n }\n }\n}\n`); + output.write(` permissions: new List\n {\n`); + for (var i in characteristic.Properties) { + var perms = getCharacteristicPermsKey(characteristic.Properties[i]); + if (perms) { + output.write(` CharacteristicPermission.${getCharacteristicPermsKey(characteristic.Properties[i])},\n`); + } + } + output.write(` })\n`); - output.write(`\n\n`); + output.write(` {\n }\n }\n}\n`); + output.end() } function capitalize(s) { @@ -87,6 +108,18 @@ function capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1) } +function getCharacteristicUnit(unit) { + unit = capitalize(unit); + if (unit == 'Arcdegrees') unit = 'ArcDegree' + return unit; +} + +function getCharacteristicFormat(format) { + format = capitalize(format); + if (format == 'Int32') format = 'Int' + return format; +} + function getCharacteristicPermsKey(perm) { switch (perm) { case "read": return "PairedRead"; diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index a7c1752..1db3584 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -25,16 +25,16 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class AccessoryFlagsCharacteristic : Characteristic + public class AccessoryFlagsCharacteristic: Characteristic { - public AccessoryFlagsCharacteristic() : base( - "000000A6-0000-1000-8000-0026BB765291", - "Accessory Flags", - CharacteristicFormat.Uint32, - new List() + public AccessoryFlagsCharacteristic(): base( + uuid: "000000A6-0000-1000-8000-0026BB765291", + displayName: "Accessory Flags", + format: CharacteristicFormat.Uint32, + permissions: new List { CharacteristicPermission.PairedRead, - CharacteristicPermission.Events + CharacteristicPermission.Events, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs new file mode 100644 index 0000000..ea7f44f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ActiveCharacteristic: Characteristic + { + // possible values: + public static int INACTIVE = 0; + public static int ACTIVE = 1; + + public ActiveCharacteristic(): base( + uuid: "000000B0-0000-1000-8000-0026BB765291", + displayName: "Active", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs new file mode 100644 index 0000000..6ffe19f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class AdministratorOnlyAccessCharacteristic: Characteristic + { + public AdministratorOnlyAccessCharacteristic(): base( + uuid: "00000001-0000-1000-8000-0026BB765291", + displayName: "Administrator Only Access", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs new file mode 100644 index 0000000..bf95f7c --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class AirParticulateDensityCharacteristic: Characteristic + { + public AirParticulateDensityCharacteristic(): base( + uuid: "00000064-0000-1000-8000-0026BB765291", + displayName: "Air Particulate Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs new file mode 100644 index 0000000..dd8056a --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class AirParticulateSizeCharacteristic: Characteristic + { + // possible values: + public static int _2_5_M = 0; + public static int _10_M = 1; + + public AirParticulateSizeCharacteristic(): base( + uuid: "00000065-0000-1000-8000-0026BB765291", + displayName: "Air Particulate Size", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs new file mode 100644 index 0000000..c2f0c86 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs @@ -0,0 +1,59 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class AirQualityCharacteristic: Characteristic + { + // possible values: + public static int UNKNOWN = 0; + public static int EXCELLENT = 1; + public static int GOOD = 2; + public static int FAIR = 3; + public static int INFERIOR = 4; + public static int POOR = 5; + + public AirQualityCharacteristic(): base( + uuid: "00000095-0000-1000-8000-0026BB765291", + displayName: "Air Quality", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + 4, + 5, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs new file mode 100644 index 0000000..3818115 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class AudioFeedbackCharacteristic: Characteristic + { + public AudioFeedbackCharacteristic(): base( + uuid: "00000005-0000-1000-8000-0026BB765291", + displayName: "Audio Feedback", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs new file mode 100644 index 0000000..2a9bb35 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class BatteryLevelCharacteristic: Characteristic + { + public BatteryLevelCharacteristic(): base( + uuid: "00000068-0000-1000-8000-0026BB765291", + displayName: "Battery Level", + format: CharacteristicFormat.Uint8, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs new file mode 100644 index 0000000..215a575 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class BrightnessCharacteristic: Characteristic + { + public BrightnessCharacteristic(): base( + uuid: "00000008-0000-1000-8000-0026BB765291", + displayName: "Brightness", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs new file mode 100644 index 0000000..40c9fcb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonDioxideDetectedCharacteristic: Characteristic + { + // possible values: + public static int CO2_LEVELS_NORMAL = 0; + public static int CO2_LEVELS_ABNORMAL = 1; + + public CarbonDioxideDetectedCharacteristic(): base( + uuid: "00000092-0000-1000-8000-0026BB765291", + displayName: "Carbon Dioxide Detected", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs new file mode 100644 index 0000000..a5d29b7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonDioxideLevelCharacteristic: Characteristic + { + public CarbonDioxideLevelCharacteristic(): base( + uuid: "00000093-0000-1000-8000-0026BB765291", + displayName: "Carbon Dioxide Level", + format: CharacteristicFormat.Float, + maxValue: 100000, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs new file mode 100644 index 0000000..033f43a --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonDioxidePeakLevelCharacteristic: Characteristic + { + public CarbonDioxidePeakLevelCharacteristic(): base( + uuid: "00000094-0000-1000-8000-0026BB765291", + displayName: "Carbon Dioxide Peak Level", + format: CharacteristicFormat.Float, + maxValue: 100000, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs new file mode 100644 index 0000000..04e3f09 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonMonoxideDetectedCharacteristic: Characteristic + { + // possible values: + public static int CO_LEVELS_NORMAL = 0; + public static int CO_LEVELS_ABNORMAL = 1; + + public CarbonMonoxideDetectedCharacteristic(): base( + uuid: "00000069-0000-1000-8000-0026BB765291", + displayName: "Carbon Monoxide Detected", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs new file mode 100644 index 0000000..01853eb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonMonoxideLevelCharacteristic: Characteristic + { + public CarbonMonoxideLevelCharacteristic(): base( + uuid: "00000090-0000-1000-8000-0026BB765291", + displayName: "Carbon Monoxide Level", + format: CharacteristicFormat.Float, + maxValue: 100, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs new file mode 100644 index 0000000..e48b4b9 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CarbonMonoxidePeakLevelCharacteristic: Characteristic + { + public CarbonMonoxidePeakLevelCharacteristic(): base( + uuid: "00000091-0000-1000-8000-0026BB765291", + displayName: "Carbon Monoxide Peak Level", + format: CharacteristicFormat.Float, + maxValue: 100, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs new file mode 100644 index 0000000..89a185d --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ChargingStateCharacteristic: Characteristic + { + // possible values: + public static int NOT_CHARGING = 0; + public static int CHARGING = 1; + public static int NOT_CHARGEABLE = 2; + + public ChargingStateCharacteristic(): base( + uuid: "0000008F-0000-1000-8000-0026BB765291", + displayName: "Charging State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs new file mode 100644 index 0000000..7bdac05 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ColorTemperatureCharacteristic: Characteristic + { + public ColorTemperatureCharacteristic(): base( + uuid: "000000CE-0000-1000-8000-0026BB765291", + displayName: "Color Temperature", + format: CharacteristicFormat.Uint32, + maxValue: 500, + minValue: 140, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs new file mode 100644 index 0000000..ff618c3 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ContactSensorStateCharacteristic: Characteristic + { + // possible values: + public static int CONTACT_DETECTED = 0; + public static int CONTACT_NOT_DETECTED = 1; + + public ContactSensorStateCharacteristic(): base( + uuid: "0000006A-0000-1000-8000-0026BB765291", + displayName: "Contact Sensor State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs new file mode 100644 index 0000000..c1fa960 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CoolingThresholdTemperatureCharacteristic: Characteristic + { + public CoolingThresholdTemperatureCharacteristic(): base( + uuid: "0000000D-0000-1000-8000-0026BB765291", + displayName: "Cooling Threshold Temperature", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Celsius, + maxValue: 35, + minValue: 10, + minStep: 0.1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs new file mode 100644 index 0000000..0484e55 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentAirPurifierStateCharacteristic: Characteristic + { + // possible values: + public static int INACTIVE = 0; + public static int IDLE = 1; + public static int PURIFYING_AIR = 2; + + public CurrentAirPurifierStateCharacteristic(): base( + uuid: "000000A9-0000-1000-8000-0026BB765291", + displayName: "Current Air Purifier State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs new file mode 100644 index 0000000..5250f66 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentAmbientLightLevelCharacteristic: Characteristic + { + public CurrentAmbientLightLevelCharacteristic(): base( + uuid: "0000006B-0000-1000-8000-0026BB765291", + displayName: "Current Ambient Light Level", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Lux, + maxValue: 100000, + minValue: 0.0001, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs new file mode 100644 index 0000000..8e80feb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs @@ -0,0 +1,57 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentDoorStateCharacteristic: Characteristic + { + // possible values: + public static int OPEN = 0; + public static int CLOSED = 1; + public static int OPENING = 2; + public static int CLOSING = 3; + public static int STOPPED = 4; + + public CurrentDoorStateCharacteristic(): base( + uuid: "0000000E-0000-1000-8000-0026BB765291", + displayName: "Current Door State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + 4, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs new file mode 100644 index 0000000..8f68a07 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentFanStateCharacteristic: Characteristic + { + // possible values: + public static int INACTIVE = 0; + public static int IDLE = 1; + public static int BLOWING_AIR = 2; + + public CurrentFanStateCharacteristic(): base( + uuid: "000000AF-0000-1000-8000-0026BB765291", + displayName: "Current Fan State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs new file mode 100644 index 0000000..98ff540 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs @@ -0,0 +1,55 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentHeaterCoolerStateCharacteristic: Characteristic + { + // possible values: + public static int INACTIVE = 0; + public static int IDLE = 1; + public static int HEATING = 2; + public static int COOLING = 3; + + public CurrentHeaterCoolerStateCharacteristic(): base( + uuid: "000000B1-0000-1000-8000-0026BB765291", + displayName: "Current Heater Cooler State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs new file mode 100644 index 0000000..7846a94 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentHeatingCoolingStateCharacteristic: Characteristic + { + // possible values: + public static int OFF = 0; + public static int HEAT = 1; + public static int COOL = 2; + + public CurrentHeatingCoolingStateCharacteristic(): base( + uuid: "0000000F-0000-1000-8000-0026BB765291", + displayName: "Current Heating Cooling State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs new file mode 100644 index 0000000..7e4fc63 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentHorizontalTiltAngleCharacteristic: Characteristic + { + public CurrentHorizontalTiltAngleCharacteristic(): base( + uuid: "0000006C-0000-1000-8000-0026BB765291", + displayName: "Current Horizontal Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs new file mode 100644 index 0000000..66baa13 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs @@ -0,0 +1,55 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentHumidifierDehumidifierStateCharacteristic: Characteristic + { + // possible values: + public static int INACTIVE = 0; + public static int IDLE = 1; + public static int HUMIDIFYING = 2; + public static int DEHUMIDIFYING = 3; + + public CurrentHumidifierDehumidifierStateCharacteristic(): base( + uuid: "000000B3-0000-1000-8000-0026BB765291", + displayName: "Current Humidifier Dehumidifier State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs new file mode 100644 index 0000000..740f680 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentPositionCharacteristic: Characteristic + { + public CurrentPositionCharacteristic(): base( + uuid: "0000006D-0000-1000-8000-0026BB765291", + displayName: "Current Position", + format: CharacteristicFormat.Uint8, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs new file mode 100644 index 0000000..fead743 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentRelativeHumidityCharacteristic: Characteristic + { + public CurrentRelativeHumidityCharacteristic(): base( + uuid: "00000010-0000-1000-8000-0026BB765291", + displayName: "Current Relative Humidity", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs new file mode 100644 index 0000000..97ee1d7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentSlatStateCharacteristic: Characteristic + { + // possible values: + public static int FIXED = 0; + public static int JAMMED = 1; + public static int SWINGING = 2; + + public CurrentSlatStateCharacteristic(): base( + uuid: "000000AA-0000-1000-8000-0026BB765291", + displayName: "Current Slat State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs new file mode 100644 index 0000000..998bc85 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentTemperatureCharacteristic: Characteristic + { + public CurrentTemperatureCharacteristic(): base( + uuid: "00000011-0000-1000-8000-0026BB765291", + displayName: "Current Temperature", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Celsius, + maxValue: 100, + minValue: 0, + minStep: 0.1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs new file mode 100644 index 0000000..796b557 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentTiltAngleCharacteristic: Characteristic + { + public CurrentTiltAngleCharacteristic(): base( + uuid: "000000C1-0000-1000-8000-0026BB765291", + displayName: "Current Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs new file mode 100644 index 0000000..78d39b3 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class CurrentVerticalTiltAngleCharacteristic: Characteristic + { + public CurrentVerticalTiltAngleCharacteristic(): base( + uuid: "0000006E-0000-1000-8000-0026BB765291", + displayName: "Current Vertical Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs new file mode 100644 index 0000000..35a4c2c --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class DigitalZoomCharacteristic: Characteristic + { + public DigitalZoomCharacteristic(): base( + uuid: "0000011D-0000-1000-8000-0026BB765291", + displayName: "Digital Zoom", + format: CharacteristicFormat.Float, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs new file mode 100644 index 0000000..971605b --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class FilterChangeIndicationCharacteristic: Characteristic + { + // possible values: + public static int FILTER_OK = 0; + public static int CHANGE_FILTER = 1; + + public FilterChangeIndicationCharacteristic(): base( + uuid: "000000AC-0000-1000-8000-0026BB765291", + displayName: "Filter Change Indication", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs new file mode 100644 index 0000000..c78aa79 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class FilterLifeLevelCharacteristic: Characteristic + { + public FilterLifeLevelCharacteristic(): base( + uuid: "000000AB-0000-1000-8000-0026BB765291", + displayName: "Filter Life Level", + format: CharacteristicFormat.Float, + maxValue: 100, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs index a703ba6..1099527 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -27,13 +27,13 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FirmwareRevisionCharacteristic: Characteristic { - public FirmwareRevisionCharacteristic() : base( - "00000052-0000-1000-8000-0026BB765291", - "Firmware Revision", - CharacteristicFormat.String, - new List() + public FirmwareRevisionCharacteristic(): base( + uuid: "00000052-0000-1000-8000-0026BB765291", + displayName: "Firmware Revision", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead + CharacteristicPermission.PairedRead, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs new file mode 100644 index 0000000..d62dfff --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class HardwareRevisionCharacteristic: Characteristic + { + public HardwareRevisionCharacteristic(): base( + uuid: "00000053-0000-1000-8000-0026BB765291", + displayName: "Hardware Revision", + format: CharacteristicFormat.String, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs new file mode 100644 index 0000000..9e69ad1 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class HeatingThresholdTemperatureCharacteristic: Characteristic + { + public HeatingThresholdTemperatureCharacteristic(): base( + uuid: "00000012-0000-1000-8000-0026BB765291", + displayName: "Heating Threshold Temperature", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Celsius, + maxValue: 25, + minValue: 0, + minStep: 0.1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs new file mode 100644 index 0000000..a38a34f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class HoldPositionCharacteristic: Characteristic + { + public HoldPositionCharacteristic(): base( + uuid: "0000006F-0000-1000-8000-0026BB765291", + displayName: "Hold Position", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs new file mode 100644 index 0000000..0b4e5c6 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class HueCharacteristic: Characteristic + { + public HueCharacteristic(): base( + uuid: "00000013-0000-1000-8000-0026BB765291", + displayName: "Hue", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.ArcDegree, + maxValue: 360, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs new file mode 100644 index 0000000..e927b4f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class IdentifyCharacteristic: Characteristic + { + public IdentifyCharacteristic(): base( + uuid: "00000014-0000-1000-8000-0026BB765291", + displayName: "Identify", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs deleted file mode 100644 index 40597e1..0000000 --- a/src/platforms/homekit/Characteristics/Definitions/IdentityCharacteristic.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Homer.Platform.HomeKit.Characteristics.Definitions -{ - public class IdentityCharacteristic : Characteristic - { - public IdentityCharacteristic() : base( - "00000014-0000-1000-8000-0026BB765291", - "Identify", - CharacteristicFormat.Bool, - new List() - { - CharacteristicPermission.WriteResponse - }) - { - } - } -} diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs new file mode 100644 index 0000000..dd2ac8e --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ImageMirroringCharacteristic: Characteristic + { + public ImageMirroringCharacteristic(): base( + uuid: "0000011F-0000-1000-8000-0026BB765291", + displayName: "Image Mirroring", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs new file mode 100644 index 0000000..91472cf --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ImageRotationCharacteristic: Characteristic + { + public ImageRotationCharacteristic(): base( + uuid: "0000011E-0000-1000-8000-0026BB765291", + displayName: "Image Rotation", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.ArcDegree, + maxValue: 270, + minValue: 0, + minStep: 90, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs new file mode 100644 index 0000000..0383b20 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class InUseCharacteristic: Characteristic + { + // possible values: + public static int NOT_IN_USE = 0; + public static int IN_USE = 1; + + public InUseCharacteristic(): base( + uuid: "000000D2-0000-1000-8000-0026BB765291", + displayName: "In Use", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs new file mode 100644 index 0000000..b84c3c8 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class IsConfiguredCharacteristic: Characteristic + { + // possible values: + public static int NOT_CONFIGURED = 0; + public static int CONFIGURED = 1; + + public IsConfiguredCharacteristic(): base( + uuid: "000000D6-0000-1000-8000-0026BB765291", + displayName: "Is Configured", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs new file mode 100644 index 0000000..0d2e48d --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LeakDetectedCharacteristic: Characteristic + { + // possible values: + public static int LEAK_NOT_DETECTED = 0; + public static int LEAK_DETECTED = 1; + + public LeakDetectedCharacteristic(): base( + uuid: "00000070-0000-1000-8000-0026BB765291", + displayName: "Leak Detected", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs new file mode 100644 index 0000000..0bb743a --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockControlPointCharacteristic: Characteristic + { + public LockControlPointCharacteristic(): base( + uuid: "00000019-0000-1000-8000-0026BB765291", + displayName: "Lock Control Point", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs new file mode 100644 index 0000000..aedb74d --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs @@ -0,0 +1,55 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockCurrentStateCharacteristic: Characteristic + { + // possible values: + public static int UNSECURED = 0; + public static int SECURED = 1; + public static int JAMMED = 2; + public static int UNKNOWN = 3; + + public LockCurrentStateCharacteristic(): base( + uuid: "0000001D-0000-1000-8000-0026BB765291", + displayName: "Lock Current State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs new file mode 100644 index 0000000..8babb08 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs @@ -0,0 +1,65 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockLastKnownActionCharacteristic: Characteristic + { + // possible values: + public static int SECURED_PHYSICALLY_INTERIOR = 0; + public static int UNSECURED_PHYSICALLY_INTERIOR = 1; + public static int SECURED_PHYSICALLY_EXTERIOR = 2; + public static int UNSECURED_PHYSICALLY_EXTERIOR = 3; + public static int SECURED_BY_KEYPAD = 4; + public static int UNSECURED_BY_KEYPAD = 5; + public static int SECURED_REMOTELY = 6; + public static int UNSECURED_REMOTELY = 7; + public static int SECURED_BY_AUTO_SECURE_TIMEOUT = 8; + + public LockLastKnownActionCharacteristic(): base( + uuid: "0000001C-0000-1000-8000-0026BB765291", + displayName: "Lock Last Known Action", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs new file mode 100644 index 0000000..f6668d2 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockManagementAutoSecurityTimeoutCharacteristic: Characteristic + { + public LockManagementAutoSecurityTimeoutCharacteristic(): base( + uuid: "0000001A-0000-1000-8000-0026BB765291", + displayName: "Lock Management Auto Security Timeout", + format: CharacteristicFormat.Uint32, + unit: CharacteristicUnit.Seconds, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs new file mode 100644 index 0000000..6fa0bc7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockPhysicalControlsCharacteristic: Characteristic + { + // possible values: + public static int CONTROL_LOCK_DISABLED = 0; + public static int CONTROL_LOCK_ENABLED = 1; + + public LockPhysicalControlsCharacteristic(): base( + uuid: "000000A7-0000-1000-8000-0026BB765291", + displayName: "Lock Physical Controls", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs new file mode 100644 index 0000000..4d54257 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LockTargetStateCharacteristic: Characteristic + { + // possible values: + public static int UNSECURED = 0; + public static int SECURED = 1; + + public LockTargetStateCharacteristic(): base( + uuid: "0000001E-0000-1000-8000-0026BB765291", + displayName: "Lock Target State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs new file mode 100644 index 0000000..c3fb57d --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class LogsCharacteristic: Characteristic + { + public LogsCharacteristic(): base( + uuid: "0000001F-0000-1000-8000-0026BB765291", + displayName: "Logs", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index 7c5770b..2cd80ec 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -25,18 +25,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class ManufacturerCharacteristic : Characteristic + public class ManufacturerCharacteristic: Characteristic { - public ManufacturerCharacteristic() : base( - "00000020-0000-1000-8000-0026BB765291", - "Manufacturer", - CharacteristicFormat.String, - new List + public ManufacturerCharacteristic(): base( + uuid: "00000020-0000-1000-8000-0026BB765291", + displayName: "Manufacturer", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead - },validValues: new List - { - + CharacteristicPermission.PairedRead, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs index 9b77465..f8f77c4 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -25,15 +25,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class ModelCharacteristic : Characteristic + public class ModelCharacteristic: Characteristic { - public ModelCharacteristic() : base( - "00000021-0000-1000-8000-0026BB765291", - "Model", - CharacteristicFormat.String, - new List() + public ModelCharacteristic(): base( + uuid: "00000021-0000-1000-8000-0026BB765291", + displayName: "Model", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead + CharacteristicPermission.PairedRead, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs new file mode 100644 index 0000000..3e0b0a8 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class MotionDetectedCharacteristic: Characteristic + { + public MotionDetectedCharacteristic(): base( + uuid: "00000022-0000-1000-8000-0026BB765291", + displayName: "Motion Detected", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs new file mode 100644 index 0000000..07eca24 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class MuteCharacteristic: Characteristic + { + public MuteCharacteristic(): base( + uuid: "0000011A-0000-1000-8000-0026BB765291", + displayName: "Mute", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index 18e5c8a..23cc1e0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -25,15 +25,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class NameCharacteristic : Characteristic + public class NameCharacteristic: Characteristic { - public NameCharacteristic() : base( - "00000023-0000-1000-8000-0026BB765291", - "Name", - CharacteristicFormat.String, - new List() + public NameCharacteristic(): base( + uuid: "00000023-0000-1000-8000-0026BB765291", + displayName: "Name", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead + CharacteristicPermission.PairedRead, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs new file mode 100644 index 0000000..d6774cc --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class NightVisionCharacteristic: Characteristic + { + public NightVisionCharacteristic(): base( + uuid: "0000011B-0000-1000-8000-0026BB765291", + displayName: "Night Vision", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs new file mode 100644 index 0000000..40f0e41 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class NitrogenDioxideDensityCharacteristic: Characteristic + { + public NitrogenDioxideDensityCharacteristic(): base( + uuid: "000000C4-0000-1000-8000-0026BB765291", + displayName: "Nitrogen Dioxide Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs new file mode 100644 index 0000000..a7a82d0 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ObstructionDetectedCharacteristic: Characteristic + { + public ObstructionDetectedCharacteristic(): base( + uuid: "00000024-0000-1000-8000-0026BB765291", + displayName: "Obstruction Detected", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs new file mode 100644 index 0000000..384c7fb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class OccupancyDetectedCharacteristic: Characteristic + { + // possible values: + public static int OCCUPANCY_NOT_DETECTED = 0; + public static int OCCUPANCY_DETECTED = 1; + + public OccupancyDetectedCharacteristic(): base( + uuid: "00000071-0000-1000-8000-0026BB765291", + displayName: "Occupancy Detected", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs new file mode 100644 index 0000000..0b8c921 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class OnCharacteristic: Characteristic + { + public OnCharacteristic(): base( + uuid: "00000025-0000-1000-8000-0026BB765291", + displayName: "On", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs new file mode 100644 index 0000000..f3173c0 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class OpticalZoomCharacteristic: Characteristic + { + public OpticalZoomCharacteristic(): base( + uuid: "0000011C-0000-1000-8000-0026BB765291", + displayName: "Optical Zoom", + format: CharacteristicFormat.Float, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs new file mode 100644 index 0000000..c9a2146 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class OutletInUseCharacteristic: Characteristic + { + public OutletInUseCharacteristic(): base( + uuid: "00000026-0000-1000-8000-0026BB765291", + displayName: "Outlet In Use", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs new file mode 100644 index 0000000..c73cca6 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class OzoneDensityCharacteristic: Characteristic + { + public OzoneDensityCharacteristic(): base( + uuid: "000000C3-0000-1000-8000-0026BB765291", + displayName: "Ozone Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs new file mode 100644 index 0000000..b44ce97 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PM10DensityCharacteristic: Characteristic + { + public PM10DensityCharacteristic(): base( + uuid: "000000C7-0000-1000-8000-0026BB765291", + displayName: "PM10 Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs new file mode 100644 index 0000000..853abcb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PM2_5DensityCharacteristic: Characteristic + { + public PM2_5DensityCharacteristic(): base( + uuid: "000000C6-0000-1000-8000-0026BB765291", + displayName: "PM2.5 Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs new file mode 100644 index 0000000..8d3362b --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PairSetupCharacteristic: Characteristic + { + public PairSetupCharacteristic(): base( + uuid: "0000004C-0000-1000-8000-0026BB765291", + displayName: "Pair Setup", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs new file mode 100644 index 0000000..88e5c43 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PairVerifyCharacteristic: Characteristic + { + public PairVerifyCharacteristic(): base( + uuid: "0000004E-0000-1000-8000-0026BB765291", + displayName: "Pair Verify", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs new file mode 100644 index 0000000..76d31e7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PairingFeaturesCharacteristic: Characteristic + { + public PairingFeaturesCharacteristic(): base( + uuid: "0000004F-0000-1000-8000-0026BB765291", + displayName: "Pairing Features", + format: CharacteristicFormat.Uint8, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs new file mode 100644 index 0000000..d0eec56 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PairingPairingsCharacteristic: Characteristic + { + public PairingPairingsCharacteristic(): base( + uuid: "00000050-0000-1000-8000-0026BB765291", + displayName: "Pairing Pairings", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs new file mode 100644 index 0000000..e24065a --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class PositionStateCharacteristic: Characteristic + { + // possible values: + public static int DECREASING = 0; + public static int INCREASING = 1; + public static int STOPPED = 2; + + public PositionStateCharacteristic(): base( + uuid: "00000072-0000-1000-8000-0026BB765291", + displayName: "Position State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ProductData.cs b/src/platforms/homekit/Characteristics/Definitions/ProductData.cs deleted file mode 100644 index d675315..0000000 --- a/src/platforms/homekit/Characteristics/Definitions/ProductData.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Homer.Platform.HomeKit.Characteristics.Definitions -{ - public class ProductData - { - } -} diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs new file mode 100644 index 0000000..6f99c31 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ProgramModeCharacteristic: Characteristic + { + // possible values: + public static int NO_PROGRAM_SCHEDULED = 0; + public static int PROGRAM_SCHEDULED = 1; + public static int PROGRAM_SCHEDULED_MANUAL_MODE_ = 2; + + public ProgramModeCharacteristic(): base( + uuid: "000000D1-0000-1000-8000-0026BB765291", + displayName: "Program Mode", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs new file mode 100644 index 0000000..83347e2 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ProgrammableSwitchEventCharacteristic: Characteristic + { + // possible values: + public static int SINGLE_PRESS = 0; + public static int DOUBLE_PRESS = 1; + public static int LONG_PRESS = 2; + + public ProgrammableSwitchEventCharacteristic(): base( + uuid: "00000073-0000-1000-8000-0026BB765291", + displayName: "Programmable Switch Event", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs new file mode 100644 index 0000000..62c3fb1 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class RelativeHumidityDehumidifierThresholdCharacteristic: Characteristic + { + public RelativeHumidityDehumidifierThresholdCharacteristic(): base( + uuid: "000000C9-0000-1000-8000-0026BB765291", + displayName: "Relative Humidity Dehumidifier Threshold", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs new file mode 100644 index 0000000..3f53103 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class RelativeHumidityHumidifierThresholdCharacteristic: Characteristic + { + public RelativeHumidityHumidifierThresholdCharacteristic(): base( + uuid: "000000CA-0000-1000-8000-0026BB765291", + displayName: "Relative Humidity Humidifier Threshold", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs new file mode 100644 index 0000000..c777641 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class RemainingDurationCharacteristic: Characteristic + { + public RemainingDurationCharacteristic(): base( + uuid: "000000D4-0000-1000-8000-0026BB765291", + displayName: "Remaining Duration", + format: CharacteristicFormat.Uint32, + maxValue: 3600, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs new file mode 100644 index 0000000..3af7e6f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ResetFilterIndicationCharacteristic: Characteristic + { + public ResetFilterIndicationCharacteristic(): base( + uuid: "000000AD-0000-1000-8000-0026BB765291", + displayName: "Reset Filter Indication", + format: CharacteristicFormat.Uint8, + maxValue: 1, + minValue: 1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs new file mode 100644 index 0000000..016a3a0 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class RotationDirectionCharacteristic: Characteristic + { + // possible values: + public static int CLOCKWISE = 0; + public static int COUNTER_CLOCKWISE = 1; + + public RotationDirectionCharacteristic(): base( + uuid: "00000028-0000-1000-8000-0026BB765291", + displayName: "Rotation Direction", + format: CharacteristicFormat.Int, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs new file mode 100644 index 0000000..432d47c --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class RotationSpeedCharacteristic: Characteristic + { + public RotationSpeedCharacteristic(): base( + uuid: "00000029-0000-1000-8000-0026BB765291", + displayName: "Rotation Speed", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs new file mode 100644 index 0000000..5409de3 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SaturationCharacteristic: Characteristic + { + public SaturationCharacteristic(): base( + uuid: "0000002F-0000-1000-8000-0026BB765291", + displayName: "Saturation", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs new file mode 100644 index 0000000..1e49dc6 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SecuritySystemAlarmTypeCharacteristic: Characteristic + { + public SecuritySystemAlarmTypeCharacteristic(): base( + uuid: "0000008E-0000-1000-8000-0026BB765291", + displayName: "Security System Alarm Type", + format: CharacteristicFormat.Uint8, + maxValue: 1, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs new file mode 100644 index 0000000..24eaa72 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs @@ -0,0 +1,57 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SecuritySystemCurrentStateCharacteristic: Characteristic + { + // possible values: + public static int STAY_ARM = 0; + public static int AWAY_ARM = 1; + public static int NIGHT_ARM = 2; + public static int DISARMED = 3; + public static int ALARM_TRIGGERED = 4; + + public SecuritySystemCurrentStateCharacteristic(): base( + uuid: "00000066-0000-1000-8000-0026BB765291", + displayName: "Security System Current State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + 4, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs new file mode 100644 index 0000000..e28a08f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs @@ -0,0 +1,56 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SecuritySystemTargetStateCharacteristic: Characteristic + { + // possible values: + public static int STAY_ARM = 0; + public static int AWAY_ARM = 1; + public static int NIGHT_ARM = 2; + public static int DISARM = 3; + + public SecuritySystemTargetStateCharacteristic(): base( + uuid: "00000067-0000-1000-8000-0026BB765291", + displayName: "Security System Target State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs new file mode 100644 index 0000000..d0cd8fb --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SelectedRTPStreamConfigurationCharacteristic: Characteristic + { + public SelectedRTPStreamConfigurationCharacteristic(): base( + uuid: "00000117-0000-1000-8000-0026BB765291", + displayName: "Selected RTP Stream Configuration", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs index d7ffae9..625ffc8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -25,15 +25,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class SerialNumberCharacteristic : Characteristic + public class SerialNumberCharacteristic: Characteristic { - public SerialNumberCharacteristic() : base( - "00000030-0000-1000-8000-0026BB765291", - "Serial Number", - CharacteristicFormat.String, - new List() + public SerialNumberCharacteristic(): base( + uuid: "00000030-0000-1000-8000-0026BB765291", + displayName: "Serial Number", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead + CharacteristicPermission.PairedRead, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs new file mode 100644 index 0000000..949a388 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs @@ -0,0 +1,44 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ServiceLabelIndexCharacteristic: Characteristic + { + public ServiceLabelIndexCharacteristic(): base( + uuid: "000000CB-0000-1000-8000-0026BB765291", + displayName: "Service Label Index", + format: CharacteristicFormat.Uint8, + maxValue: 255, + minValue: 1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs new file mode 100644 index 0000000..9dd91af --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs @@ -0,0 +1,50 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ServiceLabelNamespaceCharacteristic: Characteristic + { + // possible values: + public static int DOTS = 0; + public static int ARABIC_NUMERALS = 1; + + public ServiceLabelNamespaceCharacteristic(): base( + uuid: "000000CD-0000-1000-8000-0026BB765291", + displayName: "Service Label Namespace", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs new file mode 100644 index 0000000..ad4fa4f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs @@ -0,0 +1,46 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SetDurationCharacteristic: Characteristic + { + public SetDurationCharacteristic(): base( + uuid: "000000D3-0000-1000-8000-0026BB765291", + displayName: "Set Duration", + format: CharacteristicFormat.Uint32, + maxValue: 3600, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs new file mode 100644 index 0000000..e41abdf --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SetupEndpointsCharacteristic: Characteristic + { + public SetupEndpointsCharacteristic(): base( + uuid: "00000118-0000-1000-8000-0026BB765291", + displayName: "Setup Endpoints", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs new file mode 100644 index 0000000..f953d11 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs @@ -0,0 +1,50 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SlatTypeCharacteristic: Characteristic + { + // possible values: + public static int HORIZONTAL = 0; + public static int VERTICAL = 1; + + public SlatTypeCharacteristic(): base( + uuid: "000000C0-0000-1000-8000-0026BB765291", + displayName: "Slat Type", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs new file mode 100644 index 0000000..fb178b8 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SmokeDetectedCharacteristic: Characteristic + { + // possible values: + public static int SMOKE_NOT_DETECTED = 0; + public static int SMOKE_DETECTED = 1; + + public SmokeDetectedCharacteristic(): base( + uuid: "00000076-0000-1000-8000-0026BB765291", + displayName: "Smoke Detected", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs new file mode 100644 index 0000000..fc86add --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StatusActiveCharacteristic: Characteristic + { + public StatusActiveCharacteristic(): base( + uuid: "00000075-0000-1000-8000-0026BB765291", + displayName: "Status Active", + format: CharacteristicFormat.Bool, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs new file mode 100644 index 0000000..4e09294 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StatusFaultCharacteristic: Characteristic + { + // possible values: + public static int NO_FAULT = 0; + public static int GENERAL_FAULT = 1; + + public StatusFaultCharacteristic(): base( + uuid: "00000077-0000-1000-8000-0026BB765291", + displayName: "Status Fault", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs new file mode 100644 index 0000000..59e2ca7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StatusJammedCharacteristic: Characteristic + { + // possible values: + public static int NOT_JAMMED = 0; + public static int JAMMED = 1; + + public StatusJammedCharacteristic(): base( + uuid: "00000078-0000-1000-8000-0026BB765291", + displayName: "Status Jammed", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs new file mode 100644 index 0000000..1372cc7 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StatusLowBatteryCharacteristic: Characteristic + { + // possible values: + public static int BATTERY_LEVEL_NORMAL = 0; + public static int BATTERY_LEVEL_LOW = 1; + + public StatusLowBatteryCharacteristic(): base( + uuid: "00000079-0000-1000-8000-0026BB765291", + displayName: "Status Low Battery", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs new file mode 100644 index 0000000..5b3274f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StatusTamperedCharacteristic: Characteristic + { + // possible values: + public static int NOT_TAMPERED = 0; + public static int TAMPERED = 1; + + public StatusTamperedCharacteristic(): base( + uuid: "0000007A-0000-1000-8000-0026BB765291", + displayName: "Status Tampered", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs new file mode 100644 index 0000000..43deec8 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs @@ -0,0 +1,42 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class StreamingStatusCharacteristic: Characteristic + { + public StreamingStatusCharacteristic(): base( + uuid: "00000120-0000-1000-8000-0026BB765291", + displayName: "Streaming Status", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs new file mode 100644 index 0000000..68d2702 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SulphurDioxideDensityCharacteristic: Characteristic + { + public SulphurDioxideDensityCharacteristic(): base( + uuid: "000000C5-0000-1000-8000-0026BB765291", + displayName: "Sulphur Dioxide Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs new file mode 100644 index 0000000..9b38e51 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SupportedAudioStreamConfigurationCharacteristic: Characteristic + { + public SupportedAudioStreamConfigurationCharacteristic(): base( + uuid: "00000115-0000-1000-8000-0026BB765291", + displayName: "Supported Audio Stream Configuration", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs new file mode 100644 index 0000000..ac37809 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SupportedRTPConfigurationCharacteristic: Characteristic + { + public SupportedRTPConfigurationCharacteristic(): base( + uuid: "00000116-0000-1000-8000-0026BB765291", + displayName: "Supported RTP Configuration", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs new file mode 100644 index 0000000..2a63efe --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs @@ -0,0 +1,41 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SupportedVideoStreamConfigurationCharacteristic: Characteristic + { + public SupportedVideoStreamConfigurationCharacteristic(): base( + uuid: "00000114-0000-1000-8000-0026BB765291", + displayName: "Supported Video Stream Configuration", + format: CharacteristicFormat.Tlv8, + permissions: new List + { + CharacteristicPermission.PairedRead, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs new file mode 100644 index 0000000..133c6f3 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class SwingModeCharacteristic: Characteristic + { + // possible values: + public static int SWING_DISABLED = 0; + public static int SWING_ENABLED = 1; + + public SwingModeCharacteristic(): base( + uuid: "000000B6-0000-1000-8000-0026BB765291", + displayName: "Swing Mode", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs new file mode 100644 index 0000000..83c6802 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetAirPurifierStateCharacteristic: Characteristic + { + // possible values: + public static int MANUAL = 0; + public static int AUTO = 1; + + public TargetAirPurifierStateCharacteristic(): base( + uuid: "000000A8-0000-1000-8000-0026BB765291", + displayName: "Target Air Purifier State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs new file mode 100644 index 0000000..ec01daf --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs @@ -0,0 +1,54 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetAirQualityCharacteristic: Characteristic + { + // possible values: + public static int EXCELLENT = 0; + public static int GOOD = 1; + public static int FAIR = 2; + + public TargetAirQualityCharacteristic(): base( + uuid: "000000AE-0000-1000-8000-0026BB765291", + displayName: "Target Air Quality", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs new file mode 100644 index 0000000..7758373 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetDoorStateCharacteristic: Characteristic + { + // possible values: + public static int OPEN = 0; + public static int CLOSED = 1; + + public TargetDoorStateCharacteristic(): base( + uuid: "00000032-0000-1000-8000-0026BB765291", + displayName: "Target Door State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs new file mode 100644 index 0000000..24f0552 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetFanStateCharacteristic: Characteristic + { + // possible values: + public static int MANUAL = 0; + public static int AUTO = 1; + + public TargetFanStateCharacteristic(): base( + uuid: "000000BF-0000-1000-8000-0026BB765291", + displayName: "Target Fan State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs new file mode 100644 index 0000000..f25fce6 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs @@ -0,0 +1,54 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetHeaterCoolerStateCharacteristic: Characteristic + { + // possible values: + public static int AUTO = 0; + public static int HEAT = 1; + public static int COOL = 2; + + public TargetHeaterCoolerStateCharacteristic(): base( + uuid: "000000B2-0000-1000-8000-0026BB765291", + displayName: "Target Heater Cooler State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs new file mode 100644 index 0000000..a51ffb3 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs @@ -0,0 +1,56 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetHeatingCoolingStateCharacteristic: Characteristic + { + // possible values: + public static int OFF = 0; + public static int HEAT = 1; + public static int COOL = 2; + public static int AUTO = 3; + + public TargetHeatingCoolingStateCharacteristic(): base( + uuid: "00000033-0000-1000-8000-0026BB765291", + displayName: "Target Heating Cooling State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs new file mode 100644 index 0000000..8d28817 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetHorizontalTiltAngleCharacteristic: Characteristic + { + public TargetHorizontalTiltAngleCharacteristic(): base( + uuid: "0000007B-0000-1000-8000-0026BB765291", + displayName: "Target Horizontal Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs new file mode 100644 index 0000000..afcad3b --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs @@ -0,0 +1,54 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetHumidifierDehumidifierStateCharacteristic: Characteristic + { + // possible values: + public static int HUMIDIFIER_OR_DEHUMIDIFIER = 0; + public static int HUMIDIFIER = 1; + public static int DEHUMIDIFIER = 2; + + public TargetHumidifierDehumidifierStateCharacteristic(): base( + uuid: "000000B4-0000-1000-8000-0026BB765291", + displayName: "Target Humidifier Dehumidifier State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs new file mode 100644 index 0000000..5048f93 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetPositionCharacteristic: Characteristic + { + public TargetPositionCharacteristic(): base( + uuid: "0000007C-0000-1000-8000-0026BB765291", + displayName: "Target Position", + format: CharacteristicFormat.Uint8, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs new file mode 100644 index 0000000..cfc0257 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetRelativeHumidityCharacteristic: Characteristic + { + public TargetRelativeHumidityCharacteristic(): base( + uuid: "00000034-0000-1000-8000-0026BB765291", + displayName: "Target Relative Humidity", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs new file mode 100644 index 0000000..c7088e9 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetSlatStateCharacteristic: Characteristic + { + // possible values: + public static int MANUAL = 0; + public static int AUTO = 1; + + public TargetSlatStateCharacteristic(): base( + uuid: "000000BE-0000-1000-8000-0026BB765291", + displayName: "Target Slat State", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs new file mode 100644 index 0000000..456e3cc --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetTemperatureCharacteristic: Characteristic + { + public TargetTemperatureCharacteristic(): base( + uuid: "00000035-0000-1000-8000-0026BB765291", + displayName: "Target Temperature", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Celsius, + maxValue: 38, + minValue: 10, + minStep: 0.1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs new file mode 100644 index 0000000..efd6580 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetTiltAngleCharacteristic: Characteristic + { + public TargetTiltAngleCharacteristic(): base( + uuid: "000000C2-0000-1000-8000-0026BB765291", + displayName: "Target Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs new file mode 100644 index 0000000..2f1b4c0 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TargetVerticalTiltAngleCharacteristic: Characteristic + { + public TargetVerticalTiltAngleCharacteristic(): base( + uuid: "0000007D-0000-1000-8000-0026BB765291", + displayName: "Target Vertical Tilt Angle", + format: CharacteristicFormat.Int, + unit: CharacteristicUnit.ArcDegree, + maxValue: 90, + minValue: -1, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs new file mode 100644 index 0000000..40b6b67 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs @@ -0,0 +1,52 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class TemperatureDisplayUnitsCharacteristic: Characteristic + { + // possible values: + public static int CELSIUS = 0; + public static int FAHRENHEIT = 1; + + public TemperatureDisplayUnitsCharacteristic(): base( + uuid: "00000036-0000-1000-8000-0026BB765291", + displayName: "Temperature Display Units", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs new file mode 100644 index 0000000..9e54f7f --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class VOCDensityCharacteristic: Characteristic + { + public VOCDensityCharacteristic(): base( + uuid: "000000C8-0000-1000-8000-0026BB765291", + displayName: "VOC Density", + format: CharacteristicFormat.Float, + maxValue: 1000, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs new file mode 100644 index 0000000..c90a6c4 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs @@ -0,0 +1,55 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class ValveTypeCharacteristic: Characteristic + { + // possible values: + public static int GENERIC_VALVE = 0; + public static int IRRIGATION = 1; + public static int SHOWER_HEAD = 2; + public static int WATER_FAUCET = 3; + + public ValveTypeCharacteristic(): base( + uuid: "000000D5-0000-1000-8000-0026BB765291", + displayName: "Valve Type", + format: CharacteristicFormat.Uint8, + validValues: new List + { + 0, + 1, + 2, + 3, + }, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs index dabe672..ffbbaa2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs @@ -1,18 +1,40 @@ -using System; +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + using System.Collections.Generic; -using System.Text; namespace Homer.Platform.HomeKit.Characteristics.Definitions { - public class VersionCharacteristic:Characteristic + public class VersionCharacteristic: Characteristic { - public VersionCharacteristic() : base( - "00000037-0000-1000-8000-0026BB76529", - "Version", - CharacteristicFormat.String, - new List() + public VersionCharacteristic(): base( + uuid: "00000037-0000-1000-8000-0026BB765291", + displayName: "Version", + format: CharacteristicFormat.String, + permissions: new List { - CharacteristicPermission.PairedRead + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, }) { } diff --git a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs new file mode 100644 index 0000000..4d6d123 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class VolumeCharacteristic: Characteristic + { + public VolumeCharacteristic(): base( + uuid: "00000119-0000-1000-8000-0026BB765291", + displayName: "Volume", + format: CharacteristicFormat.Uint8, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + minStep: 1, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.PairedWrite, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs new file mode 100644 index 0000000..57bdfa9 --- /dev/null +++ b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class WaterLevelCharacteristic: Characteristic + { + public WaterLevelCharacteristic(): base( + uuid: "000000B5-0000-1000-8000-0026BB765291", + displayName: "Water Level", + format: CharacteristicFormat.Float, + unit: CharacteristicUnit.Percentage, + maxValue: 100, + minValue: 0, + permissions: new List + { + CharacteristicPermission.PairedRead, + CharacteristicPermission.Events, + }) + { + } + } +} diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index d9fef02..805fe44 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -31,4 +31,8 @@ + + + + diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index 03e0eda..f6d4367 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -31,7 +31,7 @@ public AccessoryInformationService() : base("0000003E-0000-1000-8000-0026BB765291", "Accessory Information") { // required characteristics. - AddCharacteristic(typeof(IdentityCharacteristic)) + AddCharacteristic(typeof(IdentifyCharacteristic)) .AddCharacteristic(typeof(ManufacturerCharacteristic)) .AddCharacteristic(typeof(ModelCharacteristic)) .AddCharacteristic(typeof(NameCharacteristic)) From bf0cfe57935ebad179385ef654852add5ba03d33 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Sun, 9 Feb 2020 06:17:52 +0300 Subject: [PATCH 059/152] updated import.js - cs files are now generated using nunjucks template. --- contrib/importer/characteristic.html | 63 + contrib/importer/import.js | 107 +- contrib/importer/package-lock.json | 1912 ++++++++++++++++- contrib/importer/package.json | 1 + .../AccessoryFlagsCharacteristic.cs | 11 +- .../Definitions/ActiveCharacteristic.cs | 16 +- .../AdministratorOnlyAccessCharacteristic.cs | 11 +- .../AirParticulateDensityCharacteristic.cs | 8 +- .../AirParticulateSizeCharacteristic.cs | 16 +- .../Definitions/AirQualityCharacteristic.cs | 20 +- .../AudioFeedbackCharacteristic.cs | 11 +- .../Definitions/BatteryLevelCharacteristic.cs | 7 +- .../Definitions/BrightnessCharacteristic.cs | 7 +- .../CarbonDioxideDetectedCharacteristic.cs | 16 +- .../CarbonDioxideLevelCharacteristic.cs | 9 +- .../CarbonDioxidePeakLevelCharacteristic.cs | 9 +- .../CarbonMonoxideDetectedCharacteristic.cs | 16 +- .../CarbonMonoxideLevelCharacteristic.cs | 9 +- .../CarbonMonoxidePeakLevelCharacteristic.cs | 9 +- .../ChargingStateCharacteristic.cs | 17 +- .../ColorTemperatureCharacteristic.cs | 8 +- .../ContactSensorStateCharacteristic.cs | 16 +- ...olingThresholdTemperatureCharacteristic.cs | 7 +- .../CurrentAirPurifierStateCharacteristic.cs | 17 +- .../CurrentAmbientLightLevelCharacteristic.cs | 8 +- .../CurrentDoorStateCharacteristic.cs | 19 +- .../CurrentFanStateCharacteristic.cs | 17 +- .../CurrentHeaterCoolerStateCharacteristic.cs | 18 +- ...urrentHeatingCoolingStateCharacteristic.cs | 17 +- ...urrentHorizontalTiltAngleCharacteristic.cs | 7 +- ...midifierDehumidifierStateCharacteristic.cs | 18 +- .../CurrentPositionCharacteristic.cs | 7 +- .../CurrentRelativeHumidityCharacteristic.cs | 7 +- .../CurrentSlatStateCharacteristic.cs | 17 +- .../CurrentTemperatureCharacteristic.cs | 7 +- .../CurrentTiltAngleCharacteristic.cs | 7 +- .../CurrentVerticalTiltAngleCharacteristic.cs | 7 +- .../Definitions/DigitalZoomCharacteristic.cs | 11 +- .../FilterChangeIndicationCharacteristic.cs | 16 +- .../FilterLifeLevelCharacteristic.cs | 9 +- .../FirmwareRevisionCharacteristic.cs | 10 +- .../HardwareRevisionCharacteristic.cs | 10 +- ...atingThresholdTemperatureCharacteristic.cs | 7 +- .../Definitions/HoldPositionCharacteristic.cs | 10 +- .../Definitions/HueCharacteristic.cs | 7 +- .../Definitions/IdentifyCharacteristic.cs | 10 +- .../ImageMirroringCharacteristic.cs | 11 +- .../ImageRotationCharacteristic.cs | 7 +- .../Definitions/InUseCharacteristic.cs | 16 +- .../Definitions/IsConfiguredCharacteristic.cs | 16 +- .../Definitions/LeakDetectedCharacteristic.cs | 16 +- .../LockControlPointCharacteristic.cs | 10 +- .../LockCurrentStateCharacteristic.cs | 18 +- .../LockLastKnownActionCharacteristic.cs | 23 +- ...gementAutoSecurityTimeoutCharacteristic.cs | 10 +- .../LockPhysicalControlsCharacteristic.cs | 16 +- .../LockTargetStateCharacteristic.cs | 16 +- .../Definitions/LogsCharacteristic.cs | 11 +- .../Definitions/ManufacturerCharacteristic.cs | 10 +- .../Definitions/ModelCharacteristic.cs | 10 +- .../MotionDetectedCharacteristic.cs | 11 +- .../Definitions/MuteCharacteristic.cs | 11 +- .../Definitions/NameCharacteristic.cs | 10 +- .../Definitions/NightVisionCharacteristic.cs | 11 +- .../NitrogenDioxideDensityCharacteristic.cs | 8 +- .../ObstructionDetectedCharacteristic.cs | 11 +- .../OccupancyDetectedCharacteristic.cs | 16 +- .../Definitions/OnCharacteristic.cs | 11 +- .../Definitions/OpticalZoomCharacteristic.cs | 11 +- .../Definitions/OutletInUseCharacteristic.cs | 11 +- .../Definitions/OzoneDensityCharacteristic.cs | 8 +- .../Definitions/PM10DensityCharacteristic.cs | 8 +- .../Definitions/PM2_5DensityCharacteristic.cs | 8 +- .../Definitions/PairSetupCharacteristic.cs | 10 +- .../Definitions/PairVerifyCharacteristic.cs | 10 +- .../PairingFeaturesCharacteristic.cs | 10 +- .../PairingPairingsCharacteristic.cs | 10 +- .../PositionStateCharacteristic.cs | 17 +- .../Definitions/ProgramModeCharacteristic.cs | 17 +- .../ProgrammableSwitchEventCharacteristic.cs | 17 +- ...dityDehumidifierThresholdCharacteristic.cs | 7 +- ...midityHumidifierThresholdCharacteristic.cs | 7 +- .../RemainingDurationCharacteristic.cs | 8 +- .../ResetFilterIndicationCharacteristic.cs | 7 +- .../RotationDirectionCharacteristic.cs | 16 +- .../RotationSpeedCharacteristic.cs | 7 +- .../Definitions/SaturationCharacteristic.cs | 7 +- .../SecuritySystemAlarmTypeCharacteristic.cs | 8 +- ...ecuritySystemCurrentStateCharacteristic.cs | 19 +- ...SecuritySystemTargetStateCharacteristic.cs | 18 +- ...tedRTPStreamConfigurationCharacteristic.cs | 10 +- .../Definitions/SerialNumberCharacteristic.cs | 10 +- .../ServiceLabelIndexCharacteristic.cs | 7 +- .../ServiceLabelNamespaceCharacteristic.cs | 15 +- .../Definitions/SetDurationCharacteristic.cs | 8 +- .../SetupEndpointsCharacteristic.cs | 10 +- .../Definitions/SlatTypeCharacteristic.cs | 15 +- .../SmokeDetectedCharacteristic.cs | 16 +- .../Definitions/StatusActiveCharacteristic.cs | 11 +- .../Definitions/StatusFaultCharacteristic.cs | 16 +- .../Definitions/StatusJammedCharacteristic.cs | 16 +- .../StatusLowBatteryCharacteristic.cs | 16 +- .../StatusTamperedCharacteristic.cs | 16 +- .../StreamingStatusCharacteristic.cs | 11 +- .../SulphurDioxideDensityCharacteristic.cs | 8 +- ...dAudioStreamConfigurationCharacteristic.cs | 10 +- ...SupportedRTPConfigurationCharacteristic.cs | 10 +- ...dVideoStreamConfigurationCharacteristic.cs | 10 +- .../Definitions/SwingModeCharacteristic.cs | 16 +- .../TargetAirPurifierStateCharacteristic.cs | 16 +- .../TargetAirQualityCharacteristic.cs | 17 +- .../TargetDoorStateCharacteristic.cs | 16 +- .../TargetFanStateCharacteristic.cs | 16 +- .../TargetHeaterCoolerStateCharacteristic.cs | 17 +- ...TargetHeatingCoolingStateCharacteristic.cs | 18 +- ...TargetHorizontalTiltAngleCharacteristic.cs | 7 +- ...midifierDehumidifierStateCharacteristic.cs | 17 +- .../TargetPositionCharacteristic.cs | 7 +- .../TargetRelativeHumidityCharacteristic.cs | 7 +- .../TargetSlatStateCharacteristic.cs | 16 +- .../TargetTemperatureCharacteristic.cs | 7 +- .../TargetTiltAngleCharacteristic.cs | 7 +- .../TargetVerticalTiltAngleCharacteristic.cs | 7 +- .../TemperatureDisplayUnitsCharacteristic.cs | 16 +- .../Definitions/VOCDensityCharacteristic.cs | 8 +- .../Definitions/ValveTypeCharacteristic.cs | 18 +- .../Definitions/VersionCharacteristic.cs | 11 +- .../Definitions/VolumeCharacteristic.cs | 7 +- .../Definitions/WaterLevelCharacteristic.cs | 8 +- 129 files changed, 2993 insertions(+), 570 deletions(-) create mode 100644 contrib/importer/characteristic.html diff --git a/contrib/importer/characteristic.html b/contrib/importer/characteristic.html new file mode 100644 index 0000000..8bd4720 --- /dev/null +++ b/contrib/importer/characteristic.html @@ -0,0 +1,63 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using System.Collections.Generic; + +namespace Homer.Platform.HomeKit.Characteristics.Definitions +{ + public class {{classyName}}Characteristic: Characteristic + { + {% if characteristic.Constraints and characteristic.Constraints.ValidValues -%} + {% for key,value in characteristic.Constraints.ValidValues -%} + {%- set name = value.toUpperCase().replace(r/[^\w]+/g, '_') -%} + {% if r/^[1-9]/.test(name) -%}{%- set name = '_' + name -%}{%- endif %} + public static int {{ name }} = {{ key }}; + {%- endfor %} + {%- endif %} + + public {{classyName}}Characteristic(): base( + uuid: "{{characteristic.UUID}}", + displayName: "{{characteristic.Name}}", + format: CharacteristicFormat.{{getCharacteristicFormat(characteristic.Format)}}, + {% if characteristic.Unit -%}unit: CharacteristicUnit.{{getCharacteristicUnit(characteristic.Unit)}},{%- endif %} + {% if gotMaximumValue(characteristic) -%}maxValue: {{characteristic.Constraints.MaximumValue}},{%- endif %} + {% if gotMinimumValue(characteristic) -%}minValue: {{characteristic.Constraints.MinimumValue}},{%- endif %} + {% if gotStepValue(characteristic) -%}minStep: {{characteristic.Constraints.StepValue}},{%- endif %} + {% if characteristic.Constraints and characteristic.Constraints.ValidValues -%} + validValues: new List { + {%- for key,value in characteristic.Constraints.ValidValues -%} + {{ key }}, + {%- endfor -%} + }, + {%- endif %} + permissions: new List + { + {% for value in characteristic.Properties %} + {%- set perm = getCharacteristicPermsKey(value) -%} + {% if perm %}CharacteristicPermission.{{perm}},{% endif %} + {% endfor %} + }) + { + } + } +} \ No newline at end of file diff --git a/contrib/importer/import.js b/contrib/importer/import.js index b3bca11..1397e23 100644 --- a/contrib/importer/import.js +++ b/contrib/importer/import.js @@ -4,6 +4,7 @@ const fs = require('fs'); const path = require('path'); +const nunjucks = require('nunjucks'); const plist = require('simple-plist'); var plistPath = './data/default.metadata.plist'; @@ -21,86 +22,20 @@ for (var index in metadata.Characteristics) { var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); var output = fs.createWriteStream(outputPath); - output.write(`#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion\n\n`); - -output.write(`using System.Collections.Generic;\n\n`); -output.write(`namespace Homer.Platform.HomeKit.Characteristics.Definitions\n{\n`); - output.write(` public class ${classyName}Characteristic: Characteristic\n {\n`); - - if (characteristic.Constraints && characteristic.Constraints.ValidValues) { - // this characteristic can only have one of a defined set of values (like an enum). Define the values as static members of our subclass. - output.write(` // possible values:\n`); - - for (var value in characteristic.Constraints.ValidValues) { - var name = characteristic.Constraints.ValidValues[value]; - - var constName = name.toUpperCase().replace(/[^\w]+/g, '_'); - if ((/^[1-9]/).test(constName)) constName = "_" + constName; // variables can't start with a number - - output.write(` public static int ${constName} = ${value};\n`); - } - output.write('\n'); - } - - output.write(` public ${classyName}Characteristic(): base(\n`); - output.write(` uuid: "${characteristic.UUID}",\n`); - output.write(` displayName: "${characteristic.Name}",\n`); - - output.write(` format: CharacteristicFormat.${getCharacteristicFormat(characteristic.Format)},\n`); - - if (characteristic.Unit) - output.write(` unit: CharacteristicUnit.${getCharacteristicUnit(characteristic.Unit)},\n`); - - // apply any basic constraints if present - if (characteristic.Constraints && typeof characteristic.Constraints.MaximumValue !== 'undefined') - output.write(` maxValue: ${characteristic.Constraints.MaximumValue},\n`); - - if (characteristic.Constraints && typeof characteristic.Constraints.MinimumValue !== 'undefined') - output.write(` minValue: ${characteristic.Constraints.MinimumValue},\n`); - - if (characteristic.Constraints && typeof characteristic.Constraints.StepValue !== 'undefined') - output.write(` minStep: ${characteristic.Constraints.StepValue},\n`); - - if (characteristic.Constraints && characteristic.Constraints.ValidValues) { - output.write(` validValues: new List\n {\n`); - for (var value in characteristic.Constraints.ValidValues) { - output.write(` ${value},\n`); - } - output.write(` },\n`); - } - - output.write(` permissions: new List\n {\n`); - for (var i in characteristic.Properties) { - var perms = getCharacteristicPermsKey(characteristic.Properties[i]); - if (perms) { - output.write(` CharacteristicPermission.${getCharacteristicPermsKey(characteristic.Properties[i])},\n`); - } - } - output.write(` })\n`); - - output.write(` {\n }\n }\n}\n`); - output.end() + var res = nunjucks.render('characteristic.html', { + classyName: classyName, + characteristic: characteristic, + capitalize: capitalize, + getCharacteristicUnit: getCharacteristicUnit, + getCharacteristicFormat: getCharacteristicFormat, + getCharacteristicPermsKey: getCharacteristicPermsKey, + gotMaximumValue: gotMaximumValue, + gotMinimumValue: gotMinimumValue, + gotStepValue: gotStepValue, + }); + + output.write(res); + output.end(); } function capitalize(s) { @@ -108,6 +43,18 @@ function capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1) } +function gotMaximumValue(characteristic) { + return characteristic.Constraints && typeof characteristic.Constraints.MaximumValue !== 'undefined'; +} + +function gotMinimumValue(characteristic) { + return characteristic.Constraints && typeof characteristic.Constraints.MinimumValue !== 'undefined'; +} + +function gotStepValue(characteristic) { + return characteristic.Constraints && typeof characteristic.Constraints.StepValue !== 'undefined' +} + function getCharacteristicUnit(unit) { unit = capitalize(unit); if (unit == 'Arcdegrees') unit = 'ArcDegree' diff --git a/contrib/importer/package-lock.json b/contrib/importer/package-lock.json index 9fb2c71..455d362 100644 --- a/contrib/importer/package-lock.json +++ b/contrib/importer/package-lock.json @@ -4,10 +4,138 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "optional": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "optional": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "optional": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "optional": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "optional": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "optional": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "optional": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } }, "base64-js": { "version": "1.3.1", @@ -19,6 +147,21 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bplist-creator": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", @@ -35,20 +178,1283 @@ "big-integer": "^1.6.44" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "optional": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "optional": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "optional": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "optional": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "optional": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "optional": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "optional": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "optional": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "optional": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "optional": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "optional": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "optional": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "optional": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "optional": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "optional": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "optional": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "optional": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "optional": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "optional": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.0.tgz", + "integrity": "sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^2.0.0", + "yargs": "^3.32.0" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "optional": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "optional": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "optional": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "optional": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true }, "plist": { "version": "3.0.1", @@ -60,6 +1466,122 @@ "xmldom": "0.1.x" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "optional": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "optional": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "optional": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "optional": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "optional": true, + "requires": { + "ret": "~0.1.10" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "simple-plist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", @@ -70,18 +1592,166 @@ "plist": "^3.0.1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "optional": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "optional": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "optional": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "optional": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "optional": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "optional": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "optional": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, "stream-buffers": { @@ -89,22 +1759,164 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" }, - "ts-node": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", - "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "optional": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "optional": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "optional": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "optional": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "optional": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "optional": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "optional": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "optional": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } }, "xmlbuilder": { "version": "9.0.7", @@ -116,10 +1928,24 @@ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } } } } diff --git a/contrib/importer/package.json b/contrib/importer/package.json index 958a099..7ee47af 100644 --- a/contrib/importer/package.json +++ b/contrib/importer/package.json @@ -20,6 +20,7 @@ }, "homepage": "https://github.com/bonesoul/homer#readme", "dependencies": { + "nunjucks": "^3.2.0", "simple-plist": "^1.1.0" } } diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index 1db3584..6fe1bfb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AccessoryFlagsCharacteristic: Characteristic { + + public AccessoryFlagsCharacteristic(): base( uuid: "000000A6-0000-1000-8000-0026BB765291", displayName: "Accessory Flags", format: CharacteristicFormat.Uint32, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs index ea7f44f..8a857f7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ActiveCharacteristic: Characteristic { - // possible values: + public static int INACTIVE = 0; public static int ACTIVE = 1; @@ -35,18 +35,20 @@ public ActiveCharacteristic(): base( uuid: "000000B0-0000-1000-8000-0026BB765291", displayName: "Active", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs index 6ffe19f..9c152c6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AdministratorOnlyAccessCharacteristic: Characteristic { + + public AdministratorOnlyAccessCharacteristic(): base( uuid: "00000001-0000-1000-8000-0026BB765291", displayName: "Administrator Only Access", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs index bf95f7c..ed58713 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirParticulateDensityCharacteristic: Characteristic { + + public AirParticulateDensityCharacteristic(): base( uuid: "00000064-0000-1000-8000-0026BB765291", displayName: "Air Particulate Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs index dd8056a..6634a95 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirParticulateSizeCharacteristic: Characteristic { - // possible values: + public static int _2_5_M = 0; public static int _10_M = 1; @@ -35,17 +35,19 @@ public AirParticulateSizeCharacteristic(): base( uuid: "00000065-0000-1000-8000-0026BB765291", displayName: "Air Particulate Size", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs index c2f0c86..8e1c661 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirQualityCharacteristic: Characteristic { - // possible values: + public static int UNKNOWN = 0; public static int EXCELLENT = 1; public static int GOOD = 2; @@ -39,21 +39,19 @@ public AirQualityCharacteristic(): base( uuid: "00000095-0000-1000-8000-0026BB765291", displayName: "Air Quality", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - 4, - 5, - }, + + + + + validValues: new List {0,1,2,3,4,5,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs index 3818115..23aabea 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AudioFeedbackCharacteristic: Characteristic { + + public AudioFeedbackCharacteristic(): base( uuid: "00000005-0000-1000-8000-0026BB765291", displayName: "Audio Feedback", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs index 2a9bb35..a0aef93 100644 --- a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class BatteryLevelCharacteristic: Characteristic { + + public BatteryLevelCharacteristic(): base( uuid: "00000068-0000-1000-8000-0026BB765291", displayName: "Battery Level", @@ -35,12 +37,15 @@ public BatteryLevelCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs index 215a575..ce5edd9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class BrightnessCharacteristic: Characteristic { + + public BrightnessCharacteristic(): base( uuid: "00000008-0000-1000-8000-0026BB765291", displayName: "Brightness", @@ -35,13 +37,16 @@ public BrightnessCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs index 40c9fcb..58fe217 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxideDetectedCharacteristic: Characteristic { - // possible values: + public static int CO2_LEVELS_NORMAL = 0; public static int CO2_LEVELS_ABNORMAL = 1; @@ -35,17 +35,19 @@ public CarbonDioxideDetectedCharacteristic(): base( uuid: "00000092-0000-1000-8000-0026BB765291", displayName: "Carbon Dioxide Detected", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs index a5d29b7..24850d4 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs @@ -27,18 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxideLevelCharacteristic: Characteristic { + + public CarbonDioxideLevelCharacteristic(): base( uuid: "00000093-0000-1000-8000-0026BB765291", displayName: "Carbon Dioxide Level", format: CharacteristicFormat.Float, + maxValue: 100000, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs index 033f43a..9d2da2e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs @@ -27,18 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxidePeakLevelCharacteristic: Characteristic { + + public CarbonDioxidePeakLevelCharacteristic(): base( uuid: "00000094-0000-1000-8000-0026BB765291", displayName: "Carbon Dioxide Peak Level", format: CharacteristicFormat.Float, + maxValue: 100000, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs index 04e3f09..f6828fc 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxideDetectedCharacteristic: Characteristic { - // possible values: + public static int CO_LEVELS_NORMAL = 0; public static int CO_LEVELS_ABNORMAL = 1; @@ -35,17 +35,19 @@ public CarbonMonoxideDetectedCharacteristic(): base( uuid: "00000069-0000-1000-8000-0026BB765291", displayName: "Carbon Monoxide Detected", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs index 01853eb..de92e16 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs @@ -27,18 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxideLevelCharacteristic: Characteristic { + + public CarbonMonoxideLevelCharacteristic(): base( uuid: "00000090-0000-1000-8000-0026BB765291", displayName: "Carbon Monoxide Level", format: CharacteristicFormat.Float, + maxValue: 100, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs index e48b4b9..6a54043 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs @@ -27,18 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxidePeakLevelCharacteristic: Characteristic { + + public CarbonMonoxidePeakLevelCharacteristic(): base( uuid: "00000091-0000-1000-8000-0026BB765291", displayName: "Carbon Monoxide Peak Level", format: CharacteristicFormat.Float, + maxValue: 100, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs index 89a185d..1ec780e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ChargingStateCharacteristic: Characteristic { - // possible values: + public static int NOT_CHARGING = 0; public static int CHARGING = 1; public static int NOT_CHARGEABLE = 2; @@ -36,18 +36,19 @@ public ChargingStateCharacteristic(): base( uuid: "0000008F-0000-1000-8000-0026BB765291", displayName: "Charging State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs index 7bdac05..b6e208b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs @@ -27,20 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ColorTemperatureCharacteristic: Characteristic { + + public ColorTemperatureCharacteristic(): base( uuid: "000000CE-0000-1000-8000-0026BB765291", displayName: "Color Temperature", format: CharacteristicFormat.Uint32, + maxValue: 500, minValue: 140, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs index ff618c3..2594bfe 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ContactSensorStateCharacteristic: Characteristic { - // possible values: + public static int CONTACT_DETECTED = 0; public static int CONTACT_NOT_DETECTED = 1; @@ -35,17 +35,19 @@ public ContactSensorStateCharacteristic(): base( uuid: "0000006A-0000-1000-8000-0026BB765291", displayName: "Contact Sensor State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs index c1fa960..7c1a53a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CoolingThresholdTemperatureCharacteristic: Characteristic { + + public CoolingThresholdTemperatureCharacteristic(): base( uuid: "0000000D-0000-1000-8000-0026BB765291", displayName: "Cooling Threshold Temperature", @@ -35,13 +37,16 @@ public CoolingThresholdTemperatureCharacteristic(): base( maxValue: 35, minValue: 10, minStep: 0.1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs index 0484e55..1ea5776 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentAirPurifierStateCharacteristic: Characteristic { - // possible values: + public static int INACTIVE = 0; public static int IDLE = 1; public static int PURIFYING_AIR = 2; @@ -36,18 +36,19 @@ public CurrentAirPurifierStateCharacteristic(): base( uuid: "000000A9-0000-1000-8000-0026BB765291", displayName: "Current Air Purifier State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs index 5250f66..eace0a1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentAmbientLightLevelCharacteristic: Characteristic { + + public CurrentAmbientLightLevelCharacteristic(): base( uuid: "0000006B-0000-1000-8000-0026BB765291", displayName: "Current Ambient Light Level", @@ -34,12 +36,16 @@ public CurrentAmbientLightLevelCharacteristic(): base( unit: CharacteristicUnit.Lux, maxValue: 100000, minValue: 0.0001, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs index 8e80feb..25d876d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentDoorStateCharacteristic: Characteristic { - // possible values: + public static int OPEN = 0; public static int CLOSED = 1; public static int OPENING = 2; @@ -38,20 +38,19 @@ public CurrentDoorStateCharacteristic(): base( uuid: "0000000E-0000-1000-8000-0026BB765291", displayName: "Current Door State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - 4, - }, + + + + + validValues: new List {0,1,2,3,4,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs index 8f68a07..e7f5a75 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentFanStateCharacteristic: Characteristic { - // possible values: + public static int INACTIVE = 0; public static int IDLE = 1; public static int BLOWING_AIR = 2; @@ -36,18 +36,19 @@ public CurrentFanStateCharacteristic(): base( uuid: "000000AF-0000-1000-8000-0026BB765291", displayName: "Current Fan State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs index 98ff540..bf904f3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHeaterCoolerStateCharacteristic: Characteristic { - // possible values: + public static int INACTIVE = 0; public static int IDLE = 1; public static int HEATING = 2; @@ -37,19 +37,19 @@ public CurrentHeaterCoolerStateCharacteristic(): base( uuid: "000000B1-0000-1000-8000-0026BB765291", displayName: "Current Heater Cooler State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs index 7846a94..939f20e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHeatingCoolingStateCharacteristic: Characteristic { - // possible values: + public static int OFF = 0; public static int HEAT = 1; public static int COOL = 2; @@ -36,18 +36,19 @@ public CurrentHeatingCoolingStateCharacteristic(): base( uuid: "0000000F-0000-1000-8000-0026BB765291", displayName: "Current Heating Cooling State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs index 7e4fc63..3d07852 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHorizontalTiltAngleCharacteristic: Characteristic { + + public CurrentHorizontalTiltAngleCharacteristic(): base( uuid: "0000006C-0000-1000-8000-0026BB765291", displayName: "Current Horizontal Tilt Angle", @@ -35,12 +37,15 @@ public CurrentHorizontalTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs index 66baa13..f942493 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHumidifierDehumidifierStateCharacteristic: Characteristic { - // possible values: + public static int INACTIVE = 0; public static int IDLE = 1; public static int HUMIDIFYING = 2; @@ -37,19 +37,19 @@ public CurrentHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B3-0000-1000-8000-0026BB765291", displayName: "Current Humidifier Dehumidifier State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs index 740f680..d596a23 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentPositionCharacteristic: Characteristic { + + public CurrentPositionCharacteristic(): base( uuid: "0000006D-0000-1000-8000-0026BB765291", displayName: "Current Position", @@ -35,12 +37,15 @@ public CurrentPositionCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs index fead743..7202c93 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentRelativeHumidityCharacteristic: Characteristic { + + public CurrentRelativeHumidityCharacteristic(): base( uuid: "00000010-0000-1000-8000-0026BB765291", displayName: "Current Relative Humidity", @@ -35,12 +37,15 @@ public CurrentRelativeHumidityCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs index 97ee1d7..eee4b05 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentSlatStateCharacteristic: Characteristic { - // possible values: + public static int FIXED = 0; public static int JAMMED = 1; public static int SWINGING = 2; @@ -36,18 +36,19 @@ public CurrentSlatStateCharacteristic(): base( uuid: "000000AA-0000-1000-8000-0026BB765291", displayName: "Current Slat State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs index 998bc85..ce2573f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentTemperatureCharacteristic: Characteristic { + + public CurrentTemperatureCharacteristic(): base( uuid: "00000011-0000-1000-8000-0026BB765291", displayName: "Current Temperature", @@ -35,12 +37,15 @@ public CurrentTemperatureCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 0.1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs index 796b557..529475e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentTiltAngleCharacteristic: Characteristic { + + public CurrentTiltAngleCharacteristic(): base( uuid: "000000C1-0000-1000-8000-0026BB765291", displayName: "Current Tilt Angle", @@ -35,12 +37,15 @@ public CurrentTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs index 78d39b3..4447136 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentVerticalTiltAngleCharacteristic: Characteristic { + + public CurrentVerticalTiltAngleCharacteristic(): base( uuid: "0000006E-0000-1000-8000-0026BB765291", displayName: "Current Vertical Tilt Angle", @@ -35,12 +37,15 @@ public CurrentVerticalTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs index 35a4c2c..f383800 100644 --- a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class DigitalZoomCharacteristic: Characteristic { + + public DigitalZoomCharacteristic(): base( uuid: "0000011D-0000-1000-8000-0026BB765291", displayName: "Digital Zoom", format: CharacteristicFormat.Float, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs index 971605b..5e59dee 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FilterChangeIndicationCharacteristic: Characteristic { - // possible values: + public static int FILTER_OK = 0; public static int CHANGE_FILTER = 1; @@ -35,17 +35,19 @@ public FilterChangeIndicationCharacteristic(): base( uuid: "000000AC-0000-1000-8000-0026BB765291", displayName: "Filter Change Indication", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs index c78aa79..96b5d12 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs @@ -27,18 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FilterLifeLevelCharacteristic: Characteristic { + + public FilterLifeLevelCharacteristic(): base( uuid: "000000AB-0000-1000-8000-0026BB765291", displayName: "Filter Life Level", format: CharacteristicFormat.Float, + maxValue: 100, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs index 1099527..b309f52 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FirmwareRevisionCharacteristic: Characteristic { + + public FirmwareRevisionCharacteristic(): base( uuid: "00000052-0000-1000-8000-0026BB765291", displayName: "Firmware Revision", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs index d62dfff..40cf957 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HardwareRevisionCharacteristic: Characteristic { + + public HardwareRevisionCharacteristic(): base( uuid: "00000053-0000-1000-8000-0026BB765291", displayName: "Hardware Revision", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs index 9e69ad1..cc0166f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HeatingThresholdTemperatureCharacteristic: Characteristic { + + public HeatingThresholdTemperatureCharacteristic(): base( uuid: "00000012-0000-1000-8000-0026BB765291", displayName: "Heating Threshold Temperature", @@ -35,13 +37,16 @@ public HeatingThresholdTemperatureCharacteristic(): base( maxValue: 25, minValue: 0, minStep: 0.1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs index a38a34f..8967bf1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HoldPositionCharacteristic: Characteristic { + + public HoldPositionCharacteristic(): base( uuid: "0000006F-0000-1000-8000-0026BB765291", displayName: "Hold Position", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs index 0b4e5c6..4aa5b11 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HueCharacteristic: Characteristic { + + public HueCharacteristic(): base( uuid: "00000013-0000-1000-8000-0026BB765291", displayName: "Hue", @@ -35,13 +37,16 @@ public HueCharacteristic(): base( maxValue: 360, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs index e927b4f..af3e0c9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class IdentifyCharacteristic: Characteristic { + + public IdentifyCharacteristic(): base( uuid: "00000014-0000-1000-8000-0026BB765291", displayName: "Identify", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs index dd2ac8e..a235be5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ImageMirroringCharacteristic: Characteristic { + + public ImageMirroringCharacteristic(): base( uuid: "0000011F-0000-1000-8000-0026BB765291", displayName: "Image Mirroring", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs index 91472cf..c5af9c1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ImageRotationCharacteristic: Characteristic { + + public ImageRotationCharacteristic(): base( uuid: "0000011E-0000-1000-8000-0026BB765291", displayName: "Image Rotation", @@ -35,13 +37,16 @@ public ImageRotationCharacteristic(): base( maxValue: 270, minValue: 0, minStep: 90, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs index 0383b20..36d5c74 100644 --- a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class InUseCharacteristic: Characteristic { - // possible values: + public static int NOT_IN_USE = 0; public static int IN_USE = 1; @@ -35,17 +35,19 @@ public InUseCharacteristic(): base( uuid: "000000D2-0000-1000-8000-0026BB765291", displayName: "In Use", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs index b84c3c8..391128d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class IsConfiguredCharacteristic: Characteristic { - // possible values: + public static int NOT_CONFIGURED = 0; public static int CONFIGURED = 1; @@ -35,18 +35,20 @@ public IsConfiguredCharacteristic(): base( uuid: "000000D6-0000-1000-8000-0026BB765291", displayName: "Is Configured", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs index 0d2e48d..51ecbb3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LeakDetectedCharacteristic: Characteristic { - // possible values: + public static int LEAK_NOT_DETECTED = 0; public static int LEAK_DETECTED = 1; @@ -35,17 +35,19 @@ public LeakDetectedCharacteristic(): base( uuid: "00000070-0000-1000-8000-0026BB765291", displayName: "Leak Detected", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs index 0bb743a..29b3f0e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockControlPointCharacteristic: Characteristic { + + public LockControlPointCharacteristic(): base( uuid: "00000019-0000-1000-8000-0026BB765291", displayName: "Lock Control Point", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs index aedb74d..dcd8c6c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockCurrentStateCharacteristic: Characteristic { - // possible values: + public static int UNSECURED = 0; public static int SECURED = 1; public static int JAMMED = 2; @@ -37,19 +37,19 @@ public LockCurrentStateCharacteristic(): base( uuid: "0000001D-0000-1000-8000-0026BB765291", displayName: "Lock Current State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs index 8babb08..66e3f6b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockLastKnownActionCharacteristic: Characteristic { - // possible values: + public static int SECURED_PHYSICALLY_INTERIOR = 0; public static int UNSECURED_PHYSICALLY_INTERIOR = 1; public static int SECURED_PHYSICALLY_EXTERIOR = 2; @@ -42,24 +42,19 @@ public LockLastKnownActionCharacteristic(): base( uuid: "0000001C-0000-1000-8000-0026BB765291", displayName: "Lock Last Known Action", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - }, + + + + + validValues: new List {0,1,2,3,4,5,6,7,8,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs index f6668d2..8a70f86 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs @@ -27,18 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockManagementAutoSecurityTimeoutCharacteristic: Characteristic { + + public LockManagementAutoSecurityTimeoutCharacteristic(): base( uuid: "0000001A-0000-1000-8000-0026BB765291", displayName: "Lock Management Auto Security Timeout", format: CharacteristicFormat.Uint32, unit: CharacteristicUnit.Seconds, + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs index 6fa0bc7..30f310b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockPhysicalControlsCharacteristic: Characteristic { - // possible values: + public static int CONTROL_LOCK_DISABLED = 0; public static int CONTROL_LOCK_ENABLED = 1; @@ -35,18 +35,20 @@ public LockPhysicalControlsCharacteristic(): base( uuid: "000000A7-0000-1000-8000-0026BB765291", displayName: "Lock Physical Controls", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs index 4d54257..ccdbc2b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockTargetStateCharacteristic: Characteristic { - // possible values: + public static int UNSECURED = 0; public static int SECURED = 1; @@ -35,18 +35,20 @@ public LockTargetStateCharacteristic(): base( uuid: "0000001E-0000-1000-8000-0026BB765291", displayName: "Lock Target State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs index c3fb57d..7f15e5a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LogsCharacteristic: Characteristic { + + public LogsCharacteristic(): base( uuid: "0000001F-0000-1000-8000-0026BB765291", displayName: "Logs", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index 2cd80ec..33fac8b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ManufacturerCharacteristic: Characteristic { + + public ManufacturerCharacteristic(): base( uuid: "00000020-0000-1000-8000-0026BB765291", displayName: "Manufacturer", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs index f8f77c4..a7f9aea 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ModelCharacteristic: Characteristic { + + public ModelCharacteristic(): base( uuid: "00000021-0000-1000-8000-0026BB765291", displayName: "Model", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs index 3e0b0a8..c9ae191 100644 --- a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class MotionDetectedCharacteristic: Characteristic { + + public MotionDetectedCharacteristic(): base( uuid: "00000022-0000-1000-8000-0026BB765291", displayName: "Motion Detected", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs index 07eca24..a761e21 100644 --- a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class MuteCharacteristic: Characteristic { + + public MuteCharacteristic(): base( uuid: "0000011A-0000-1000-8000-0026BB765291", displayName: "Mute", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index 23cc1e0..1da19c9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NameCharacteristic: Characteristic { + + public NameCharacteristic(): base( uuid: "00000023-0000-1000-8000-0026BB765291", displayName: "Name", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs index d6774cc..d6e6316 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NightVisionCharacteristic: Characteristic { + + public NightVisionCharacteristic(): base( uuid: "0000011B-0000-1000-8000-0026BB765291", displayName: "Night Vision", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs index 40f0e41..5d26199 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NitrogenDioxideDensityCharacteristic: Characteristic { + + public NitrogenDioxideDensityCharacteristic(): base( uuid: "000000C4-0000-1000-8000-0026BB765291", displayName: "Nitrogen Dioxide Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs index a7a82d0..5c21e10 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ObstructionDetectedCharacteristic: Characteristic { + + public ObstructionDetectedCharacteristic(): base( uuid: "00000024-0000-1000-8000-0026BB765291", displayName: "Obstruction Detected", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs index 384c7fb..c0137d7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OccupancyDetectedCharacteristic: Characteristic { - // possible values: + public static int OCCUPANCY_NOT_DETECTED = 0; public static int OCCUPANCY_DETECTED = 1; @@ -35,17 +35,19 @@ public OccupancyDetectedCharacteristic(): base( uuid: "00000071-0000-1000-8000-0026BB765291", displayName: "Occupancy Detected", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs index 0b8c921..a480987 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OnCharacteristic: Characteristic { + + public OnCharacteristic(): base( uuid: "00000025-0000-1000-8000-0026BB765291", displayName: "On", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs index f3173c0..903f1c1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs @@ -27,17 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OpticalZoomCharacteristic: Characteristic { + + public OpticalZoomCharacteristic(): base( uuid: "0000011C-0000-1000-8000-0026BB765291", displayName: "Optical Zoom", format: CharacteristicFormat.Float, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs index c9a2146..08e4d17 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OutletInUseCharacteristic: Characteristic { + + public OutletInUseCharacteristic(): base( uuid: "00000026-0000-1000-8000-0026BB765291", displayName: "Outlet In Use", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs index c73cca6..86d2cc1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OzoneDensityCharacteristic: Characteristic { + + public OzoneDensityCharacteristic(): base( uuid: "000000C3-0000-1000-8000-0026BB765291", displayName: "Ozone Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs index b44ce97..a1ae7f5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PM10DensityCharacteristic: Characteristic { + + public PM10DensityCharacteristic(): base( uuid: "000000C7-0000-1000-8000-0026BB765291", displayName: "PM10 Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs index 853abcb..098ab0e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PM2_5DensityCharacteristic: Characteristic { + + public PM2_5DensityCharacteristic(): base( uuid: "000000C6-0000-1000-8000-0026BB765291", displayName: "PM2.5 Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs index 8d3362b..d315bf2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs @@ -27,16 +27,24 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairSetupCharacteristic: Characteristic { + + public PairSetupCharacteristic(): base( uuid: "0000004C-0000-1000-8000-0026BB765291", displayName: "Pair Setup", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs index 88e5c43..0be7336 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs @@ -27,16 +27,24 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairVerifyCharacteristic: Characteristic { + + public PairVerifyCharacteristic(): base( uuid: "0000004E-0000-1000-8000-0026BB765291", displayName: "Pair Verify", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs index 76d31e7..1d7cd5e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairingFeaturesCharacteristic: Characteristic { + + public PairingFeaturesCharacteristic(): base( uuid: "0000004F-0000-1000-8000-0026BB765291", displayName: "Pairing Features", format: CharacteristicFormat.Uint8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs index d0eec56..b70ed48 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs @@ -27,16 +27,24 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairingPairingsCharacteristic: Characteristic { + + public PairingPairingsCharacteristic(): base( uuid: "00000050-0000-1000-8000-0026BB765291", displayName: "Pairing Pairings", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs index e24065a..f270077 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PositionStateCharacteristic: Characteristic { - // possible values: + public static int DECREASING = 0; public static int INCREASING = 1; public static int STOPPED = 2; @@ -36,18 +36,19 @@ public PositionStateCharacteristic(): base( uuid: "00000072-0000-1000-8000-0026BB765291", displayName: "Position State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs index 6f99c31..693e2e8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ProgramModeCharacteristic: Characteristic { - // possible values: + public static int NO_PROGRAM_SCHEDULED = 0; public static int PROGRAM_SCHEDULED = 1; public static int PROGRAM_SCHEDULED_MANUAL_MODE_ = 2; @@ -36,18 +36,19 @@ public ProgramModeCharacteristic(): base( uuid: "000000D1-0000-1000-8000-0026BB765291", displayName: "Program Mode", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs index 83347e2..f2fa2a0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ProgrammableSwitchEventCharacteristic: Characteristic { - // possible values: + public static int SINGLE_PRESS = 0; public static int DOUBLE_PRESS = 1; public static int LONG_PRESS = 2; @@ -36,18 +36,19 @@ public ProgrammableSwitchEventCharacteristic(): base( uuid: "00000073-0000-1000-8000-0026BB765291", displayName: "Programmable Switch Event", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs index 62c3fb1..14b2876 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RelativeHumidityDehumidifierThresholdCharacteristic: Characteristic { + + public RelativeHumidityDehumidifierThresholdCharacteristic(): base( uuid: "000000C9-0000-1000-8000-0026BB765291", displayName: "Relative Humidity Dehumidifier Threshold", @@ -35,13 +37,16 @@ public RelativeHumidityDehumidifierThresholdCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs index 3f53103..2c450ea 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RelativeHumidityHumidifierThresholdCharacteristic: Characteristic { + + public RelativeHumidityHumidifierThresholdCharacteristic(): base( uuid: "000000CA-0000-1000-8000-0026BB765291", displayName: "Relative Humidity Humidifier Threshold", @@ -35,13 +37,16 @@ public RelativeHumidityHumidifierThresholdCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs index c777641..86ccc6c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RemainingDurationCharacteristic: Characteristic { + + public RemainingDurationCharacteristic(): base( uuid: "000000D4-0000-1000-8000-0026BB765291", displayName: "Remaining Duration", format: CharacteristicFormat.Uint32, + maxValue: 3600, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs index 3af7e6f..c95f5b2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs @@ -27,18 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ResetFilterIndicationCharacteristic: Characteristic { + + public ResetFilterIndicationCharacteristic(): base( uuid: "000000AD-0000-1000-8000-0026BB765291", displayName: "Reset Filter Indication", format: CharacteristicFormat.Uint8, + maxValue: 1, minValue: 1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs index 016a3a0..4b772d9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RotationDirectionCharacteristic: Characteristic { - // possible values: + public static int CLOCKWISE = 0; public static int COUNTER_CLOCKWISE = 1; @@ -35,18 +35,20 @@ public RotationDirectionCharacteristic(): base( uuid: "00000028-0000-1000-8000-0026BB765291", displayName: "Rotation Direction", format: CharacteristicFormat.Int, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs index 432d47c..9899286 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RotationSpeedCharacteristic: Characteristic { + + public RotationSpeedCharacteristic(): base( uuid: "00000029-0000-1000-8000-0026BB765291", displayName: "Rotation Speed", @@ -35,13 +37,16 @@ public RotationSpeedCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs index 5409de3..7aed282 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SaturationCharacteristic: Characteristic { + + public SaturationCharacteristic(): base( uuid: "0000002F-0000-1000-8000-0026BB765291", displayName: "Saturation", @@ -35,13 +37,16 @@ public SaturationCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs index 1e49dc6..232aa25 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemAlarmTypeCharacteristic: Characteristic { + + public SecuritySystemAlarmTypeCharacteristic(): base( uuid: "0000008E-0000-1000-8000-0026BB765291", displayName: "Security System Alarm Type", format: CharacteristicFormat.Uint8, + maxValue: 1, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs index 24eaa72..ea62a61 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemCurrentStateCharacteristic: Characteristic { - // possible values: + public static int STAY_ARM = 0; public static int AWAY_ARM = 1; public static int NIGHT_ARM = 2; @@ -38,20 +38,19 @@ public SecuritySystemCurrentStateCharacteristic(): base( uuid: "00000066-0000-1000-8000-0026BB765291", displayName: "Security System Current State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - 4, - }, + + + + + validValues: new List {0,1,2,3,4,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs index e28a08f..2c86e9d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemTargetStateCharacteristic: Characteristic { - // possible values: + public static int STAY_ARM = 0; public static int AWAY_ARM = 1; public static int NIGHT_ARM = 2; @@ -37,20 +37,20 @@ public SecuritySystemTargetStateCharacteristic(): base( uuid: "00000067-0000-1000-8000-0026BB765291", displayName: "Security System Target State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs index d0cd8fb..1078089 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs @@ -27,16 +27,24 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SelectedRTPStreamConfigurationCharacteristic: Characteristic { + + public SelectedRTPStreamConfigurationCharacteristic(): base( uuid: "00000117-0000-1000-8000-0026BB765291", displayName: "Selected RTP Stream Configuration", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs index 625ffc8..5f1e968 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SerialNumberCharacteristic: Characteristic { + + public SerialNumberCharacteristic(): base( uuid: "00000030-0000-1000-8000-0026BB765291", displayName: "Serial Number", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs index 949a388..c8877ba 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs @@ -27,18 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ServiceLabelIndexCharacteristic: Characteristic { + + public ServiceLabelIndexCharacteristic(): base( uuid: "000000CB-0000-1000-8000-0026BB765291", displayName: "Service Label Index", format: CharacteristicFormat.Uint8, + maxValue: 255, minValue: 1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs index 9dd91af..685898c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ServiceLabelNamespaceCharacteristic: Characteristic { - // possible values: + public static int DOTS = 0; public static int ARABIC_NUMERALS = 1; @@ -35,16 +35,17 @@ public ServiceLabelNamespaceCharacteristic(): base( uuid: "000000CD-0000-1000-8000-0026BB765291", displayName: "Service Label Namespace", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs index ad4fa4f..fb1f7cf 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs @@ -27,20 +27,26 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SetDurationCharacteristic: Characteristic { + + public SetDurationCharacteristic(): base( uuid: "000000D3-0000-1000-8000-0026BB765291", displayName: "Set Duration", format: CharacteristicFormat.Uint32, + maxValue: 3600, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs index e41abdf..b13307c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs @@ -27,16 +27,24 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SetupEndpointsCharacteristic: Characteristic { + + public SetupEndpointsCharacteristic(): base( uuid: "00000118-0000-1000-8000-0026BB765291", displayName: "Setup Endpoints", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs index f953d11..747c9f0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SlatTypeCharacteristic: Characteristic { - // possible values: + public static int HORIZONTAL = 0; public static int VERTICAL = 1; @@ -35,16 +35,17 @@ public SlatTypeCharacteristic(): base( uuid: "000000C0-0000-1000-8000-0026BB765291", displayName: "Slat Type", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs index fb178b8..2a53c08 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SmokeDetectedCharacteristic: Characteristic { - // possible values: + public static int SMOKE_NOT_DETECTED = 0; public static int SMOKE_DETECTED = 1; @@ -35,17 +35,19 @@ public SmokeDetectedCharacteristic(): base( uuid: "00000076-0000-1000-8000-0026BB765291", displayName: "Smoke Detected", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs index fc86add..3a73286 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusActiveCharacteristic: Characteristic { + + public StatusActiveCharacteristic(): base( uuid: "00000075-0000-1000-8000-0026BB765291", displayName: "Status Active", format: CharacteristicFormat.Bool, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs index 4e09294..d7b7558 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusFaultCharacteristic: Characteristic { - // possible values: + public static int NO_FAULT = 0; public static int GENERAL_FAULT = 1; @@ -35,17 +35,19 @@ public StatusFaultCharacteristic(): base( uuid: "00000077-0000-1000-8000-0026BB765291", displayName: "Status Fault", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs index 59e2ca7..e8279db 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusJammedCharacteristic: Characteristic { - // possible values: + public static int NOT_JAMMED = 0; public static int JAMMED = 1; @@ -35,17 +35,19 @@ public StatusJammedCharacteristic(): base( uuid: "00000078-0000-1000-8000-0026BB765291", displayName: "Status Jammed", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs index 1372cc7..dd373c6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusLowBatteryCharacteristic: Characteristic { - // possible values: + public static int BATTERY_LEVEL_NORMAL = 0; public static int BATTERY_LEVEL_LOW = 1; @@ -35,17 +35,19 @@ public StatusLowBatteryCharacteristic(): base( uuid: "00000079-0000-1000-8000-0026BB765291", displayName: "Status Low Battery", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs index 5b3274f..44a01cf 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusTamperedCharacteristic: Characteristic { - // possible values: + public static int NOT_TAMPERED = 0; public static int TAMPERED = 1; @@ -35,17 +35,19 @@ public StatusTamperedCharacteristic(): base( uuid: "0000007A-0000-1000-8000-0026BB765291", displayName: "Status Tampered", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs index 43deec8..cd4bf97 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StreamingStatusCharacteristic: Characteristic { + + public StreamingStatusCharacteristic(): base( uuid: "00000120-0000-1000-8000-0026BB765291", displayName: "Streaming Status", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs index 68d2702..5d731b0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SulphurDioxideDensityCharacteristic: Characteristic { + + public SulphurDioxideDensityCharacteristic(): base( uuid: "000000C5-0000-1000-8000-0026BB765291", displayName: "Sulphur Dioxide Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs index 9b38e51..c0e5f3f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedAudioStreamConfigurationCharacteristic: Characteristic { + + public SupportedAudioStreamConfigurationCharacteristic(): base( uuid: "00000115-0000-1000-8000-0026BB765291", displayName: "Supported Audio Stream Configuration", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs index ac37809..e050e44 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedRTPConfigurationCharacteristic: Characteristic { + + public SupportedRTPConfigurationCharacteristic(): base( uuid: "00000116-0000-1000-8000-0026BB765291", displayName: "Supported RTP Configuration", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs index 2a63efe..e1f5cba 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs @@ -27,15 +27,23 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedVideoStreamConfigurationCharacteristic: Characteristic { + + public SupportedVideoStreamConfigurationCharacteristic(): base( uuid: "00000114-0000-1000-8000-0026BB765291", displayName: "Supported Video Stream Configuration", format: CharacteristicFormat.Tlv8, + + + + + permissions: new List { CharacteristicPermission.PairedRead, + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs index 133c6f3..199932c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SwingModeCharacteristic: Characteristic { - // possible values: + public static int SWING_DISABLED = 0; public static int SWING_ENABLED = 1; @@ -35,18 +35,20 @@ public SwingModeCharacteristic(): base( uuid: "000000B6-0000-1000-8000-0026BB765291", displayName: "Swing Mode", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs index 83c6802..ea2efae 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetAirPurifierStateCharacteristic: Characteristic { - // possible values: + public static int MANUAL = 0; public static int AUTO = 1; @@ -35,18 +35,20 @@ public TargetAirPurifierStateCharacteristic(): base( uuid: "000000A8-0000-1000-8000-0026BB765291", displayName: "Target Air Purifier State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs index ec01daf..cfcf5a2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetAirQualityCharacteristic: Characteristic { - // possible values: + public static int EXCELLENT = 0; public static int GOOD = 1; public static int FAIR = 2; @@ -36,19 +36,20 @@ public TargetAirQualityCharacteristic(): base( uuid: "000000AE-0000-1000-8000-0026BB765291", displayName: "Target Air Quality", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs index 7758373..6b21631 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetDoorStateCharacteristic: Characteristic { - // possible values: + public static int OPEN = 0; public static int CLOSED = 1; @@ -35,18 +35,20 @@ public TargetDoorStateCharacteristic(): base( uuid: "00000032-0000-1000-8000-0026BB765291", displayName: "Target Door State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs index 24f0552..1727491 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetFanStateCharacteristic: Characteristic { - // possible values: + public static int MANUAL = 0; public static int AUTO = 1; @@ -35,18 +35,20 @@ public TargetFanStateCharacteristic(): base( uuid: "000000BF-0000-1000-8000-0026BB765291", displayName: "Target Fan State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs index f25fce6..b41d35f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHeaterCoolerStateCharacteristic: Characteristic { - // possible values: + public static int AUTO = 0; public static int HEAT = 1; public static int COOL = 2; @@ -36,19 +36,20 @@ public TargetHeaterCoolerStateCharacteristic(): base( uuid: "000000B2-0000-1000-8000-0026BB765291", displayName: "Target Heater Cooler State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs index a51ffb3..260e41e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHeatingCoolingStateCharacteristic: Characteristic { - // possible values: + public static int OFF = 0; public static int HEAT = 1; public static int COOL = 2; @@ -37,20 +37,20 @@ public TargetHeatingCoolingStateCharacteristic(): base( uuid: "00000033-0000-1000-8000-0026BB765291", displayName: "Target Heating Cooling State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs index 8d28817..2a70be7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHorizontalTiltAngleCharacteristic: Characteristic { + + public TargetHorizontalTiltAngleCharacteristic(): base( uuid: "0000007B-0000-1000-8000-0026BB765291", displayName: "Target Horizontal Tilt Angle", @@ -35,13 +37,16 @@ public TargetHorizontalTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs index afcad3b..758a4b9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHumidifierDehumidifierStateCharacteristic: Characteristic { - // possible values: + public static int HUMIDIFIER_OR_DEHUMIDIFIER = 0; public static int HUMIDIFIER = 1; public static int DEHUMIDIFIER = 2; @@ -36,19 +36,20 @@ public TargetHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B4-0000-1000-8000-0026BB765291", displayName: "Target Humidifier Dehumidifier State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - }, + + + + + validValues: new List {0,1,2,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs index 5048f93..06b7885 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetPositionCharacteristic: Characteristic { + + public TargetPositionCharacteristic(): base( uuid: "0000007C-0000-1000-8000-0026BB765291", displayName: "Target Position", @@ -35,13 +37,16 @@ public TargetPositionCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs index cfc0257..44bed98 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetRelativeHumidityCharacteristic: Characteristic { + + public TargetRelativeHumidityCharacteristic(): base( uuid: "00000034-0000-1000-8000-0026BB765291", displayName: "Target Relative Humidity", @@ -35,13 +37,16 @@ public TargetRelativeHumidityCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs index c7088e9..25ed798 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetSlatStateCharacteristic: Characteristic { - // possible values: + public static int MANUAL = 0; public static int AUTO = 1; @@ -35,18 +35,20 @@ public TargetSlatStateCharacteristic(): base( uuid: "000000BE-0000-1000-8000-0026BB765291", displayName: "Target Slat State", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs index 456e3cc..3a4d17b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetTemperatureCharacteristic: Characteristic { + + public TargetTemperatureCharacteristic(): base( uuid: "00000035-0000-1000-8000-0026BB765291", displayName: "Target Temperature", @@ -35,13 +37,16 @@ public TargetTemperatureCharacteristic(): base( maxValue: 38, minValue: 10, minStep: 0.1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs index efd6580..167f1fc 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetTiltAngleCharacteristic: Characteristic { + + public TargetTiltAngleCharacteristic(): base( uuid: "000000C2-0000-1000-8000-0026BB765291", displayName: "Target Tilt Angle", @@ -35,13 +37,16 @@ public TargetTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs index 2f1b4c0..1449587 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetVerticalTiltAngleCharacteristic: Characteristic { + + public TargetVerticalTiltAngleCharacteristic(): base( uuid: "0000007D-0000-1000-8000-0026BB765291", displayName: "Target Vertical Tilt Angle", @@ -35,13 +37,16 @@ public TargetVerticalTiltAngleCharacteristic(): base( maxValue: 90, minValue: -1, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs index 40b6b67..50ef7ee 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TemperatureDisplayUnitsCharacteristic: Characteristic { - // possible values: + public static int CELSIUS = 0; public static int FAHRENHEIT = 1; @@ -35,18 +35,20 @@ public TemperatureDisplayUnitsCharacteristic(): base( uuid: "00000036-0000-1000-8000-0026BB765291", displayName: "Temperature Display Units", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - }, + + + + + validValues: new List {0,1,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs index 9e54f7f..775b469 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs @@ -27,19 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VOCDensityCharacteristic: Characteristic { + + public VOCDensityCharacteristic(): base( uuid: "000000C8-0000-1000-8000-0026BB765291", displayName: "VOC Density", format: CharacteristicFormat.Float, + maxValue: 1000, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs index c90a6c4..40f40d5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs @@ -27,7 +27,7 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ValveTypeCharacteristic: Characteristic { - // possible values: + public static int GENERIC_VALVE = 0; public static int IRRIGATION = 1; public static int SHOWER_HEAD = 2; @@ -37,19 +37,19 @@ public ValveTypeCharacteristic(): base( uuid: "000000D5-0000-1000-8000-0026BB765291", displayName: "Valve Type", format: CharacteristicFormat.Uint8, - validValues: new List - { - 0, - 1, - 2, - 3, - }, + + + + + validValues: new List {0,1,2,3,}, permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs index ffbbaa2..a195aa2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs @@ -27,16 +27,25 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VersionCharacteristic: Characteristic { + + public VersionCharacteristic(): base( uuid: "00000037-0000-1000-8000-0026BB765291", displayName: "Version", format: CharacteristicFormat.String, + + + + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs index 4d6d123..9109a5b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VolumeCharacteristic: Characteristic { + + public VolumeCharacteristic(): base( uuid: "00000119-0000-1000-8000-0026BB765291", displayName: "Volume", @@ -35,13 +37,16 @@ public VolumeCharacteristic(): base( maxValue: 100, minValue: 0, minStep: 1, + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.PairedWrite, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs index 57bdfa9..dc9d0bd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class WaterLevelCharacteristic: Characteristic { + + public WaterLevelCharacteristic(): base( uuid: "000000B5-0000-1000-8000-0026BB765291", displayName: "Water Level", @@ -34,12 +36,16 @@ public WaterLevelCharacteristic(): base( unit: CharacteristicUnit.Percentage, maxValue: 100, minValue: 0, + + permissions: new List { CharacteristicPermission.PairedRead, CharacteristicPermission.Events, + + }) { } } -} +} \ No newline at end of file From 55b95d62d0fa13272319a840c334e07da11b8be1 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Sun, 9 Feb 2020 06:19:58 +0300 Subject: [PATCH 060/152] tiny update for import.js. --- contrib/importer/import.js | 57 +++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/contrib/importer/import.js b/contrib/importer/import.js index 1397e23..18d5a9d 100644 --- a/contrib/importer/import.js +++ b/contrib/importer/import.js @@ -10,32 +10,37 @@ const plist = require('simple-plist'); var plistPath = './data/default.metadata.plist'; var metadata = plist.readFileSync(plistPath); -var characteristics = {}; - -for (var index in metadata.Characteristics) { - var characteristic = metadata.Characteristics[index]; - var classyName = characteristic.Name.replace(/[\s\-]/g, ""); // "Target Door State" -> "TargetDoorState" - classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5" - - characteristics[characteristic.UUID] = classyName; - - var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); - var output = fs.createWriteStream(outputPath); - - var res = nunjucks.render('characteristic.html', { - classyName: classyName, - characteristic: characteristic, - capitalize: capitalize, - getCharacteristicUnit: getCharacteristicUnit, - getCharacteristicFormat: getCharacteristicFormat, - getCharacteristicPermsKey: getCharacteristicPermsKey, - gotMaximumValue: gotMaximumValue, - gotMinimumValue: gotMinimumValue, - gotStepValue: gotStepValue, - }); - - output.write(res); - output.end(); +readCharacteristics(metadata); +readServices(metadata); + +function readCharacteristics(metadata) { + for (var index in metadata.Characteristics) { + var characteristic = metadata.Characteristics[index]; + var classyName = characteristic.Name.replace(/[\s\-]/g, ""); // "Target Door State" -> "TargetDoorState" + classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5" + + var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); + var output = fs.createWriteStream(outputPath); + + var res = nunjucks.render('characteristic.html', { + classyName: classyName, + characteristic: characteristic, + capitalize: capitalize, + getCharacteristicUnit: getCharacteristicUnit, + getCharacteristicFormat: getCharacteristicFormat, + getCharacteristicPermsKey: getCharacteristicPermsKey, + gotMaximumValue: gotMaximumValue, + gotMinimumValue: gotMinimumValue, + gotStepValue: gotStepValue, + }); + + output.write(res); + output.end(); + } +} + +function readServices(metadata) { + } function capitalize(s) { From 7c13acc8dd6af38f559d9f8d8ffa9198bb858b93 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 12:27:31 +0300 Subject: [PATCH 061/152] added services support to import.js. added initial service definitions. --- contrib/importer/characteristic.html | 2 +- contrib/importer/import.js | 19 +++++++ contrib/importer/service.html | 53 +++++++++++++++++++ .../AccessoryInformationService.cs | 31 +++++++---- .../Definitions/AirPurifierService.cs | 47 ++++++++++++++++ .../Definitions/AirQualitySensorService.cs | 43 +++++++++++++++ .../Definitions/BatteryServiceService.cs | 47 ++++++++++++++++ .../CameraRTPStreamManagementService.cs | 53 +++++++++++++++++++ .../Definitions/CarbonDioxideSensorService.cs | 43 +++++++++++++++ .../CarbonMonoxideSensorService.cs | 43 +++++++++++++++ .../Definitions/ContactSensorService.cs | 43 +++++++++++++++ .../Services/Definitions/DoorService.cs | 47 ++++++++++++++++ .../Services/Definitions/DoorbellService.cs | 43 +++++++++++++++ .../Services/Definitions/FanService.cs | 43 +++++++++++++++ .../Services/Definitions/Fanv2Service.cs | 43 +++++++++++++++ .../Services/Definitions/FaucetService.cs | 43 +++++++++++++++ .../Definitions/FilterMaintenanceService.cs | 43 +++++++++++++++ .../Definitions/GarageDoorOpenerService.cs | 47 ++++++++++++++++ .../Definitions/HeaterCoolerService.cs | 49 +++++++++++++++++ .../HumidifierDehumidifierService.cs | 49 +++++++++++++++++ .../Definitions/HumiditySensorService.cs | 43 +++++++++++++++ .../Definitions/IrrigationSystemService.cs | 47 ++++++++++++++++ .../Services/Definitions/LeakSensorService.cs | 43 +++++++++++++++ .../Definitions/LightSensorService.cs | 43 +++++++++++++++ .../Services/Definitions/LightbulbService.cs | 43 +++++++++++++++ .../Definitions/LockManagementService.cs | 45 ++++++++++++++++ .../Definitions/LockMechanismService.cs | 45 ++++++++++++++++ .../Services/Definitions/MicrophoneService.cs | 45 ++++++++++++++++ .../Definitions/MotionSensorService.cs | 43 +++++++++++++++ .../Definitions/OccupancySensorService.cs | 43 +++++++++++++++ .../Services/Definitions/OutletService.cs | 45 ++++++++++++++++ .../Definitions/SecuritySystemService.cs | 45 ++++++++++++++++ .../Definitions/ServiceLabelService.cs | 43 +++++++++++++++ .../Services/Definitions/SlatService.cs | 45 ++++++++++++++++ .../Definitions/SmokeSensorService.cs | 43 +++++++++++++++ .../Services/Definitions/SpeakerService.cs | 43 +++++++++++++++ .../StatelessProgrammableSwitchService.cs | 43 +++++++++++++++ .../Services/Definitions/SwitchService.cs | 43 +++++++++++++++ .../Definitions/TemperatureSensorService.cs | 43 +++++++++++++++ .../Services/Definitions/ThermostatService.cs | 51 ++++++++++++++++++ .../Services/Definitions/ValveService.cs | 47 ++++++++++++++++ .../Definitions/WindowCoveringService.cs | 47 ++++++++++++++++ .../Services/Definitions/WindowService.cs | 47 ++++++++++++++++ 43 files changed, 1845 insertions(+), 11 deletions(-) create mode 100644 contrib/importer/service.html create mode 100644 src/platforms/homekit/Services/Definitions/AirPurifierService.cs create mode 100644 src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/BatteryServiceService.cs create mode 100644 src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs create mode 100644 src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/ContactSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/DoorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/DoorbellService.cs create mode 100644 src/platforms/homekit/Services/Definitions/FanService.cs create mode 100644 src/platforms/homekit/Services/Definitions/Fanv2Service.cs create mode 100644 src/platforms/homekit/Services/Definitions/FaucetService.cs create mode 100644 src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs create mode 100644 src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs create mode 100644 src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs create mode 100644 src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs create mode 100644 src/platforms/homekit/Services/Definitions/HumiditySensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs create mode 100644 src/platforms/homekit/Services/Definitions/LeakSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/LightSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/LightbulbService.cs create mode 100644 src/platforms/homekit/Services/Definitions/LockManagementService.cs create mode 100644 src/platforms/homekit/Services/Definitions/LockMechanismService.cs create mode 100644 src/platforms/homekit/Services/Definitions/MicrophoneService.cs create mode 100644 src/platforms/homekit/Services/Definitions/MotionSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/OccupancySensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/OutletService.cs create mode 100644 src/platforms/homekit/Services/Definitions/SecuritySystemService.cs create mode 100644 src/platforms/homekit/Services/Definitions/ServiceLabelService.cs create mode 100644 src/platforms/homekit/Services/Definitions/SlatService.cs create mode 100644 src/platforms/homekit/Services/Definitions/SmokeSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/SpeakerService.cs create mode 100644 src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs create mode 100644 src/platforms/homekit/Services/Definitions/SwitchService.cs create mode 100644 src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs create mode 100644 src/platforms/homekit/Services/Definitions/ThermostatService.cs create mode 100644 src/platforms/homekit/Services/Definitions/ValveService.cs create mode 100644 src/platforms/homekit/Services/Definitions/WindowCoveringService.cs create mode 100644 src/platforms/homekit/Services/Definitions/WindowService.cs diff --git a/contrib/importer/characteristic.html b/contrib/importer/characteristic.html index 8bd4720..8ba94b1 100644 --- a/contrib/importer/characteristic.html +++ b/contrib/importer/characteristic.html @@ -52,7 +52,7 @@ {%- endif %} permissions: new List { - {% for value in characteristic.Properties %} + {% for value in characteristic.Properties %} {%- set perm = getCharacteristicPermsKey(value) -%} {% if perm %}CharacteristicPermission.{{perm}},{% endif %} {% endfor %} diff --git a/contrib/importer/import.js b/contrib/importer/import.js index 18d5a9d..455cd7b 100644 --- a/contrib/importer/import.js +++ b/contrib/importer/import.js @@ -10,6 +10,8 @@ const plist = require('simple-plist'); var plistPath = './data/default.metadata.plist'; var metadata = plist.readFileSync(plistPath); +var characteristics = []; // index characteristics for quick access while building services. + readCharacteristics(metadata); readServices(metadata); @@ -18,6 +20,7 @@ function readCharacteristics(metadata) { var characteristic = metadata.Characteristics[index]; var classyName = characteristic.Name.replace(/[\s\-]/g, ""); // "Target Door State" -> "TargetDoorState" classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5" + characteristics[characteristic.UUID] = classyName; // build characteristics list for later reference to use in services. var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); var output = fs.createWriteStream(outputPath); @@ -40,7 +43,23 @@ function readCharacteristics(metadata) { } function readServices(metadata) { + for (var index in metadata.Services) { + var service = metadata.Services[index]; + var classyName = service.Name.replace(/[\s\-]/g, ""); + + var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Services', 'Definitions', `${classyName}Service.cs`); + var output = fs.createWriteStream(outputPath); + + var res = nunjucks.render('service.html', { + classyName: classyName, + service: service, + characteristics: characteristics, + capitalize: capitalize, + }); + output.write(res); + output.end(); + } } function capitalize(s) { diff --git a/contrib/importer/service.html b/contrib/importer/service.html new file mode 100644 index 0000000..ad7e224 --- /dev/null +++ b/contrib/importer/service.html @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class {{classyName}}Service: Service + { + public {{classyName}}Service() + : base("{{ service.UUID }}", "{{ service.Name }}") + { + {% if service.RequiredCharacteristics -%} + // required characteristics + {% for value in service.RequiredCharacteristics -%} + {%- if not loop.first %}.{% endif -%} + AddCharacteristic(typeof({{ characteristics[value] }}Characteristic)) + {% if loop.last -%};{%- endif %} + {%- endfor %} + {%- endif %} + + {% if service.OptionalCharacteristics -%} + // optional characteristics + {% for value in service.RequiredCharacteristics -%} + {%- if not loop.first %}.{% endif -%} + AddCharacteristic(typeof({{ characteristics[value] }}Characteristic)) + {% if loop.last -%};{%- endif %} + {%- endfor %} + {%- endif %} + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index f6d4367..1b644f9 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -1,13 +1,13 @@ -#region license -// +#region license +// // homer - The complete home automation for Homer Simpson. // Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com // https://github.com/bonesoul/homer -// +// // “Commons Clause” License Condition v1.0 // // The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// +// // Without limiting other conditions in the License, the grant of rights under the License will not include, and the License // does not grant to you, the right to Sell the Software. // @@ -30,13 +30,24 @@ public class AccessoryInformationService: Service public AccessoryInformationService() : base("0000003E-0000-1000-8000-0026BB765291", "Accessory Information") { - // required characteristics. + // required characteristics AddCharacteristic(typeof(IdentifyCharacteristic)) - .AddCharacteristic(typeof(ManufacturerCharacteristic)) - .AddCharacteristic(typeof(ModelCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(SerialNumberCharacteristic)) - .AddCharacteristic(typeof(FirmwareRevisionCharacteristic)); + .AddCharacteristic(typeof(ManufacturerCharacteristic)) + .AddCharacteristic(typeof(ModelCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SerialNumberCharacteristic)) + .AddCharacteristic(typeof(FirmwareRevisionCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(IdentifyCharacteristic)) + .AddCharacteristic(typeof(ManufacturerCharacteristic)) + .AddCharacteristic(typeof(ModelCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SerialNumberCharacteristic)) + .AddCharacteristic(typeof(FirmwareRevisionCharacteristic)) + ; } } } + diff --git a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs new file mode 100644 index 0000000..bef9c80 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class AirPurifierService: Service + { + public AirPurifierService() + : base("000000BB-0000-1000-8000-0026BB765291", "Air Purifier") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(CurrentAirPurifierStateCharacteristic)) + .AddCharacteristic(typeof(TargetAirPurifierStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(CurrentAirPurifierStateCharacteristic)) + .AddCharacteristic(typeof(TargetAirPurifierStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs new file mode 100644 index 0000000..b073edc --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class AirQualitySensorService: Service + { + public AirQualitySensorService() + : base("0000008D-0000-1000-8000-0026BB765291", "Air Quality Sensor") + { + // required characteristics + AddCharacteristic(typeof(AirQualityCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(AirQualityCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs new file mode 100644 index 0000000..2fa02a7 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class BatteryServiceService: Service + { + public BatteryServiceService() + : base("00000096-0000-1000-8000-0026BB765291", "Battery Service") + { + // required characteristics + AddCharacteristic(typeof(BatteryLevelCharacteristic)) + .AddCharacteristic(typeof(ChargingStateCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(BatteryLevelCharacteristic)) + .AddCharacteristic(typeof(ChargingStateCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs new file mode 100644 index 0000000..48af3d8 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs @@ -0,0 +1,53 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class CameraRTPStreamManagementService: Service + { + public CameraRTPStreamManagementService() + : base("00000110-0000-1000-8000-0026BB765291", "Camera RTP Stream Management") + { + // required characteristics + AddCharacteristic(typeof(SupportedVideoStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(SupportedAudioStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(SupportedRTPConfigurationCharacteristic)) + .AddCharacteristic(typeof(SelectedRTPStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(StreamingStatusCharacteristic)) + .AddCharacteristic(typeof(SetupEndpointsCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(SupportedVideoStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(SupportedAudioStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(SupportedRTPConfigurationCharacteristic)) + .AddCharacteristic(typeof(SelectedRTPStreamConfigurationCharacteristic)) + .AddCharacteristic(typeof(StreamingStatusCharacteristic)) + .AddCharacteristic(typeof(SetupEndpointsCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs new file mode 100644 index 0000000..5252afb --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class CarbonDioxideSensorService: Service + { + public CarbonDioxideSensorService() + : base("00000097-0000-1000-8000-0026BB765291", "Carbon Dioxide Sensor") + { + // required characteristics + AddCharacteristic(typeof(CarbonDioxideDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CarbonDioxideDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs new file mode 100644 index 0000000..6851eeb --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class CarbonMonoxideSensorService: Service + { + public CarbonMonoxideSensorService() + : base("0000007F-0000-1000-8000-0026BB765291", "Carbon Monoxide Sensor") + { + // required characteristics + AddCharacteristic(typeof(CarbonMonoxideDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CarbonMonoxideDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs new file mode 100644 index 0000000..227b1cd --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ContactSensorService: Service + { + public ContactSensorService() + : base("00000080-0000-1000-8000-0026BB765291", "Contact Sensor") + { + // required characteristics + AddCharacteristic(typeof(ContactSensorStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ContactSensorStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/DoorService.cs b/src/platforms/homekit/Services/Definitions/DoorService.cs new file mode 100644 index 0000000..d01a619 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/DoorService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class DoorService: Service + { + public DoorService() + : base("00000081-0000-1000-8000-0026BB765291", "Door") + { + // required characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/src/platforms/homekit/Services/Definitions/DoorbellService.cs new file mode 100644 index 0000000..1971ccb --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/DoorbellService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class DoorbellService: Service + { + public DoorbellService() + : base("00000121-0000-1000-8000-0026BB765291", "Doorbell") + { + // required characteristics + AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/FanService.cs b/src/platforms/homekit/Services/Definitions/FanService.cs new file mode 100644 index 0000000..314fa02 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/FanService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class FanService: Service + { + public FanService() + : base("00000040-0000-1000-8000-0026BB765291", "Fan") + { + // required characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs new file mode 100644 index 0000000..ce89a58 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class Fanv2Service: Service + { + public Fanv2Service() + : base("000000B7-0000-1000-8000-0026BB765291", "Fan v2") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/FaucetService.cs b/src/platforms/homekit/Services/Definitions/FaucetService.cs new file mode 100644 index 0000000..3b6a19e --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/FaucetService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class FaucetService: Service + { + public FaucetService() + : base("000000D7-0000-1000-8000-0026BB765291", "Faucet") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs new file mode 100644 index 0000000..35e7e21 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class FilterMaintenanceService: Service + { + public FilterMaintenanceService() + : base("000000BA-0000-1000-8000-0026BB765291", "Filter Maintenance") + { + // required characteristics + AddCharacteristic(typeof(FilterChangeIndicationCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(FilterChangeIndicationCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs new file mode 100644 index 0000000..5918760 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class GarageDoorOpenerService: Service + { + public GarageDoorOpenerService() + : base("00000041-0000-1000-8000-0026BB765291", "Garage Door Opener") + { + // required characteristics + AddCharacteristic(typeof(CurrentDoorStateCharacteristic)) + .AddCharacteristic(typeof(TargetDoorStateCharacteristic)) + .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentDoorStateCharacteristic)) + .AddCharacteristic(typeof(TargetDoorStateCharacteristic)) + .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs new file mode 100644 index 0000000..758ae60 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs @@ -0,0 +1,49 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class HeaterCoolerService: Service + { + public HeaterCoolerService() + : base("000000BC-0000-1000-8000-0026BB765291", "Heater Cooler") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(CurrentHeaterCoolerStateCharacteristic)) + .AddCharacteristic(typeof(TargetHeaterCoolerStateCharacteristic)) + .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(CurrentHeaterCoolerStateCharacteristic)) + .AddCharacteristic(typeof(TargetHeaterCoolerStateCharacteristic)) + .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs new file mode 100644 index 0000000..4b9ae4d --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs @@ -0,0 +1,49 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class HumidifierDehumidifierService: Service + { + public HumidifierDehumidifierService() + : base("000000BD-0000-1000-8000-0026BB765291", "Humidifier Dehumidifier") + { + // required characteristics + AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + .AddCharacteristic(typeof(CurrentHumidifierDehumidifierStateCharacteristic)) + .AddCharacteristic(typeof(TargetHumidifierDehumidifierStateCharacteristic)) + .AddCharacteristic(typeof(ActiveCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + .AddCharacteristic(typeof(CurrentHumidifierDehumidifierStateCharacteristic)) + .AddCharacteristic(typeof(TargetHumidifierDehumidifierStateCharacteristic)) + .AddCharacteristic(typeof(ActiveCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs new file mode 100644 index 0000000..33b2f09 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class HumiditySensorService: Service + { + public HumiditySensorService() + : base("00000082-0000-1000-8000-0026BB765291", "Humidity Sensor") + { + // required characteristics + AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs new file mode 100644 index 0000000..13ec1d8 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class IrrigationSystemService: Service + { + public IrrigationSystemService() + : base("000000CF-0000-1000-8000-0026BB765291", "Irrigation System") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(ProgramModeCharacteristic)) + .AddCharacteristic(typeof(InUseCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(ProgramModeCharacteristic)) + .AddCharacteristic(typeof(InUseCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs new file mode 100644 index 0000000..a82b485 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class LeakSensorService: Service + { + public LeakSensorService() + : base("00000083-0000-1000-8000-0026BB765291", "Leak Sensor") + { + // required characteristics + AddCharacteristic(typeof(LeakDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(LeakDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/src/platforms/homekit/Services/Definitions/LightSensorService.cs new file mode 100644 index 0000000..9e5a394 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/LightSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class LightSensorService: Service + { + public LightSensorService() + : base("00000084-0000-1000-8000-0026BB765291", "Light Sensor") + { + // required characteristics + AddCharacteristic(typeof(CurrentAmbientLightLevelCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentAmbientLightLevelCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/src/platforms/homekit/Services/Definitions/LightbulbService.cs new file mode 100644 index 0000000..fea1adf --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/LightbulbService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class LightbulbService: Service + { + public LightbulbService() + : base("00000043-0000-1000-8000-0026BB765291", "Lightbulb") + { + // required characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/src/platforms/homekit/Services/Definitions/LockManagementService.cs new file mode 100644 index 0000000..fab0226 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/LockManagementService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class LockManagementService: Service + { + public LockManagementService() + : base("00000044-0000-1000-8000-0026BB765291", "Lock Management") + { + // required characteristics + AddCharacteristic(typeof(LockControlPointCharacteristic)) + .AddCharacteristic(typeof(VersionCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(LockControlPointCharacteristic)) + .AddCharacteristic(typeof(VersionCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs new file mode 100644 index 0000000..df7e668 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class LockMechanismService: Service + { + public LockMechanismService() + : base("00000045-0000-1000-8000-0026BB765291", "Lock Mechanism") + { + // required characteristics + AddCharacteristic(typeof(LockCurrentStateCharacteristic)) + .AddCharacteristic(typeof(LockTargetStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(LockCurrentStateCharacteristic)) + .AddCharacteristic(typeof(LockTargetStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs new file mode 100644 index 0000000..7006621 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class MicrophoneService: Service + { + public MicrophoneService() + : base("00000112-0000-1000-8000-0026BB765291", "Microphone") + { + // required characteristics + AddCharacteristic(typeof(VolumeCharacteristic)) + .AddCharacteristic(typeof(MuteCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(VolumeCharacteristic)) + .AddCharacteristic(typeof(MuteCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs new file mode 100644 index 0000000..c5457fc --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class MotionSensorService: Service + { + public MotionSensorService() + : base("00000085-0000-1000-8000-0026BB765291", "Motion Sensor") + { + // required characteristics + AddCharacteristic(typeof(MotionDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(MotionDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs new file mode 100644 index 0000000..f6de90a --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class OccupancySensorService: Service + { + public OccupancySensorService() + : base("00000086-0000-1000-8000-0026BB765291", "Occupancy Sensor") + { + // required characteristics + AddCharacteristic(typeof(OccupancyDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(OccupancyDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/OutletService.cs b/src/platforms/homekit/Services/Definitions/OutletService.cs new file mode 100644 index 0000000..3e86b05 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/OutletService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class OutletService: Service + { + public OutletService() + : base("00000047-0000-1000-8000-0026BB765291", "Outlet") + { + // required characteristics + AddCharacteristic(typeof(OnCharacteristic)) + .AddCharacteristic(typeof(OutletInUseCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(OnCharacteristic)) + .AddCharacteristic(typeof(OutletInUseCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs new file mode 100644 index 0000000..2f3e204 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class SecuritySystemService: Service + { + public SecuritySystemService() + : base("0000007E-0000-1000-8000-0026BB765291", "Security System") + { + // required characteristics + AddCharacteristic(typeof(SecuritySystemCurrentStateCharacteristic)) + .AddCharacteristic(typeof(SecuritySystemTargetStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(SecuritySystemCurrentStateCharacteristic)) + .AddCharacteristic(typeof(SecuritySystemTargetStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs new file mode 100644 index 0000000..3aae767 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ServiceLabelService: Service + { + public ServiceLabelService() + : base("000000CC-0000-1000-8000-0026BB765291", "Service Label") + { + // required characteristics + AddCharacteristic(typeof(ServiceLabelNamespaceCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ServiceLabelNamespaceCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/SlatService.cs b/src/platforms/homekit/Services/Definitions/SlatService.cs new file mode 100644 index 0000000..b109971 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/SlatService.cs @@ -0,0 +1,45 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class SlatService: Service + { + public SlatService() + : base("000000B9-0000-1000-8000-0026BB765291", "Slat") + { + // required characteristics + AddCharacteristic(typeof(SlatTypeCharacteristic)) + .AddCharacteristic(typeof(CurrentSlatStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(SlatTypeCharacteristic)) + .AddCharacteristic(typeof(CurrentSlatStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs new file mode 100644 index 0000000..6fe6e10 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class SmokeSensorService: Service + { + public SmokeSensorService() + : base("00000087-0000-1000-8000-0026BB765291", "Smoke Sensor") + { + // required characteristics + AddCharacteristic(typeof(SmokeDetectedCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(SmokeDetectedCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/src/platforms/homekit/Services/Definitions/SpeakerService.cs new file mode 100644 index 0000000..acdbfd9 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/SpeakerService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class SpeakerService: Service + { + public SpeakerService() + : base("00000113-0000-1000-8000-0026BB765291", "Speaker") + { + // required characteristics + AddCharacteristic(typeof(MuteCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(MuteCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs new file mode 100644 index 0000000..7bf68dd --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class StatelessProgrammableSwitchService: Service + { + public StatelessProgrammableSwitchService() + : base("00000089-0000-1000-8000-0026BB765291", "Stateless Programmable Switch") + { + // required characteristics + AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/SwitchService.cs b/src/platforms/homekit/Services/Definitions/SwitchService.cs new file mode 100644 index 0000000..c198ac8 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/SwitchService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class SwitchService: Service + { + public SwitchService() + : base("00000049-0000-1000-8000-0026BB765291", "Switch") + { + // required characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(OnCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs new file mode 100644 index 0000000..d24aa23 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs @@ -0,0 +1,43 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class TemperatureSensorService: Service + { + public TemperatureSensorService() + : base("0000008A-0000-1000-8000-0026BB765291", "Temperature Sensor") + { + // required characteristics + AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/src/platforms/homekit/Services/Definitions/ThermostatService.cs new file mode 100644 index 0000000..128728f --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/ThermostatService.cs @@ -0,0 +1,51 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ThermostatService: Service + { + public ThermostatService() + : base("0000004A-0000-1000-8000-0026BB765291", "Thermostat") + { + // required characteristics + AddCharacteristic(typeof(CurrentHeatingCoolingStateCharacteristic)) + .AddCharacteristic(typeof(TargetHeatingCoolingStateCharacteristic)) + .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + .AddCharacteristic(typeof(TargetTemperatureCharacteristic)) + .AddCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentHeatingCoolingStateCharacteristic)) + .AddCharacteristic(typeof(TargetHeatingCoolingStateCharacteristic)) + .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + .AddCharacteristic(typeof(TargetTemperatureCharacteristic)) + .AddCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/ValveService.cs b/src/platforms/homekit/Services/Definitions/ValveService.cs new file mode 100644 index 0000000..f0353a9 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/ValveService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ValveService: Service + { + public ValveService() + : base("000000D0-0000-1000-8000-0026BB765291", "Valve") + { + // required characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(InUseCharacteristic)) + .AddCharacteristic(typeof(ValveTypeCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(ActiveCharacteristic)) + .AddCharacteristic(typeof(InUseCharacteristic)) + .AddCharacteristic(typeof(ValveTypeCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs new file mode 100644 index 0000000..c9fbc3b --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class WindowCoveringService: Service + { + public WindowCoveringService() + : base("0000008C-0000-1000-8000-0026BB765291", "Window Covering") + { + // required characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + ; + } + } +} + diff --git a/src/platforms/homekit/Services/Definitions/WindowService.cs b/src/platforms/homekit/Services/Definitions/WindowService.cs new file mode 100644 index 0000000..d467277 --- /dev/null +++ b/src/platforms/homekit/Services/Definitions/WindowService.cs @@ -0,0 +1,47 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class WindowService: Service + { + public WindowService() + : base("0000008B-0000-1000-8000-0026BB765291", "Window") + { + // required characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + ; + + // optional characteristics + AddCharacteristic(typeof(CurrentPositionCharacteristic)) + .AddCharacteristic(typeof(TargetPositionCharacteristic)) + .AddCharacteristic(typeof(PositionStateCharacteristic)) + ; + } + } +} + From 7e03b25c3a59e592fe5d220c545e968012cb6a4c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 12:32:28 +0300 Subject: [PATCH 062/152] const fix in characteristic definitions. --- contrib/importer/characteristic.html | 2 +- .../Definitions/ActiveCharacteristic.cs | 4 ++-- .../AirParticulateSizeCharacteristic.cs | 4 ++-- .../Definitions/AirQualityCharacteristic.cs | 12 ++++++------ .../CarbonDioxideDetectedCharacteristic.cs | 4 ++-- .../CarbonMonoxideDetectedCharacteristic.cs | 4 ++-- .../Definitions/ChargingStateCharacteristic.cs | 6 +++--- .../ContactSensorStateCharacteristic.cs | 4 ++-- .../CurrentAirPurifierStateCharacteristic.cs | 6 +++--- .../CurrentDoorStateCharacteristic.cs | 10 +++++----- .../CurrentFanStateCharacteristic.cs | 6 +++--- .../CurrentHeaterCoolerStateCharacteristic.cs | 8 ++++---- ...CurrentHeatingCoolingStateCharacteristic.cs | 6 +++--- ...umidifierDehumidifierStateCharacteristic.cs | 8 ++++---- .../CurrentSlatStateCharacteristic.cs | 6 +++--- .../FilterChangeIndicationCharacteristic.cs | 4 ++-- .../Definitions/InUseCharacteristic.cs | 4 ++-- .../Definitions/IsConfiguredCharacteristic.cs | 4 ++-- .../Definitions/LeakDetectedCharacteristic.cs | 4 ++-- .../LockCurrentStateCharacteristic.cs | 8 ++++---- .../LockLastKnownActionCharacteristic.cs | 18 +++++++++--------- .../LockPhysicalControlsCharacteristic.cs | 4 ++-- .../LockTargetStateCharacteristic.cs | 4 ++-- .../OccupancyDetectedCharacteristic.cs | 4 ++-- .../Definitions/PositionStateCharacteristic.cs | 6 +++--- .../Definitions/ProgramModeCharacteristic.cs | 6 +++--- .../ProgrammableSwitchEventCharacteristic.cs | 6 +++--- .../RotationDirectionCharacteristic.cs | 4 ++-- ...SecuritySystemCurrentStateCharacteristic.cs | 10 +++++----- .../SecuritySystemTargetStateCharacteristic.cs | 8 ++++---- .../ServiceLabelNamespaceCharacteristic.cs | 4 ++-- .../Definitions/SlatTypeCharacteristic.cs | 4 ++-- .../Definitions/SmokeDetectedCharacteristic.cs | 4 ++-- .../Definitions/StatusFaultCharacteristic.cs | 4 ++-- .../Definitions/StatusJammedCharacteristic.cs | 4 ++-- .../StatusLowBatteryCharacteristic.cs | 4 ++-- .../StatusTamperedCharacteristic.cs | 4 ++-- .../Definitions/SwingModeCharacteristic.cs | 4 ++-- .../TargetAirPurifierStateCharacteristic.cs | 4 ++-- .../TargetAirQualityCharacteristic.cs | 6 +++--- .../TargetDoorStateCharacteristic.cs | 4 ++-- .../TargetFanStateCharacteristic.cs | 4 ++-- .../TargetHeaterCoolerStateCharacteristic.cs | 6 +++--- .../TargetHeatingCoolingStateCharacteristic.cs | 8 ++++---- ...umidifierDehumidifierStateCharacteristic.cs | 6 +++--- .../TargetSlatStateCharacteristic.cs | 4 ++-- .../TemperatureDisplayUnitsCharacteristic.cs | 4 ++-- .../Definitions/ValveTypeCharacteristic.cs | 8 ++++---- 48 files changed, 135 insertions(+), 135 deletions(-) diff --git a/contrib/importer/characteristic.html b/contrib/importer/characteristic.html index 8ba94b1..e79dc8a 100644 --- a/contrib/importer/characteristic.html +++ b/contrib/importer/characteristic.html @@ -31,7 +31,7 @@ {% for key,value in characteristic.Constraints.ValidValues -%} {%- set name = value.toUpperCase().replace(r/[^\w]+/g, '_') -%} {% if r/^[1-9]/.test(name) -%}{%- set name = '_' + name -%}{%- endif %} - public static int {{ name }} = {{ key }}; + public const int {{ name }} = {{ key }}; {%- endfor %} {%- endif %} diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs index 8a857f7..704eec1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ActiveCharacteristic: Characteristic { - public static int INACTIVE = 0; - public static int ACTIVE = 1; + public const int INACTIVE = 0; + public const int ACTIVE = 1; public ActiveCharacteristic(): base( uuid: "000000B0-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs index 6634a95..2af5803 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class AirParticulateSizeCharacteristic: Characteristic { - public static int _2_5_M = 0; - public static int _10_M = 1; + public const int _2_5_M = 0; + public const int _10_M = 1; public AirParticulateSizeCharacteristic(): base( uuid: "00000065-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs index 8e1c661..dc4fe17 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs @@ -28,12 +28,12 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class AirQualityCharacteristic: Characteristic { - public static int UNKNOWN = 0; - public static int EXCELLENT = 1; - public static int GOOD = 2; - public static int FAIR = 3; - public static int INFERIOR = 4; - public static int POOR = 5; + public const int UNKNOWN = 0; + public const int EXCELLENT = 1; + public const int GOOD = 2; + public const int FAIR = 3; + public const int INFERIOR = 4; + public const int POOR = 5; public AirQualityCharacteristic(): base( uuid: "00000095-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs index 58fe217..8e13240 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CarbonDioxideDetectedCharacteristic: Characteristic { - public static int CO2_LEVELS_NORMAL = 0; - public static int CO2_LEVELS_ABNORMAL = 1; + public const int CO2_LEVELS_NORMAL = 0; + public const int CO2_LEVELS_ABNORMAL = 1; public CarbonDioxideDetectedCharacteristic(): base( uuid: "00000092-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs index f6828fc..84aba42 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CarbonMonoxideDetectedCharacteristic: Characteristic { - public static int CO_LEVELS_NORMAL = 0; - public static int CO_LEVELS_ABNORMAL = 1; + public const int CO_LEVELS_NORMAL = 0; + public const int CO_LEVELS_ABNORMAL = 1; public CarbonMonoxideDetectedCharacteristic(): base( uuid: "00000069-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs index 1ec780e..38bac99 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ChargingStateCharacteristic: Characteristic { - public static int NOT_CHARGING = 0; - public static int CHARGING = 1; - public static int NOT_CHARGEABLE = 2; + public const int NOT_CHARGING = 0; + public const int CHARGING = 1; + public const int NOT_CHARGEABLE = 2; public ChargingStateCharacteristic(): base( uuid: "0000008F-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs index 2594bfe..06bf530 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ContactSensorStateCharacteristic: Characteristic { - public static int CONTACT_DETECTED = 0; - public static int CONTACT_NOT_DETECTED = 1; + public const int CONTACT_DETECTED = 0; + public const int CONTACT_NOT_DETECTED = 1; public ContactSensorStateCharacteristic(): base( uuid: "0000006A-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs index 1ea5776..b248747 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentAirPurifierStateCharacteristic: Characteristic { - public static int INACTIVE = 0; - public static int IDLE = 1; - public static int PURIFYING_AIR = 2; + public const int INACTIVE = 0; + public const int IDLE = 1; + public const int PURIFYING_AIR = 2; public CurrentAirPurifierStateCharacteristic(): base( uuid: "000000A9-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs index 25d876d..2a013ed 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs @@ -28,11 +28,11 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentDoorStateCharacteristic: Characteristic { - public static int OPEN = 0; - public static int CLOSED = 1; - public static int OPENING = 2; - public static int CLOSING = 3; - public static int STOPPED = 4; + public const int OPEN = 0; + public const int CLOSED = 1; + public const int OPENING = 2; + public const int CLOSING = 3; + public const int STOPPED = 4; public CurrentDoorStateCharacteristic(): base( uuid: "0000000E-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs index e7f5a75..34f0624 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentFanStateCharacteristic: Characteristic { - public static int INACTIVE = 0; - public static int IDLE = 1; - public static int BLOWING_AIR = 2; + public const int INACTIVE = 0; + public const int IDLE = 1; + public const int BLOWING_AIR = 2; public CurrentFanStateCharacteristic(): base( uuid: "000000AF-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs index bf904f3..4e81b0b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHeaterCoolerStateCharacteristic: Characteristic { - public static int INACTIVE = 0; - public static int IDLE = 1; - public static int HEATING = 2; - public static int COOLING = 3; + public const int INACTIVE = 0; + public const int IDLE = 1; + public const int HEATING = 2; + public const int COOLING = 3; public CurrentHeaterCoolerStateCharacteristic(): base( uuid: "000000B1-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs index 939f20e..cc1493f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHeatingCoolingStateCharacteristic: Characteristic { - public static int OFF = 0; - public static int HEAT = 1; - public static int COOL = 2; + public const int OFF = 0; + public const int HEAT = 1; + public const int COOL = 2; public CurrentHeatingCoolingStateCharacteristic(): base( uuid: "0000000F-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs index f942493..ddfda2d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHumidifierDehumidifierStateCharacteristic: Characteristic { - public static int INACTIVE = 0; - public static int IDLE = 1; - public static int HUMIDIFYING = 2; - public static int DEHUMIDIFYING = 3; + public const int INACTIVE = 0; + public const int IDLE = 1; + public const int HUMIDIFYING = 2; + public const int DEHUMIDIFYING = 3; public CurrentHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B3-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs index eee4b05..46180d3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentSlatStateCharacteristic: Characteristic { - public static int FIXED = 0; - public static int JAMMED = 1; - public static int SWINGING = 2; + public const int FIXED = 0; + public const int JAMMED = 1; + public const int SWINGING = 2; public CurrentSlatStateCharacteristic(): base( uuid: "000000AA-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs index 5e59dee..180ee1f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class FilterChangeIndicationCharacteristic: Characteristic { - public static int FILTER_OK = 0; - public static int CHANGE_FILTER = 1; + public const int FILTER_OK = 0; + public const int CHANGE_FILTER = 1; public FilterChangeIndicationCharacteristic(): base( uuid: "000000AC-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs index 36d5c74..03e9cd8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class InUseCharacteristic: Characteristic { - public static int NOT_IN_USE = 0; - public static int IN_USE = 1; + public const int NOT_IN_USE = 0; + public const int IN_USE = 1; public InUseCharacteristic(): base( uuid: "000000D2-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs index 391128d..48a7a1b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class IsConfiguredCharacteristic: Characteristic { - public static int NOT_CONFIGURED = 0; - public static int CONFIGURED = 1; + public const int NOT_CONFIGURED = 0; + public const int CONFIGURED = 1; public IsConfiguredCharacteristic(): base( uuid: "000000D6-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs index 51ecbb3..d70fbcd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LeakDetectedCharacteristic: Characteristic { - public static int LEAK_NOT_DETECTED = 0; - public static int LEAK_DETECTED = 1; + public const int LEAK_NOT_DETECTED = 0; + public const int LEAK_DETECTED = 1; public LeakDetectedCharacteristic(): base( uuid: "00000070-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs index dcd8c6c..8de407f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockCurrentStateCharacteristic: Characteristic { - public static int UNSECURED = 0; - public static int SECURED = 1; - public static int JAMMED = 2; - public static int UNKNOWN = 3; + public const int UNSECURED = 0; + public const int SECURED = 1; + public const int JAMMED = 2; + public const int UNKNOWN = 3; public LockCurrentStateCharacteristic(): base( uuid: "0000001D-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs index 66e3f6b..e2b1407 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs @@ -28,15 +28,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockLastKnownActionCharacteristic: Characteristic { - public static int SECURED_PHYSICALLY_INTERIOR = 0; - public static int UNSECURED_PHYSICALLY_INTERIOR = 1; - public static int SECURED_PHYSICALLY_EXTERIOR = 2; - public static int UNSECURED_PHYSICALLY_EXTERIOR = 3; - public static int SECURED_BY_KEYPAD = 4; - public static int UNSECURED_BY_KEYPAD = 5; - public static int SECURED_REMOTELY = 6; - public static int UNSECURED_REMOTELY = 7; - public static int SECURED_BY_AUTO_SECURE_TIMEOUT = 8; + public const int SECURED_PHYSICALLY_INTERIOR = 0; + public const int UNSECURED_PHYSICALLY_INTERIOR = 1; + public const int SECURED_PHYSICALLY_EXTERIOR = 2; + public const int UNSECURED_PHYSICALLY_EXTERIOR = 3; + public const int SECURED_BY_KEYPAD = 4; + public const int UNSECURED_BY_KEYPAD = 5; + public const int SECURED_REMOTELY = 6; + public const int UNSECURED_REMOTELY = 7; + public const int SECURED_BY_AUTO_SECURE_TIMEOUT = 8; public LockLastKnownActionCharacteristic(): base( uuid: "0000001C-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs index 30f310b..37249cc 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockPhysicalControlsCharacteristic: Characteristic { - public static int CONTROL_LOCK_DISABLED = 0; - public static int CONTROL_LOCK_ENABLED = 1; + public const int CONTROL_LOCK_DISABLED = 0; + public const int CONTROL_LOCK_ENABLED = 1; public LockPhysicalControlsCharacteristic(): base( uuid: "000000A7-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs index ccdbc2b..32591f5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockTargetStateCharacteristic: Characteristic { - public static int UNSECURED = 0; - public static int SECURED = 1; + public const int UNSECURED = 0; + public const int SECURED = 1; public LockTargetStateCharacteristic(): base( uuid: "0000001E-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs index c0137d7..7853a3c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class OccupancyDetectedCharacteristic: Characteristic { - public static int OCCUPANCY_NOT_DETECTED = 0; - public static int OCCUPANCY_DETECTED = 1; + public const int OCCUPANCY_NOT_DETECTED = 0; + public const int OCCUPANCY_DETECTED = 1; public OccupancyDetectedCharacteristic(): base( uuid: "00000071-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs index f270077..8ba7313 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class PositionStateCharacteristic: Characteristic { - public static int DECREASING = 0; - public static int INCREASING = 1; - public static int STOPPED = 2; + public const int DECREASING = 0; + public const int INCREASING = 1; + public const int STOPPED = 2; public PositionStateCharacteristic(): base( uuid: "00000072-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs index 693e2e8..1c87551 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ProgramModeCharacteristic: Characteristic { - public static int NO_PROGRAM_SCHEDULED = 0; - public static int PROGRAM_SCHEDULED = 1; - public static int PROGRAM_SCHEDULED_MANUAL_MODE_ = 2; + public const int NO_PROGRAM_SCHEDULED = 0; + public const int PROGRAM_SCHEDULED = 1; + public const int PROGRAM_SCHEDULED_MANUAL_MODE_ = 2; public ProgramModeCharacteristic(): base( uuid: "000000D1-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs index f2fa2a0..b24eb1c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ProgrammableSwitchEventCharacteristic: Characteristic { - public static int SINGLE_PRESS = 0; - public static int DOUBLE_PRESS = 1; - public static int LONG_PRESS = 2; + public const int SINGLE_PRESS = 0; + public const int DOUBLE_PRESS = 1; + public const int LONG_PRESS = 2; public ProgrammableSwitchEventCharacteristic(): base( uuid: "00000073-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs index 4b772d9..d3c87ab 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class RotationDirectionCharacteristic: Characteristic { - public static int CLOCKWISE = 0; - public static int COUNTER_CLOCKWISE = 1; + public const int CLOCKWISE = 0; + public const int COUNTER_CLOCKWISE = 1; public RotationDirectionCharacteristic(): base( uuid: "00000028-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs index ea62a61..048de16 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs @@ -28,11 +28,11 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SecuritySystemCurrentStateCharacteristic: Characteristic { - public static int STAY_ARM = 0; - public static int AWAY_ARM = 1; - public static int NIGHT_ARM = 2; - public static int DISARMED = 3; - public static int ALARM_TRIGGERED = 4; + public const int STAY_ARM = 0; + public const int AWAY_ARM = 1; + public const int NIGHT_ARM = 2; + public const int DISARMED = 3; + public const int ALARM_TRIGGERED = 4; public SecuritySystemCurrentStateCharacteristic(): base( uuid: "00000066-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs index 2c86e9d..f08dd07 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SecuritySystemTargetStateCharacteristic: Characteristic { - public static int STAY_ARM = 0; - public static int AWAY_ARM = 1; - public static int NIGHT_ARM = 2; - public static int DISARM = 3; + public const int STAY_ARM = 0; + public const int AWAY_ARM = 1; + public const int NIGHT_ARM = 2; + public const int DISARM = 3; public SecuritySystemTargetStateCharacteristic(): base( uuid: "00000067-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs index 685898c..9aa8b8d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ServiceLabelNamespaceCharacteristic: Characteristic { - public static int DOTS = 0; - public static int ARABIC_NUMERALS = 1; + public const int DOTS = 0; + public const int ARABIC_NUMERALS = 1; public ServiceLabelNamespaceCharacteristic(): base( uuid: "000000CD-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs index 747c9f0..71bb85b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SlatTypeCharacteristic: Characteristic { - public static int HORIZONTAL = 0; - public static int VERTICAL = 1; + public const int HORIZONTAL = 0; + public const int VERTICAL = 1; public SlatTypeCharacteristic(): base( uuid: "000000C0-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs index 2a53c08..68e8ba0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SmokeDetectedCharacteristic: Characteristic { - public static int SMOKE_NOT_DETECTED = 0; - public static int SMOKE_DETECTED = 1; + public const int SMOKE_NOT_DETECTED = 0; + public const int SMOKE_DETECTED = 1; public SmokeDetectedCharacteristic(): base( uuid: "00000076-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs index d7b7558..8285fa9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusFaultCharacteristic: Characteristic { - public static int NO_FAULT = 0; - public static int GENERAL_FAULT = 1; + public const int NO_FAULT = 0; + public const int GENERAL_FAULT = 1; public StatusFaultCharacteristic(): base( uuid: "00000077-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs index e8279db..5dfb72c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusJammedCharacteristic: Characteristic { - public static int NOT_JAMMED = 0; - public static int JAMMED = 1; + public const int NOT_JAMMED = 0; + public const int JAMMED = 1; public StatusJammedCharacteristic(): base( uuid: "00000078-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs index dd373c6..ebfe60d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusLowBatteryCharacteristic: Characteristic { - public static int BATTERY_LEVEL_NORMAL = 0; - public static int BATTERY_LEVEL_LOW = 1; + public const int BATTERY_LEVEL_NORMAL = 0; + public const int BATTERY_LEVEL_LOW = 1; public StatusLowBatteryCharacteristic(): base( uuid: "00000079-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs index 44a01cf..462c24c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusTamperedCharacteristic: Characteristic { - public static int NOT_TAMPERED = 0; - public static int TAMPERED = 1; + public const int NOT_TAMPERED = 0; + public const int TAMPERED = 1; public StatusTamperedCharacteristic(): base( uuid: "0000007A-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs index 199932c..61dbf35 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SwingModeCharacteristic: Characteristic { - public static int SWING_DISABLED = 0; - public static int SWING_ENABLED = 1; + public const int SWING_DISABLED = 0; + public const int SWING_ENABLED = 1; public SwingModeCharacteristic(): base( uuid: "000000B6-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs index ea2efae..03d5d1a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetAirPurifierStateCharacteristic: Characteristic { - public static int MANUAL = 0; - public static int AUTO = 1; + public const int MANUAL = 0; + public const int AUTO = 1; public TargetAirPurifierStateCharacteristic(): base( uuid: "000000A8-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs index cfcf5a2..e176d80 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetAirQualityCharacteristic: Characteristic { - public static int EXCELLENT = 0; - public static int GOOD = 1; - public static int FAIR = 2; + public const int EXCELLENT = 0; + public const int GOOD = 1; + public const int FAIR = 2; public TargetAirQualityCharacteristic(): base( uuid: "000000AE-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs index 6b21631..b581bef 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetDoorStateCharacteristic: Characteristic { - public static int OPEN = 0; - public static int CLOSED = 1; + public const int OPEN = 0; + public const int CLOSED = 1; public TargetDoorStateCharacteristic(): base( uuid: "00000032-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs index 1727491..16e3f11 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetFanStateCharacteristic: Characteristic { - public static int MANUAL = 0; - public static int AUTO = 1; + public const int MANUAL = 0; + public const int AUTO = 1; public TargetFanStateCharacteristic(): base( uuid: "000000BF-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs index b41d35f..b99c570 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHeaterCoolerStateCharacteristic: Characteristic { - public static int AUTO = 0; - public static int HEAT = 1; - public static int COOL = 2; + public const int AUTO = 0; + public const int HEAT = 1; + public const int COOL = 2; public TargetHeaterCoolerStateCharacteristic(): base( uuid: "000000B2-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs index 260e41e..622cb30 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHeatingCoolingStateCharacteristic: Characteristic { - public static int OFF = 0; - public static int HEAT = 1; - public static int COOL = 2; - public static int AUTO = 3; + public const int OFF = 0; + public const int HEAT = 1; + public const int COOL = 2; + public const int AUTO = 3; public TargetHeatingCoolingStateCharacteristic(): base( uuid: "00000033-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs index 758a4b9..d38e3f5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHumidifierDehumidifierStateCharacteristic: Characteristic { - public static int HUMIDIFIER_OR_DEHUMIDIFIER = 0; - public static int HUMIDIFIER = 1; - public static int DEHUMIDIFIER = 2; + public const int HUMIDIFIER_OR_DEHUMIDIFIER = 0; + public const int HUMIDIFIER = 1; + public const int DEHUMIDIFIER = 2; public TargetHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B4-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs index 25ed798..2f5291f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetSlatStateCharacteristic: Characteristic { - public static int MANUAL = 0; - public static int AUTO = 1; + public const int MANUAL = 0; + public const int AUTO = 1; public TargetSlatStateCharacteristic(): base( uuid: "000000BE-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs index 50ef7ee..720c668 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TemperatureDisplayUnitsCharacteristic: Characteristic { - public static int CELSIUS = 0; - public static int FAHRENHEIT = 1; + public const int CELSIUS = 0; + public const int FAHRENHEIT = 1; public TemperatureDisplayUnitsCharacteristic(): base( uuid: "00000036-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs index 40f40d5..0a201bf 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ValveTypeCharacteristic: Characteristic { - public static int GENERIC_VALVE = 0; - public static int IRRIGATION = 1; - public static int SHOWER_HEAD = 2; - public static int WATER_FAUCET = 3; + public const int GENERIC_VALVE = 0; + public const int IRRIGATION = 1; + public const int SHOWER_HEAD = 2; + public const int WATER_FAUCET = 3; public ValveTypeCharacteristic(): base( uuid: "000000D5-0000-1000-8000-0026BB765291", From 31199ebf1908b2474f76102fa21cbff98831110a Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 13:03:20 +0300 Subject: [PATCH 063/152] tiny change in characteristic.html --- contrib/importer/characteristic.html | 2 +- contrib/importer/import.js | 12 +++++++++--- .../Definitions/ActiveCharacteristic.cs | 4 ++-- .../AirParticulateSizeCharacteristic.cs | 4 ++-- .../Definitions/AirQualityCharacteristic.cs | 12 ++++++------ .../CarbonDioxideDetectedCharacteristic.cs | 4 ++-- .../CarbonMonoxideDetectedCharacteristic.cs | 4 ++-- .../Definitions/ChargingStateCharacteristic.cs | 6 +++--- .../ContactSensorStateCharacteristic.cs | 4 ++-- .../CurrentAirPurifierStateCharacteristic.cs | 6 +++--- .../CurrentDoorStateCharacteristic.cs | 10 +++++----- .../CurrentFanStateCharacteristic.cs | 6 +++--- .../CurrentHeaterCoolerStateCharacteristic.cs | 8 ++++---- ...CurrentHeatingCoolingStateCharacteristic.cs | 6 +++--- ...umidifierDehumidifierStateCharacteristic.cs | 8 ++++---- .../CurrentSlatStateCharacteristic.cs | 6 +++--- .../FilterChangeIndicationCharacteristic.cs | 4 ++-- .../Definitions/InUseCharacteristic.cs | 4 ++-- .../Definitions/IsConfiguredCharacteristic.cs | 4 ++-- .../Definitions/LeakDetectedCharacteristic.cs | 4 ++-- .../LockCurrentStateCharacteristic.cs | 8 ++++---- .../LockLastKnownActionCharacteristic.cs | 18 +++++++++--------- .../LockPhysicalControlsCharacteristic.cs | 4 ++-- .../LockTargetStateCharacteristic.cs | 4 ++-- .../OccupancyDetectedCharacteristic.cs | 4 ++-- .../Definitions/PositionStateCharacteristic.cs | 6 +++--- .../Definitions/ProgramModeCharacteristic.cs | 6 +++--- .../ProgrammableSwitchEventCharacteristic.cs | 6 +++--- .../RotationDirectionCharacteristic.cs | 4 ++-- ...SecuritySystemCurrentStateCharacteristic.cs | 10 +++++----- .../SecuritySystemTargetStateCharacteristic.cs | 8 ++++---- .../ServiceLabelNamespaceCharacteristic.cs | 4 ++-- .../Definitions/SlatTypeCharacteristic.cs | 4 ++-- .../Definitions/SmokeDetectedCharacteristic.cs | 4 ++-- .../Definitions/StatusFaultCharacteristic.cs | 4 ++-- .../Definitions/StatusJammedCharacteristic.cs | 4 ++-- .../StatusLowBatteryCharacteristic.cs | 4 ++-- .../StatusTamperedCharacteristic.cs | 4 ++-- .../Definitions/SwingModeCharacteristic.cs | 4 ++-- .../TargetAirPurifierStateCharacteristic.cs | 4 ++-- .../TargetAirQualityCharacteristic.cs | 6 +++--- .../TargetDoorStateCharacteristic.cs | 4 ++-- .../TargetFanStateCharacteristic.cs | 4 ++-- .../TargetHeaterCoolerStateCharacteristic.cs | 6 +++--- .../TargetHeatingCoolingStateCharacteristic.cs | 8 ++++---- ...umidifierDehumidifierStateCharacteristic.cs | 6 +++--- .../TargetSlatStateCharacteristic.cs | 4 ++-- .../TemperatureDisplayUnitsCharacteristic.cs | 4 ++-- .../Definitions/ValveTypeCharacteristic.cs | 8 ++++---- 49 files changed, 144 insertions(+), 138 deletions(-) diff --git a/contrib/importer/characteristic.html b/contrib/importer/characteristic.html index e79dc8a..4d02f57 100644 --- a/contrib/importer/characteristic.html +++ b/contrib/importer/characteristic.html @@ -29,7 +29,7 @@ { {% if characteristic.Constraints and characteristic.Constraints.ValidValues -%} {% for key,value in characteristic.Constraints.ValidValues -%} - {%- set name = value.toUpperCase().replace(r/[^\w]+/g, '_') -%} + {%- set name = ucwords(value).replace(r/[^\w]+/g, '_') -%} {% if r/^[1-9]/.test(name) -%}{%- set name = '_' + name -%}{%- endif %} public const int {{ name }} = {{ key }}; {%- endfor %} diff --git a/contrib/importer/import.js b/contrib/importer/import.js index 455cd7b..27af10b 100644 --- a/contrib/importer/import.js +++ b/contrib/importer/import.js @@ -28,7 +28,7 @@ function readCharacteristics(metadata) { var res = nunjucks.render('characteristic.html', { classyName: classyName, characteristic: characteristic, - capitalize: capitalize, + ucwords: ucwords, getCharacteristicUnit: getCharacteristicUnit, getCharacteristicFormat: getCharacteristicFormat, getCharacteristicPermsKey: getCharacteristicPermsKey, @@ -53,8 +53,7 @@ function readServices(metadata) { var res = nunjucks.render('service.html', { classyName: classyName, service: service, - characteristics: characteristics, - capitalize: capitalize, + characteristics: characteristics }); output.write(res); @@ -99,4 +98,11 @@ function getCharacteristicPermsKey(perm) { case "uncnotify": return undefined; default: throw new Error("Unknown characteristic permission '" + perm + "'"); } +} + +function ucwords (str) { + return (str + '') + .replace(/^(.)|\s+(.)/g, function ($1) { + return $1.toUpperCase() + }) } \ No newline at end of file diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs index 704eec1..c4e6894 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ActiveCharacteristic: Characteristic { - public const int INACTIVE = 0; - public const int ACTIVE = 1; + public const int Inactive = 0; + public const int Active = 1; public ActiveCharacteristic(): base( uuid: "000000B0-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs index 2af5803..6943add 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class AirParticulateSizeCharacteristic: Characteristic { - public const int _2_5_M = 0; - public const int _10_M = 1; + public const int _2_5_m = 0; + public const int _10_m = 1; public AirParticulateSizeCharacteristic(): base( uuid: "00000065-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs index dc4fe17..4a8d32e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs @@ -28,12 +28,12 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class AirQualityCharacteristic: Characteristic { - public const int UNKNOWN = 0; - public const int EXCELLENT = 1; - public const int GOOD = 2; - public const int FAIR = 3; - public const int INFERIOR = 4; - public const int POOR = 5; + public const int Unknown = 0; + public const int Excellent = 1; + public const int Good = 2; + public const int Fair = 3; + public const int Inferior = 4; + public const int Poor = 5; public AirQualityCharacteristic(): base( uuid: "00000095-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs index 8e13240..ba3ea94 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CarbonDioxideDetectedCharacteristic: Characteristic { - public const int CO2_LEVELS_NORMAL = 0; - public const int CO2_LEVELS_ABNORMAL = 1; + public const int CO2_Levels_Normal = 0; + public const int CO2_Levels_Abnormal = 1; public CarbonDioxideDetectedCharacteristic(): base( uuid: "00000092-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs index 84aba42..99c33da 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CarbonMonoxideDetectedCharacteristic: Characteristic { - public const int CO_LEVELS_NORMAL = 0; - public const int CO_LEVELS_ABNORMAL = 1; + public const int CO_Levels_Normal = 0; + public const int CO_Levels_Abnormal = 1; public CarbonMonoxideDetectedCharacteristic(): base( uuid: "00000069-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs index 38bac99..6c63552 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ChargingStateCharacteristic: Characteristic { - public const int NOT_CHARGING = 0; - public const int CHARGING = 1; - public const int NOT_CHARGEABLE = 2; + public const int Not_Charging = 0; + public const int Charging = 1; + public const int Not_Chargeable = 2; public ChargingStateCharacteristic(): base( uuid: "0000008F-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs index 06bf530..7ec7699 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ContactSensorStateCharacteristic: Characteristic { - public const int CONTACT_DETECTED = 0; - public const int CONTACT_NOT_DETECTED = 1; + public const int Contact_Detected = 0; + public const int Contact_Not_Detected = 1; public ContactSensorStateCharacteristic(): base( uuid: "0000006A-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs index b248747..fdf1038 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentAirPurifierStateCharacteristic: Characteristic { - public const int INACTIVE = 0; - public const int IDLE = 1; - public const int PURIFYING_AIR = 2; + public const int Inactive = 0; + public const int Idle = 1; + public const int Purifying_Air = 2; public CurrentAirPurifierStateCharacteristic(): base( uuid: "000000A9-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs index 2a013ed..73d9e0a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs @@ -28,11 +28,11 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentDoorStateCharacteristic: Characteristic { - public const int OPEN = 0; - public const int CLOSED = 1; - public const int OPENING = 2; - public const int CLOSING = 3; - public const int STOPPED = 4; + public const int Open = 0; + public const int Closed = 1; + public const int Opening = 2; + public const int Closing = 3; + public const int Stopped = 4; public CurrentDoorStateCharacteristic(): base( uuid: "0000000E-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs index 34f0624..97281cd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentFanStateCharacteristic: Characteristic { - public const int INACTIVE = 0; - public const int IDLE = 1; - public const int BLOWING_AIR = 2; + public const int Inactive = 0; + public const int Idle = 1; + public const int Blowing_Air = 2; public CurrentFanStateCharacteristic(): base( uuid: "000000AF-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs index 4e81b0b..1b4d43e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHeaterCoolerStateCharacteristic: Characteristic { - public const int INACTIVE = 0; - public const int IDLE = 1; - public const int HEATING = 2; - public const int COOLING = 3; + public const int Inactive = 0; + public const int Idle = 1; + public const int Heating = 2; + public const int Cooling = 3; public CurrentHeaterCoolerStateCharacteristic(): base( uuid: "000000B1-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs index cc1493f..ac12773 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHeatingCoolingStateCharacteristic: Characteristic { - public const int OFF = 0; - public const int HEAT = 1; - public const int COOL = 2; + public const int Off = 0; + public const int Heat = 1; + public const int Cool = 2; public CurrentHeatingCoolingStateCharacteristic(): base( uuid: "0000000F-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs index ddfda2d..00ae9ef 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentHumidifierDehumidifierStateCharacteristic: Characteristic { - public const int INACTIVE = 0; - public const int IDLE = 1; - public const int HUMIDIFYING = 2; - public const int DEHUMIDIFYING = 3; + public const int Inactive = 0; + public const int Idle = 1; + public const int Humidifying = 2; + public const int Dehumidifying = 3; public CurrentHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B3-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs index 46180d3..2344128 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class CurrentSlatStateCharacteristic: Characteristic { - public const int FIXED = 0; - public const int JAMMED = 1; - public const int SWINGING = 2; + public const int Fixed = 0; + public const int Jammed = 1; + public const int Swinging = 2; public CurrentSlatStateCharacteristic(): base( uuid: "000000AA-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs index 180ee1f..e8a24a8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class FilterChangeIndicationCharacteristic: Characteristic { - public const int FILTER_OK = 0; - public const int CHANGE_FILTER = 1; + public const int Filter_OK = 0; + public const int Change_Filter = 1; public FilterChangeIndicationCharacteristic(): base( uuid: "000000AC-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs index 03e9cd8..6c7dd0e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class InUseCharacteristic: Characteristic { - public const int NOT_IN_USE = 0; - public const int IN_USE = 1; + public const int Not_In_Use = 0; + public const int In_Use = 1; public InUseCharacteristic(): base( uuid: "000000D2-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs index 48a7a1b..43906fc 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class IsConfiguredCharacteristic: Characteristic { - public const int NOT_CONFIGURED = 0; - public const int CONFIGURED = 1; + public const int Not_Configured = 0; + public const int Configured = 1; public IsConfiguredCharacteristic(): base( uuid: "000000D6-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs index d70fbcd..dd58ec1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LeakDetectedCharacteristic: Characteristic { - public const int LEAK_NOT_DETECTED = 0; - public const int LEAK_DETECTED = 1; + public const int Leak_Not_Detected = 0; + public const int Leak_Detected = 1; public LeakDetectedCharacteristic(): base( uuid: "00000070-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs index 8de407f..1839748 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockCurrentStateCharacteristic: Characteristic { - public const int UNSECURED = 0; - public const int SECURED = 1; - public const int JAMMED = 2; - public const int UNKNOWN = 3; + public const int Unsecured = 0; + public const int Secured = 1; + public const int Jammed = 2; + public const int Unknown = 3; public LockCurrentStateCharacteristic(): base( uuid: "0000001D-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs index e2b1407..3e736fe 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs @@ -28,15 +28,15 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockLastKnownActionCharacteristic: Characteristic { - public const int SECURED_PHYSICALLY_INTERIOR = 0; - public const int UNSECURED_PHYSICALLY_INTERIOR = 1; - public const int SECURED_PHYSICALLY_EXTERIOR = 2; - public const int UNSECURED_PHYSICALLY_EXTERIOR = 3; - public const int SECURED_BY_KEYPAD = 4; - public const int UNSECURED_BY_KEYPAD = 5; - public const int SECURED_REMOTELY = 6; - public const int UNSECURED_REMOTELY = 7; - public const int SECURED_BY_AUTO_SECURE_TIMEOUT = 8; + public const int Secured_Physically_Interior = 0; + public const int Unsecured_Physically_Interior = 1; + public const int Secured_Physically_Exterior = 2; + public const int Unsecured_Physically_Exterior = 3; + public const int Secured_By_Keypad = 4; + public const int Unsecured_By_Keypad = 5; + public const int Secured_Remotely = 6; + public const int Unsecured_Remotely = 7; + public const int Secured_By_Auto_Secure_Timeout = 8; public LockLastKnownActionCharacteristic(): base( uuid: "0000001C-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs index 37249cc..4bd8ab6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockPhysicalControlsCharacteristic: Characteristic { - public const int CONTROL_LOCK_DISABLED = 0; - public const int CONTROL_LOCK_ENABLED = 1; + public const int Control_Lock_Disabled = 0; + public const int Control_Lock_Enabled = 1; public LockPhysicalControlsCharacteristic(): base( uuid: "000000A7-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs index 32591f5..97b29fb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class LockTargetStateCharacteristic: Characteristic { - public const int UNSECURED = 0; - public const int SECURED = 1; + public const int Unsecured = 0; + public const int Secured = 1; public LockTargetStateCharacteristic(): base( uuid: "0000001E-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs index 7853a3c..e78a0a8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class OccupancyDetectedCharacteristic: Characteristic { - public const int OCCUPANCY_NOT_DETECTED = 0; - public const int OCCUPANCY_DETECTED = 1; + public const int Occupancy_Not_Detected = 0; + public const int Occupancy_Detected = 1; public OccupancyDetectedCharacteristic(): base( uuid: "00000071-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs index 8ba7313..5563fc6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class PositionStateCharacteristic: Characteristic { - public const int DECREASING = 0; - public const int INCREASING = 1; - public const int STOPPED = 2; + public const int Decreasing = 0; + public const int Increasing = 1; + public const int Stopped = 2; public PositionStateCharacteristic(): base( uuid: "00000072-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs index 1c87551..f19ec72 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ProgramModeCharacteristic: Characteristic { - public const int NO_PROGRAM_SCHEDULED = 0; - public const int PROGRAM_SCHEDULED = 1; - public const int PROGRAM_SCHEDULED_MANUAL_MODE_ = 2; + public const int No_Program_Scheduled = 0; + public const int Program_Scheduled = 1; + public const int Program_Scheduled_Manual_Mode_ = 2; public ProgramModeCharacteristic(): base( uuid: "000000D1-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs index b24eb1c..fedb4b1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ProgrammableSwitchEventCharacteristic: Characteristic { - public const int SINGLE_PRESS = 0; - public const int DOUBLE_PRESS = 1; - public const int LONG_PRESS = 2; + public const int Single_Press = 0; + public const int Double_Press = 1; + public const int Long_Press = 2; public ProgrammableSwitchEventCharacteristic(): base( uuid: "00000073-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs index d3c87ab..11f6857 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class RotationDirectionCharacteristic: Characteristic { - public const int CLOCKWISE = 0; - public const int COUNTER_CLOCKWISE = 1; + public const int Clockwise = 0; + public const int Counter_clockwise = 1; public RotationDirectionCharacteristic(): base( uuid: "00000028-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs index 048de16..c73d510 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs @@ -28,11 +28,11 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SecuritySystemCurrentStateCharacteristic: Characteristic { - public const int STAY_ARM = 0; - public const int AWAY_ARM = 1; - public const int NIGHT_ARM = 2; - public const int DISARMED = 3; - public const int ALARM_TRIGGERED = 4; + public const int Stay_Arm = 0; + public const int Away_Arm = 1; + public const int Night_Arm = 2; + public const int Disarmed = 3; + public const int Alarm_Triggered = 4; public SecuritySystemCurrentStateCharacteristic(): base( uuid: "00000066-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs index f08dd07..7ca679c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SecuritySystemTargetStateCharacteristic: Characteristic { - public const int STAY_ARM = 0; - public const int AWAY_ARM = 1; - public const int NIGHT_ARM = 2; - public const int DISARM = 3; + public const int Stay_Arm = 0; + public const int Away_Arm = 1; + public const int Night_Arm = 2; + public const int Disarm = 3; public SecuritySystemTargetStateCharacteristic(): base( uuid: "00000067-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs index 9aa8b8d..32ea52a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ServiceLabelNamespaceCharacteristic: Characteristic { - public const int DOTS = 0; - public const int ARABIC_NUMERALS = 1; + public const int Dots = 0; + public const int Arabic_Numerals = 1; public ServiceLabelNamespaceCharacteristic(): base( uuid: "000000CD-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs index 71bb85b..83ba4e4 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SlatTypeCharacteristic: Characteristic { - public const int HORIZONTAL = 0; - public const int VERTICAL = 1; + public const int Horizontal = 0; + public const int Vertical = 1; public SlatTypeCharacteristic(): base( uuid: "000000C0-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs index 68e8ba0..80b9cd4 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SmokeDetectedCharacteristic: Characteristic { - public const int SMOKE_NOT_DETECTED = 0; - public const int SMOKE_DETECTED = 1; + public const int Smoke_Not_Detected = 0; + public const int Smoke_Detected = 1; public SmokeDetectedCharacteristic(): base( uuid: "00000076-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs index 8285fa9..66214c7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusFaultCharacteristic: Characteristic { - public const int NO_FAULT = 0; - public const int GENERAL_FAULT = 1; + public const int No_Fault = 0; + public const int General_Fault = 1; public StatusFaultCharacteristic(): base( uuid: "00000077-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs index 5dfb72c..076ad12 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusJammedCharacteristic: Characteristic { - public const int NOT_JAMMED = 0; - public const int JAMMED = 1; + public const int Not_Jammed = 0; + public const int Jammed = 1; public StatusJammedCharacteristic(): base( uuid: "00000078-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs index ebfe60d..0b6c319 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusLowBatteryCharacteristic: Characteristic { - public const int BATTERY_LEVEL_NORMAL = 0; - public const int BATTERY_LEVEL_LOW = 1; + public const int Battery_Level_Normal = 0; + public const int Battery_Level_Low = 1; public StatusLowBatteryCharacteristic(): base( uuid: "00000079-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs index 462c24c..9bd1f94 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class StatusTamperedCharacteristic: Characteristic { - public const int NOT_TAMPERED = 0; - public const int TAMPERED = 1; + public const int Not_Tampered = 0; + public const int Tampered = 1; public StatusTamperedCharacteristic(): base( uuid: "0000007A-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs index 61dbf35..40dafba 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class SwingModeCharacteristic: Characteristic { - public const int SWING_DISABLED = 0; - public const int SWING_ENABLED = 1; + public const int Swing_Disabled = 0; + public const int Swing_Enabled = 1; public SwingModeCharacteristic(): base( uuid: "000000B6-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs index 03d5d1a..4c57bce 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetAirPurifierStateCharacteristic: Characteristic { - public const int MANUAL = 0; - public const int AUTO = 1; + public const int Manual = 0; + public const int Auto = 1; public TargetAirPurifierStateCharacteristic(): base( uuid: "000000A8-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs index e176d80..c9de51b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetAirQualityCharacteristic: Characteristic { - public const int EXCELLENT = 0; - public const int GOOD = 1; - public const int FAIR = 2; + public const int Excellent = 0; + public const int Good = 1; + public const int Fair = 2; public TargetAirQualityCharacteristic(): base( uuid: "000000AE-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs index b581bef..2bf0870 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetDoorStateCharacteristic: Characteristic { - public const int OPEN = 0; - public const int CLOSED = 1; + public const int Open = 0; + public const int Closed = 1; public TargetDoorStateCharacteristic(): base( uuid: "00000032-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs index 16e3f11..c45c24d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetFanStateCharacteristic: Characteristic { - public const int MANUAL = 0; - public const int AUTO = 1; + public const int Manual = 0; + public const int Auto = 1; public TargetFanStateCharacteristic(): base( uuid: "000000BF-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs index b99c570..2033818 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHeaterCoolerStateCharacteristic: Characteristic { - public const int AUTO = 0; - public const int HEAT = 1; - public const int COOL = 2; + public const int Auto = 0; + public const int Heat = 1; + public const int Cool = 2; public TargetHeaterCoolerStateCharacteristic(): base( uuid: "000000B2-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs index 622cb30..5912f72 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHeatingCoolingStateCharacteristic: Characteristic { - public const int OFF = 0; - public const int HEAT = 1; - public const int COOL = 2; - public const int AUTO = 3; + public const int Off = 0; + public const int Heat = 1; + public const int Cool = 2; + public const int Auto = 3; public TargetHeatingCoolingStateCharacteristic(): base( uuid: "00000033-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs index d38e3f5..8b633a6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs @@ -28,9 +28,9 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetHumidifierDehumidifierStateCharacteristic: Characteristic { - public const int HUMIDIFIER_OR_DEHUMIDIFIER = 0; - public const int HUMIDIFIER = 1; - public const int DEHUMIDIFIER = 2; + public const int Humidifier_Or_Dehumidifier = 0; + public const int Humidifier = 1; + public const int Dehumidifier = 2; public TargetHumidifierDehumidifierStateCharacteristic(): base( uuid: "000000B4-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs index 2f5291f..b94d742 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TargetSlatStateCharacteristic: Characteristic { - public const int MANUAL = 0; - public const int AUTO = 1; + public const int Manual = 0; + public const int Auto = 1; public TargetSlatStateCharacteristic(): base( uuid: "000000BE-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs index 720c668..2d242d3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs @@ -28,8 +28,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class TemperatureDisplayUnitsCharacteristic: Characteristic { - public const int CELSIUS = 0; - public const int FAHRENHEIT = 1; + public const int Celsius = 0; + public const int Fahrenheit = 1; public TemperatureDisplayUnitsCharacteristic(): base( uuid: "00000036-0000-1000-8000-0026BB765291", diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs index 0a201bf..8d4571a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs @@ -28,10 +28,10 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions public class ValveTypeCharacteristic: Characteristic { - public const int GENERIC_VALVE = 0; - public const int IRRIGATION = 1; - public const int SHOWER_HEAD = 2; - public const int WATER_FAUCET = 3; + public const int Generic_Valve = 0; + public const int Irrigation = 1; + public const int Shower_Head = 2; + public const int Water_Faucet = 3; public ValveTypeCharacteristic(): base( uuid: "000000D5-0000-1000-8000-0026BB765291", From 1909758baca82cc28535ffc53ab228bfe5698daa Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 13:22:37 +0300 Subject: [PATCH 064/152] tiny bridgesetupmanager work. --- src/homer/Homer.csproj | 2 +- src/platforms/homekit/Accessories/AccessoryBase.cs | 5 +++++ src/platforms/homekit/Accessories/IAccessoryBase.cs | 2 ++ src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs | 4 ++-- .../Setup/Characteristics/ControlPointCharacteristic.cs | 2 +- .../Bridges/Setup/Characteristics/StateCharacteristic.cs | 4 ++-- .../Bridges/Setup/Characteristics/VersionCharacteristic.cs | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/homer/Homer.csproj b/src/homer/Homer.csproj index 728ea6a..6317a73 100644 --- a/src/homer/Homer.csproj +++ b/src/homer/Homer.csproj @@ -8,11 +8,11 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index d7ac4f1..35d1e57 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -86,5 +86,10 @@ public IService GetService(Type service) { return _services.ContainsKey(service) ? _services[service] : null; } + + public void Publish() + { + throw new NotImplementedException(); + } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 3a1a40d..5b93cc9 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -61,5 +61,7 @@ public interface IAccessoryBase : IEntity IService AddService(IService service); IService GetService(Type t); + + void Publish(); } } diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs index 66e4875..6c25d42 100644 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -44,8 +44,8 @@ public BridgeSetupManager(string uuid, string displayName) // create setup service. AddService(new SetupService()) - .AddCharacteristic(new StateCharacteristic()) - .AddCharacteristic(new VersionCharacteristic()) + .AddCharacteristic(new StateCharacteristic(0)) + .AddCharacteristic(new VersionCharacteristic("1.0")) .AddCharacteristic(controlPointCharacteristic); // set accessory information service characteristics diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs index 0d6804d..1db8157 100644 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs @@ -37,7 +37,7 @@ public ControlPointCharacteristic() : base( CharacteristicPermission.PairedRead, CharacteristicPermission.WriteResponse, CharacteristicPermission.Events - }) + }, value: null) { } } diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs index b824e80..f06a8f5 100644 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs @@ -28,7 +28,7 @@ namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics { public class StateCharacteristic: Characteristic { - public StateCharacteristic() : base( + public StateCharacteristic(byte value) : base( "77474A2F-FA98-485E-97BE-4762458774D8", "State", CharacteristicFormat.Uint8, @@ -36,7 +36,7 @@ public StateCharacteristic() : base( { CharacteristicPermission.PairedRead, CharacteristicPermission.Events - }, minValue: 0, maxValue: 1, minStep: 1, value: 0) + }, minValue: 0, maxValue: 1, minStep: 1, value: value) { } } diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs index b26af63..ed239f8 100644 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs +++ b/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs @@ -28,7 +28,7 @@ namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics { public class VersionCharacteristic : Characteristic { - public VersionCharacteristic() : base( + public VersionCharacteristic(string value) : base( "FD9FE4CC-D06F-4FFE-96C6-595D464E1026", "Version", CharacteristicFormat.String, @@ -36,7 +36,7 @@ public VersionCharacteristic() : base( { CharacteristicPermission.PairedRead, CharacteristicPermission.Events - }, value: "1.0") + }, value: value) { } } From a4ff1bb40eb4dc28ed30d63404f8471c838aa9d6 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 14:00:05 +0300 Subject: [PATCH 065/152] fixed services. --- contrib/importer/service.html | 2 +- src/homer/Servers/Server.cs | 9 +++++++++ .../Definitions/AccessoryInformationService.cs | 8 ++------ .../Services/Definitions/AirPurifierService.cs | 7 ++++--- .../Definitions/AirQualitySensorService.cs | 14 +++++++++++++- .../Services/Definitions/BatteryServiceService.cs | 4 +--- .../CameraRTPStreamManagementService.cs | 7 +------ .../Definitions/CarbonDioxideSensorService.cs | 8 +++++++- .../Definitions/CarbonMonoxideSensorService.cs | 8 +++++++- .../Services/Definitions/ContactSensorService.cs | 6 +++++- .../homekit/Services/Definitions/DoorService.cs | 6 +++--- .../Services/Definitions/DoorbellService.cs | 4 +++- .../homekit/Services/Definitions/FanService.cs | 4 +++- .../homekit/Services/Definitions/Fanv2Service.cs | 8 +++++++- .../homekit/Services/Definitions/FaucetService.cs | 3 ++- .../Definitions/FilterMaintenanceService.cs | 4 +++- .../Definitions/GarageDoorOpenerService.cs | 6 +++--- .../Services/Definitions/HeaterCoolerService.cs | 11 +++++++---- .../Definitions/HumidifierDehumidifierService.cs | 11 +++++++---- .../Services/Definitions/HumiditySensorService.cs | 6 +++++- .../Definitions/IrrigationSystemService.cs | 6 +++--- .../Services/Definitions/LeakSensorService.cs | 6 +++++- .../Services/Definitions/LightSensorService.cs | 6 +++++- .../Services/Definitions/LightbulbService.cs | 5 ++++- .../Services/Definitions/LockManagementService.cs | 10 ++++++++-- .../Services/Definitions/LockMechanismService.cs | 3 +-- .../Services/Definitions/MicrophoneService.cs | 3 +-- .../Services/Definitions/MotionSensorService.cs | 6 +++++- .../Services/Definitions/OccupancySensorService.cs | 6 +++++- .../homekit/Services/Definitions/OutletService.cs | 3 +-- .../Services/Definitions/SecuritySystemService.cs | 6 ++++-- .../Services/Definitions/ServiceLabelService.cs | 2 +- .../homekit/Services/Definitions/SlatService.cs | 6 ++++-- .../Services/Definitions/SmokeSensorService.cs | 6 +++++- .../homekit/Services/Definitions/SpeakerService.cs | 3 ++- .../StatelessProgrammableSwitchService.cs | 3 ++- .../homekit/Services/Definitions/SwitchService.cs | 2 +- .../Definitions/TemperatureSensorService.cs | 6 +++++- .../Services/Definitions/ThermostatService.cs | 10 +++++----- .../homekit/Services/Definitions/ValveService.cs | 9 ++++++--- .../Services/Definitions/WindowCoveringService.cs | 10 +++++++--- .../homekit/Services/Definitions/WindowService.cs | 6 +++--- 42 files changed, 176 insertions(+), 83 deletions(-) diff --git a/contrib/importer/service.html b/contrib/importer/service.html index ad7e224..70fff94 100644 --- a/contrib/importer/service.html +++ b/contrib/importer/service.html @@ -41,7 +41,7 @@ {% if service.OptionalCharacteristics -%} // optional characteristics - {% for value in service.RequiredCharacteristics -%} + {% for value in service.OptionalCharacteristics -%} {%- if not loop.first %}.{% endif -%} AddCharacteristic(typeof({{ characteristics[value] }}Characteristic)) {% if loop.last -%};{%- endif %} diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index c342c88..8b7bf82 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -24,6 +24,7 @@ using System; using System.Threading.Tasks; using Homer.Platform.HomeKit.Bridges.Setup; +using Makaretu.Dns; using Serilog; using uuid.net.Static_Classes.UUID_Factory; @@ -41,6 +42,14 @@ public async Task RunAsync() var uuid = generator.Generate("homer"); var bridge = new BridgeSetupManager(uuid, "homer"); + + var mdns = new MulticastService(); + + foreach (var a in MulticastService.GetIPAddresses()) + { + Logger.Information($"IP address {a}"); + } + } catch (Exception e) { diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index 1b644f9..d57220f 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -40,12 +40,8 @@ public AccessoryInformationService() ; // optional characteristics - AddCharacteristic(typeof(IdentifyCharacteristic)) - .AddCharacteristic(typeof(ManufacturerCharacteristic)) - .AddCharacteristic(typeof(ModelCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(SerialNumberCharacteristic)) - .AddCharacteristic(typeof(FirmwareRevisionCharacteristic)) + AddCharacteristic(typeof(HardwareRevisionCharacteristic)) + .AddCharacteristic(typeof(AccessoryFlagsCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs index bef9c80..d3ca94a 100644 --- a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs +++ b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs @@ -37,9 +37,10 @@ public AirPurifierService() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) - .AddCharacteristic(typeof(CurrentAirPurifierStateCharacteristic)) - .AddCharacteristic(typeof(TargetAirPurifierStateCharacteristic)) + AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SwingModeCharacteristic)) + .AddCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs index b073edc..f025ff0 100644 --- a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs @@ -35,7 +35,19 @@ public AirQualitySensorService() ; // optional characteristics - AddCharacteristic(typeof(AirQualityCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(OzoneDensityCharacteristic)) + .AddCharacteristic(typeof(NitrogenDioxideDensityCharacteristic)) + .AddCharacteristic(typeof(SulphurDioxideDensityCharacteristic)) + .AddCharacteristic(typeof(PM2_5DensityCharacteristic)) + .AddCharacteristic(typeof(PM10DensityCharacteristic)) + .AddCharacteristic(typeof(VOCDensityCharacteristic)) + .AddCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) + .AddCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs index 2fa02a7..aff3e8b 100644 --- a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs +++ b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs @@ -37,9 +37,7 @@ public BatteryServiceService() ; // optional characteristics - AddCharacteristic(typeof(BatteryLevelCharacteristic)) - .AddCharacteristic(typeof(ChargingStateCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs index 48af3d8..46e8849 100644 --- a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs @@ -40,12 +40,7 @@ public CameraRTPStreamManagementService() ; // optional characteristics - AddCharacteristic(typeof(SupportedVideoStreamConfigurationCharacteristic)) - .AddCharacteristic(typeof(SupportedAudioStreamConfigurationCharacteristic)) - .AddCharacteristic(typeof(SupportedRTPConfigurationCharacteristic)) - .AddCharacteristic(typeof(SelectedRTPStreamConfigurationCharacteristic)) - .AddCharacteristic(typeof(StreamingStatusCharacteristic)) - .AddCharacteristic(typeof(SetupEndpointsCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs index 5252afb..2035883 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs @@ -35,7 +35,13 @@ public CarbonDioxideSensorService() ; // optional characteristics - AddCharacteristic(typeof(CarbonDioxideDetectedCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) + .AddCharacteristic(typeof(CarbonDioxidePeakLevelCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs index 6851eeb..12ce92b 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs @@ -35,7 +35,13 @@ public CarbonMonoxideSensorService() ; // optional characteristics - AddCharacteristic(typeof(CarbonMonoxideDetectedCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) + .AddCharacteristic(typeof(CarbonMonoxidePeakLevelCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs index 227b1cd..14e70a6 100644 --- a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs @@ -35,7 +35,11 @@ public ContactSensorService() ; // optional characteristics - AddCharacteristic(typeof(ContactSensorStateCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/DoorService.cs b/src/platforms/homekit/Services/Definitions/DoorService.cs index d01a619..d052589 100644 --- a/src/platforms/homekit/Services/Definitions/DoorService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorService.cs @@ -37,9 +37,9 @@ public DoorService() ; // optional characteristics - AddCharacteristic(typeof(CurrentPositionCharacteristic)) - .AddCharacteristic(typeof(PositionStateCharacteristic)) - .AddCharacteristic(typeof(TargetPositionCharacteristic)) + AddCharacteristic(typeof(HoldPositionCharacteristic)) + .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/src/platforms/homekit/Services/Definitions/DoorbellService.cs index 1971ccb..b50ec80 100644 --- a/src/platforms/homekit/Services/Definitions/DoorbellService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorbellService.cs @@ -35,7 +35,9 @@ public DoorbellService() ; // optional characteristics - AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + AddCharacteristic(typeof(BrightnessCharacteristic)) + .AddCharacteristic(typeof(VolumeCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FanService.cs b/src/platforms/homekit/Services/Definitions/FanService.cs index 314fa02..6c59d52 100644 --- a/src/platforms/homekit/Services/Definitions/FanService.cs +++ b/src/platforms/homekit/Services/Definitions/FanService.cs @@ -35,7 +35,9 @@ public FanService() ; // optional characteristics - AddCharacteristic(typeof(OnCharacteristic)) + AddCharacteristic(typeof(RotationDirectionCharacteristic)) + .AddCharacteristic(typeof(RotationSpeedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs index ce89a58..59b1413 100644 --- a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs +++ b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs @@ -35,7 +35,13 @@ public Fanv2Service() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) + AddCharacteristic(typeof(CurrentFanStateCharacteristic)) + .AddCharacteristic(typeof(TargetFanStateCharacteristic)) + .AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(RotationDirectionCharacteristic)) + .AddCharacteristic(typeof(RotationSpeedCharacteristic)) + .AddCharacteristic(typeof(SwingModeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FaucetService.cs b/src/platforms/homekit/Services/Definitions/FaucetService.cs index 3b6a19e..2a3ff72 100644 --- a/src/platforms/homekit/Services/Definitions/FaucetService.cs +++ b/src/platforms/homekit/Services/Definitions/FaucetService.cs @@ -35,7 +35,8 @@ public FaucetService() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs index 35e7e21..4788e3b 100644 --- a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs +++ b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs @@ -35,7 +35,9 @@ public FilterMaintenanceService() ; // optional characteristics - AddCharacteristic(typeof(FilterChangeIndicationCharacteristic)) + AddCharacteristic(typeof(FilterLifeLevelCharacteristic)) + .AddCharacteristic(typeof(ResetFilterIndicationCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs index 5918760..034610e 100644 --- a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs +++ b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs @@ -37,9 +37,9 @@ public GarageDoorOpenerService() ; // optional characteristics - AddCharacteristic(typeof(CurrentDoorStateCharacteristic)) - .AddCharacteristic(typeof(TargetDoorStateCharacteristic)) - .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + AddCharacteristic(typeof(LockCurrentStateCharacteristic)) + .AddCharacteristic(typeof(LockTargetStateCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs index 758ae60..858a557 100644 --- a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs +++ b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs @@ -38,10 +38,13 @@ public HeaterCoolerService() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) - .AddCharacteristic(typeof(CurrentHeaterCoolerStateCharacteristic)) - .AddCharacteristic(typeof(TargetHeaterCoolerStateCharacteristic)) - .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SwingModeCharacteristic)) + .AddCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) + .AddCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) + .AddCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) + .AddCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs index 4b9ae4d..0d07a3a 100644 --- a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs +++ b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs @@ -38,10 +38,13 @@ public HumidifierDehumidifierService() ; // optional characteristics - AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) - .AddCharacteristic(typeof(CurrentHumidifierDehumidifierStateCharacteristic)) - .AddCharacteristic(typeof(TargetHumidifierDehumidifierStateCharacteristic)) - .AddCharacteristic(typeof(ActiveCharacteristic)) + AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(SwingModeCharacteristic)) + .AddCharacteristic(typeof(WaterLevelCharacteristic)) + .AddCharacteristic(typeof(RelativeHumidityDehumidifierThresholdCharacteristic)) + .AddCharacteristic(typeof(RelativeHumidityHumidifierThresholdCharacteristic)) + .AddCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs index 33b2f09..5515c0c 100644 --- a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs @@ -35,7 +35,11 @@ public HumiditySensorService() ; // optional characteristics - AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs index 13ec1d8..51f2c96 100644 --- a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs +++ b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs @@ -37,9 +37,9 @@ public IrrigationSystemService() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) - .AddCharacteristic(typeof(ProgramModeCharacteristic)) - .AddCharacteristic(typeof(InUseCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(RemainingDurationCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs index a82b485..9cd8607 100644 --- a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs @@ -35,7 +35,11 @@ public LeakSensorService() ; // optional characteristics - AddCharacteristic(typeof(LeakDetectedCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/src/platforms/homekit/Services/Definitions/LightSensorService.cs index 9e5a394..d40e37b 100644 --- a/src/platforms/homekit/Services/Definitions/LightSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LightSensorService.cs @@ -35,7 +35,11 @@ public LightSensorService() ; // optional characteristics - AddCharacteristic(typeof(CurrentAmbientLightLevelCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/src/platforms/homekit/Services/Definitions/LightbulbService.cs index fea1adf..270edb4 100644 --- a/src/platforms/homekit/Services/Definitions/LightbulbService.cs +++ b/src/platforms/homekit/Services/Definitions/LightbulbService.cs @@ -35,7 +35,10 @@ public LightbulbService() ; // optional characteristics - AddCharacteristic(typeof(OnCharacteristic)) + AddCharacteristic(typeof(BrightnessCharacteristic)) + .AddCharacteristic(typeof(HueCharacteristic)) + .AddCharacteristic(typeof(SaturationCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/src/platforms/homekit/Services/Definitions/LockManagementService.cs index fab0226..a08c507 100644 --- a/src/platforms/homekit/Services/Definitions/LockManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/LockManagementService.cs @@ -36,8 +36,14 @@ public LockManagementService() ; // optional characteristics - AddCharacteristic(typeof(LockControlPointCharacteristic)) - .AddCharacteristic(typeof(VersionCharacteristic)) + AddCharacteristic(typeof(LogsCharacteristic)) + .AddCharacteristic(typeof(AudioFeedbackCharacteristic)) + .AddCharacteristic(typeof(LockManagementAutoSecurityTimeoutCharacteristic)) + .AddCharacteristic(typeof(AdministratorOnlyAccessCharacteristic)) + .AddCharacteristic(typeof(LockLastKnownActionCharacteristic)) + .AddCharacteristic(typeof(CurrentDoorStateCharacteristic)) + .AddCharacteristic(typeof(MotionDetectedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs index df7e668..17c9ce3 100644 --- a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs +++ b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs @@ -36,8 +36,7 @@ public LockMechanismService() ; // optional characteristics - AddCharacteristic(typeof(LockCurrentStateCharacteristic)) - .AddCharacteristic(typeof(LockTargetStateCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs index 7006621..9b3a890 100644 --- a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs +++ b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs @@ -36,8 +36,7 @@ public MicrophoneService() ; // optional characteristics - AddCharacteristic(typeof(VolumeCharacteristic)) - .AddCharacteristic(typeof(MuteCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs index c5457fc..ccbb075 100644 --- a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs @@ -35,7 +35,11 @@ public MotionSensorService() ; // optional characteristics - AddCharacteristic(typeof(MotionDetectedCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs index f6de90a..0ad87f3 100644 --- a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs @@ -35,7 +35,11 @@ public OccupancySensorService() ; // optional characteristics - AddCharacteristic(typeof(OccupancyDetectedCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/OutletService.cs b/src/platforms/homekit/Services/Definitions/OutletService.cs index 3e86b05..6f31086 100644 --- a/src/platforms/homekit/Services/Definitions/OutletService.cs +++ b/src/platforms/homekit/Services/Definitions/OutletService.cs @@ -36,8 +36,7 @@ public OutletService() ; // optional characteristics - AddCharacteristic(typeof(OnCharacteristic)) - .AddCharacteristic(typeof(OutletInUseCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs index 2f3e204..ca8bbb2 100644 --- a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs +++ b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs @@ -36,8 +36,10 @@ public SecuritySystemService() ; // optional characteristics - AddCharacteristic(typeof(SecuritySystemCurrentStateCharacteristic)) - .AddCharacteristic(typeof(SecuritySystemTargetStateCharacteristic)) + AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(SecuritySystemAlarmTypeCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs index 3aae767..1d50aef 100644 --- a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs +++ b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs @@ -35,7 +35,7 @@ public ServiceLabelService() ; // optional characteristics - AddCharacteristic(typeof(ServiceLabelNamespaceCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SlatService.cs b/src/platforms/homekit/Services/Definitions/SlatService.cs index b109971..69cdbf5 100644 --- a/src/platforms/homekit/Services/Definitions/SlatService.cs +++ b/src/platforms/homekit/Services/Definitions/SlatService.cs @@ -36,8 +36,10 @@ public SlatService() ; // optional characteristics - AddCharacteristic(typeof(SlatTypeCharacteristic)) - .AddCharacteristic(typeof(CurrentSlatStateCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(CurrentTiltAngleCharacteristic)) + .AddCharacteristic(typeof(TargetTiltAngleCharacteristic)) + .AddCharacteristic(typeof(SwingModeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs index 6fe6e10..e4d5988 100644 --- a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs @@ -35,7 +35,11 @@ public SmokeSensorService() ; // optional characteristics - AddCharacteristic(typeof(SmokeDetectedCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/src/platforms/homekit/Services/Definitions/SpeakerService.cs index acdbfd9..5f91aab 100644 --- a/src/platforms/homekit/Services/Definitions/SpeakerService.cs +++ b/src/platforms/homekit/Services/Definitions/SpeakerService.cs @@ -35,7 +35,8 @@ public SpeakerService() ; // optional characteristics - AddCharacteristic(typeof(MuteCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(VolumeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs index 7bf68dd..b9d23c2 100644 --- a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs @@ -35,7 +35,8 @@ public StatelessProgrammableSwitchService() ; // optional characteristics - AddCharacteristic(typeof(ProgrammableSwitchEventCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) + .AddCharacteristic(typeof(ServiceLabelIndexCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SwitchService.cs b/src/platforms/homekit/Services/Definitions/SwitchService.cs index c198ac8..9a5de28 100644 --- a/src/platforms/homekit/Services/Definitions/SwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/SwitchService.cs @@ -35,7 +35,7 @@ public SwitchService() ; // optional characteristics - AddCharacteristic(typeof(OnCharacteristic)) + AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs index d24aa23..87e079c 100644 --- a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs @@ -35,7 +35,11 @@ public TemperatureSensorService() ; // optional characteristics - AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) + AddCharacteristic(typeof(StatusActiveCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/src/platforms/homekit/Services/Definitions/ThermostatService.cs index 128728f..6a6da61 100644 --- a/src/platforms/homekit/Services/Definitions/ThermostatService.cs +++ b/src/platforms/homekit/Services/Definitions/ThermostatService.cs @@ -39,11 +39,11 @@ public ThermostatService() ; // optional characteristics - AddCharacteristic(typeof(CurrentHeatingCoolingStateCharacteristic)) - .AddCharacteristic(typeof(TargetHeatingCoolingStateCharacteristic)) - .AddCharacteristic(typeof(CurrentTemperatureCharacteristic)) - .AddCharacteristic(typeof(TargetTemperatureCharacteristic)) - .AddCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) + AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + .AddCharacteristic(typeof(TargetRelativeHumidityCharacteristic)) + .AddCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) + .AddCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ValveService.cs b/src/platforms/homekit/Services/Definitions/ValveService.cs index f0353a9..b6f1924 100644 --- a/src/platforms/homekit/Services/Definitions/ValveService.cs +++ b/src/platforms/homekit/Services/Definitions/ValveService.cs @@ -37,9 +37,12 @@ public ValveService() ; // optional characteristics - AddCharacteristic(typeof(ActiveCharacteristic)) - .AddCharacteristic(typeof(InUseCharacteristic)) - .AddCharacteristic(typeof(ValveTypeCharacteristic)) + AddCharacteristic(typeof(SetDurationCharacteristic)) + .AddCharacteristic(typeof(RemainingDurationCharacteristic)) + .AddCharacteristic(typeof(IsConfiguredCharacteristic)) + .AddCharacteristic(typeof(ServiceLabelIndexCharacteristic)) + .AddCharacteristic(typeof(StatusFaultCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs index c9fbc3b..ab6be40 100644 --- a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs @@ -37,9 +37,13 @@ public WindowCoveringService() ; // optional characteristics - AddCharacteristic(typeof(CurrentPositionCharacteristic)) - .AddCharacteristic(typeof(TargetPositionCharacteristic)) - .AddCharacteristic(typeof(PositionStateCharacteristic)) + AddCharacteristic(typeof(HoldPositionCharacteristic)) + .AddCharacteristic(typeof(TargetHorizontalTiltAngleCharacteristic)) + .AddCharacteristic(typeof(TargetVerticalTiltAngleCharacteristic)) + .AddCharacteristic(typeof(CurrentHorizontalTiltAngleCharacteristic)) + .AddCharacteristic(typeof(CurrentVerticalTiltAngleCharacteristic)) + .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/WindowService.cs b/src/platforms/homekit/Services/Definitions/WindowService.cs index d467277..0f51413 100644 --- a/src/platforms/homekit/Services/Definitions/WindowService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowService.cs @@ -37,9 +37,9 @@ public WindowService() ; // optional characteristics - AddCharacteristic(typeof(CurrentPositionCharacteristic)) - .AddCharacteristic(typeof(TargetPositionCharacteristic)) - .AddCharacteristic(typeof(PositionStateCharacteristic)) + AddCharacteristic(typeof(HoldPositionCharacteristic)) + .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddCharacteristic(typeof(NameCharacteristic)) ; } } From 24fd6b32e01524c7b74c8f681bbfa15e37c5dd42 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 14:13:23 +0300 Subject: [PATCH 066/152] fixed optional characteristics in services. --- contrib/importer/service.html | 2 +- src/homer/Servers/IServer.cs | 7 +---- src/homer/Servers/Server.cs | 12 ++++++--- .../AccessoryInformationService.cs | 4 +-- .../Definitions/AirPurifierService.cs | 8 +++--- .../Definitions/AirQualitySensorService.cs | 26 +++++++++---------- .../Definitions/BatteryServiceService.cs | 2 +- .../CameraRTPStreamManagementService.cs | 2 +- .../Definitions/CarbonDioxideSensorService.cs | 14 +++++----- .../CarbonMonoxideSensorService.cs | 14 +++++----- .../Definitions/ContactSensorService.cs | 10 +++---- .../Services/Definitions/DoorService.cs | 6 ++--- .../Services/Definitions/DoorbellService.cs | 6 ++--- .../Services/Definitions/FanService.cs | 6 ++--- .../Services/Definitions/Fanv2Service.cs | 14 +++++----- .../Services/Definitions/FaucetService.cs | 4 +-- .../Definitions/FilterMaintenanceService.cs | 6 ++--- .../Definitions/GarageDoorOpenerService.cs | 6 ++--- .../Definitions/HeaterCoolerService.cs | 14 +++++----- .../HumidifierDehumidifierService.cs | 14 +++++----- .../Definitions/HumiditySensorService.cs | 10 +++---- .../Definitions/IrrigationSystemService.cs | 6 ++--- .../Services/Definitions/LeakSensorService.cs | 10 +++---- .../Definitions/LightSensorService.cs | 10 +++---- .../Services/Definitions/LightbulbService.cs | 8 +++--- .../Definitions/LockManagementService.cs | 16 ++++++------ .../Definitions/LockMechanismService.cs | 2 +- .../Services/Definitions/MicrophoneService.cs | 2 +- .../Definitions/MotionSensorService.cs | 10 +++---- .../Definitions/OccupancySensorService.cs | 10 +++---- .../Services/Definitions/OutletService.cs | 2 +- .../Definitions/SecuritySystemService.cs | 8 +++--- .../Definitions/ServiceLabelService.cs | 2 +- .../Services/Definitions/SlatService.cs | 8 +++--- .../Definitions/SmokeSensorService.cs | 10 +++---- .../Services/Definitions/SpeakerService.cs | 4 +-- .../StatelessProgrammableSwitchService.cs | 4 +-- .../Services/Definitions/SwitchService.cs | 2 +- .../Definitions/TemperatureSensorService.cs | 10 +++---- .../Services/Definitions/ThermostatService.cs | 10 +++---- .../Services/Definitions/ValveService.cs | 12 ++++----- .../Definitions/WindowCoveringService.cs | 14 +++++----- .../Services/Definitions/WindowService.cs | 6 ++--- src/platforms/homekit/Services/Service.cs | 8 ++++++ 44 files changed, 185 insertions(+), 176 deletions(-) diff --git a/contrib/importer/service.html b/contrib/importer/service.html index 70fff94..639ca14 100644 --- a/contrib/importer/service.html +++ b/contrib/importer/service.html @@ -43,7 +43,7 @@ // optional characteristics {% for value in service.OptionalCharacteristics -%} {%- if not loop.first %}.{% endif -%} - AddCharacteristic(typeof({{ characteristics[value] }}Characteristic)) + AddOptionalCharacteristic(typeof({{ characteristics[value] }}Characteristic)) {% if loop.last -%};{%- endif %} {%- endfor %} {%- endif %} diff --git a/src/homer/Servers/IServer.cs b/src/homer/Servers/IServer.cs index b6147f0..0a077f3 100644 --- a/src/homer/Servers/IServer.cs +++ b/src/homer/Servers/IServer.cs @@ -29,12 +29,7 @@ namespace Homer.Servers public interface IServer { /// - /// Master logger instance. - /// - ILogger Logger { get; } - - /// - /// Runs the job. + /// Runs the server. /// /// Task RunAsync(); diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 8b7bf82..0370f95 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -23,6 +23,7 @@ using System; using System.Threading.Tasks; +using Homer.Core.Host; using Homer.Platform.HomeKit.Bridges.Setup; using Makaretu.Dns; using Serilog; @@ -32,7 +33,12 @@ namespace Homer.Servers { public class Server : IServer { - public ILogger Logger { get; set; } + private ILogger _logger; + + public Server() + { + _logger = Log.ForContext(); + } public async Task RunAsync() { @@ -47,13 +53,13 @@ public async Task RunAsync() foreach (var a in MulticastService.GetIPAddresses()) { - Logger.Information($"IP address {a}"); + _logger.Information($"IP address {a}"); } } catch (Exception e) { - Logger.Error("server initialization failed..."); + _logger.Error("server initialization failed..."); } } } diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index d57220f..2a545f2 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -40,8 +40,8 @@ public AccessoryInformationService() ; // optional characteristics - AddCharacteristic(typeof(HardwareRevisionCharacteristic)) - .AddCharacteristic(typeof(AccessoryFlagsCharacteristic)) + AddOptionalCharacteristic(typeof(HardwareRevisionCharacteristic)) + .AddOptionalCharacteristic(typeof(AccessoryFlagsCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs index d3ca94a..f114121 100644 --- a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs +++ b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs @@ -37,10 +37,10 @@ public AirPurifierService() ; // optional characteristics - AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(SwingModeCharacteristic)) - .AddCharacteristic(typeof(RotationSpeedCharacteristic)) + AddOptionalCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(SwingModeCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs index f025ff0..bb9afba 100644 --- a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs @@ -35,19 +35,19 @@ public AirQualitySensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(OzoneDensityCharacteristic)) - .AddCharacteristic(typeof(NitrogenDioxideDensityCharacteristic)) - .AddCharacteristic(typeof(SulphurDioxideDensityCharacteristic)) - .AddCharacteristic(typeof(PM2_5DensityCharacteristic)) - .AddCharacteristic(typeof(PM10DensityCharacteristic)) - .AddCharacteristic(typeof(VOCDensityCharacteristic)) - .AddCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) - .AddCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(OzoneDensityCharacteristic)) + .AddOptionalCharacteristic(typeof(NitrogenDioxideDensityCharacteristic)) + .AddOptionalCharacteristic(typeof(SulphurDioxideDensityCharacteristic)) + .AddOptionalCharacteristic(typeof(PM2_5DensityCharacteristic)) + .AddOptionalCharacteristic(typeof(PM10DensityCharacteristic)) + .AddOptionalCharacteristic(typeof(VOCDensityCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs index aff3e8b..ec1ed86 100644 --- a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs +++ b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs @@ -37,7 +37,7 @@ public BatteryServiceService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs index 46e8849..a05f620 100644 --- a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs @@ -40,7 +40,7 @@ public CameraRTPStreamManagementService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs index 2035883..c711c7e 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs @@ -35,13 +35,13 @@ public CarbonDioxideSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) - .AddCharacteristic(typeof(CarbonDioxidePeakLevelCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonDioxideLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonDioxidePeakLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs index 12ce92b..ee0e1a7 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs @@ -35,13 +35,13 @@ public CarbonMonoxideSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) - .AddCharacteristic(typeof(CarbonMonoxidePeakLevelCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonMonoxideLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(CarbonMonoxidePeakLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs index 14e70a6..ad0aadd 100644 --- a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs @@ -35,11 +35,11 @@ public ContactSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/DoorService.cs b/src/platforms/homekit/Services/Definitions/DoorService.cs index d052589..2c0201b 100644 --- a/src/platforms/homekit/Services/Definitions/DoorService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorService.cs @@ -37,9 +37,9 @@ public DoorService() ; // optional characteristics - AddCharacteristic(typeof(HoldPositionCharacteristic)) - .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(HoldPositionCharacteristic)) + .AddOptionalCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/src/platforms/homekit/Services/Definitions/DoorbellService.cs index b50ec80..67fd2a6 100644 --- a/src/platforms/homekit/Services/Definitions/DoorbellService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorbellService.cs @@ -35,9 +35,9 @@ public DoorbellService() ; // optional characteristics - AddCharacteristic(typeof(BrightnessCharacteristic)) - .AddCharacteristic(typeof(VolumeCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(BrightnessCharacteristic)) + .AddOptionalCharacteristic(typeof(VolumeCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FanService.cs b/src/platforms/homekit/Services/Definitions/FanService.cs index 6c59d52..37987b9 100644 --- a/src/platforms/homekit/Services/Definitions/FanService.cs +++ b/src/platforms/homekit/Services/Definitions/FanService.cs @@ -35,9 +35,9 @@ public FanService() ; // optional characteristics - AddCharacteristic(typeof(RotationDirectionCharacteristic)) - .AddCharacteristic(typeof(RotationSpeedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(RotationDirectionCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationSpeedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs index 59b1413..df2b1e4 100644 --- a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs +++ b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs @@ -35,13 +35,13 @@ public Fanv2Service() ; // optional characteristics - AddCharacteristic(typeof(CurrentFanStateCharacteristic)) - .AddCharacteristic(typeof(TargetFanStateCharacteristic)) - .AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(RotationDirectionCharacteristic)) - .AddCharacteristic(typeof(RotationSpeedCharacteristic)) - .AddCharacteristic(typeof(SwingModeCharacteristic)) + AddOptionalCharacteristic(typeof(CurrentFanStateCharacteristic)) + .AddOptionalCharacteristic(typeof(TargetFanStateCharacteristic)) + .AddOptionalCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationDirectionCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationSpeedCharacteristic)) + .AddOptionalCharacteristic(typeof(SwingModeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FaucetService.cs b/src/platforms/homekit/Services/Definitions/FaucetService.cs index 2a3ff72..e69cc0f 100644 --- a/src/platforms/homekit/Services/Definitions/FaucetService.cs +++ b/src/platforms/homekit/Services/Definitions/FaucetService.cs @@ -35,8 +35,8 @@ public FaucetService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs index 4788e3b..f6c78b5 100644 --- a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs +++ b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs @@ -35,9 +35,9 @@ public FilterMaintenanceService() ; // optional characteristics - AddCharacteristic(typeof(FilterLifeLevelCharacteristic)) - .AddCharacteristic(typeof(ResetFilterIndicationCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(FilterLifeLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(ResetFilterIndicationCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs index 034610e..51432a4 100644 --- a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs +++ b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs @@ -37,9 +37,9 @@ public GarageDoorOpenerService() ; // optional characteristics - AddCharacteristic(typeof(LockCurrentStateCharacteristic)) - .AddCharacteristic(typeof(LockTargetStateCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(LockCurrentStateCharacteristic)) + .AddOptionalCharacteristic(typeof(LockTargetStateCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs index 858a557..270f48d 100644 --- a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs +++ b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs @@ -38,13 +38,13 @@ public HeaterCoolerService() ; // optional characteristics - AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(SwingModeCharacteristic)) - .AddCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) - .AddCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) - .AddCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) - .AddCharacteristic(typeof(RotationSpeedCharacteristic)) + AddOptionalCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(SwingModeCharacteristic)) + .AddOptionalCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) + .AddOptionalCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) + .AddOptionalCharacteristic(typeof(TemperatureDisplayUnitsCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs index 0d07a3a..fc37f98 100644 --- a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs +++ b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs @@ -38,13 +38,13 @@ public HumidifierDehumidifierService() ; // optional characteristics - AddCharacteristic(typeof(LockPhysicalControlsCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(SwingModeCharacteristic)) - .AddCharacteristic(typeof(WaterLevelCharacteristic)) - .AddCharacteristic(typeof(RelativeHumidityDehumidifierThresholdCharacteristic)) - .AddCharacteristic(typeof(RelativeHumidityHumidifierThresholdCharacteristic)) - .AddCharacteristic(typeof(RotationSpeedCharacteristic)) + AddOptionalCharacteristic(typeof(LockPhysicalControlsCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(SwingModeCharacteristic)) + .AddOptionalCharacteristic(typeof(WaterLevelCharacteristic)) + .AddOptionalCharacteristic(typeof(RelativeHumidityDehumidifierThresholdCharacteristic)) + .AddOptionalCharacteristic(typeof(RelativeHumidityHumidifierThresholdCharacteristic)) + .AddOptionalCharacteristic(typeof(RotationSpeedCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs index 5515c0c..fcfe4d7 100644 --- a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs @@ -35,11 +35,11 @@ public HumiditySensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs index 51f2c96..3321673 100644 --- a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs +++ b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs @@ -37,9 +37,9 @@ public IrrigationSystemService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(RemainingDurationCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(RemainingDurationCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs index 9cd8607..714f994 100644 --- a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs @@ -35,11 +35,11 @@ public LeakSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/src/platforms/homekit/Services/Definitions/LightSensorService.cs index d40e37b..a7f7aed 100644 --- a/src/platforms/homekit/Services/Definitions/LightSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LightSensorService.cs @@ -35,11 +35,11 @@ public LightSensorService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/src/platforms/homekit/Services/Definitions/LightbulbService.cs index 270edb4..787f081 100644 --- a/src/platforms/homekit/Services/Definitions/LightbulbService.cs +++ b/src/platforms/homekit/Services/Definitions/LightbulbService.cs @@ -35,10 +35,10 @@ public LightbulbService() ; // optional characteristics - AddCharacteristic(typeof(BrightnessCharacteristic)) - .AddCharacteristic(typeof(HueCharacteristic)) - .AddCharacteristic(typeof(SaturationCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(BrightnessCharacteristic)) + .AddOptionalCharacteristic(typeof(HueCharacteristic)) + .AddOptionalCharacteristic(typeof(SaturationCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/src/platforms/homekit/Services/Definitions/LockManagementService.cs index a08c507..f771faa 100644 --- a/src/platforms/homekit/Services/Definitions/LockManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/LockManagementService.cs @@ -36,14 +36,14 @@ public LockManagementService() ; // optional characteristics - AddCharacteristic(typeof(LogsCharacteristic)) - .AddCharacteristic(typeof(AudioFeedbackCharacteristic)) - .AddCharacteristic(typeof(LockManagementAutoSecurityTimeoutCharacteristic)) - .AddCharacteristic(typeof(AdministratorOnlyAccessCharacteristic)) - .AddCharacteristic(typeof(LockLastKnownActionCharacteristic)) - .AddCharacteristic(typeof(CurrentDoorStateCharacteristic)) - .AddCharacteristic(typeof(MotionDetectedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(LogsCharacteristic)) + .AddOptionalCharacteristic(typeof(AudioFeedbackCharacteristic)) + .AddOptionalCharacteristic(typeof(LockManagementAutoSecurityTimeoutCharacteristic)) + .AddOptionalCharacteristic(typeof(AdministratorOnlyAccessCharacteristic)) + .AddOptionalCharacteristic(typeof(LockLastKnownActionCharacteristic)) + .AddOptionalCharacteristic(typeof(CurrentDoorStateCharacteristic)) + .AddOptionalCharacteristic(typeof(MotionDetectedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs index 17c9ce3..61d73a1 100644 --- a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs +++ b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs @@ -36,7 +36,7 @@ public LockMechanismService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs index 9b3a890..b4002aa 100644 --- a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs +++ b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs @@ -36,7 +36,7 @@ public MicrophoneService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs index ccbb075..7af2e4e 100644 --- a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs @@ -35,11 +35,11 @@ public MotionSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs index 0ad87f3..52a8d1b 100644 --- a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs @@ -35,11 +35,11 @@ public OccupancySensorService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/OutletService.cs b/src/platforms/homekit/Services/Definitions/OutletService.cs index 6f31086..655af1f 100644 --- a/src/platforms/homekit/Services/Definitions/OutletService.cs +++ b/src/platforms/homekit/Services/Definitions/OutletService.cs @@ -36,7 +36,7 @@ public OutletService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs index ca8bbb2..b4c3dfb 100644 --- a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs +++ b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs @@ -36,10 +36,10 @@ public SecuritySystemService() ; // optional characteristics - AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(SecuritySystemAlarmTypeCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(SecuritySystemAlarmTypeCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs index 1d50aef..0f7e1fc 100644 --- a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs +++ b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs @@ -35,7 +35,7 @@ public ServiceLabelService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SlatService.cs b/src/platforms/homekit/Services/Definitions/SlatService.cs index 69cdbf5..8f0d180 100644 --- a/src/platforms/homekit/Services/Definitions/SlatService.cs +++ b/src/platforms/homekit/Services/Definitions/SlatService.cs @@ -36,10 +36,10 @@ public SlatService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(CurrentTiltAngleCharacteristic)) - .AddCharacteristic(typeof(TargetTiltAngleCharacteristic)) - .AddCharacteristic(typeof(SwingModeCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(CurrentTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(TargetTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(SwingModeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs index e4d5988..4c30150 100644 --- a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs @@ -35,11 +35,11 @@ public SmokeSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/src/platforms/homekit/Services/Definitions/SpeakerService.cs index 5f91aab..a01ccfb 100644 --- a/src/platforms/homekit/Services/Definitions/SpeakerService.cs +++ b/src/platforms/homekit/Services/Definitions/SpeakerService.cs @@ -35,8 +35,8 @@ public SpeakerService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(VolumeCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(VolumeCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs index b9d23c2..9964d5a 100644 --- a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs @@ -35,8 +35,8 @@ public StatelessProgrammableSwitchService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) - .AddCharacteristic(typeof(ServiceLabelIndexCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) + .AddOptionalCharacteristic(typeof(ServiceLabelIndexCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/SwitchService.cs b/src/platforms/homekit/Services/Definitions/SwitchService.cs index 9a5de28..5d86cd0 100644 --- a/src/platforms/homekit/Services/Definitions/SwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/SwitchService.cs @@ -35,7 +35,7 @@ public SwitchService() ; // optional characteristics - AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs index 87e079c..c70b8d1 100644 --- a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs @@ -35,11 +35,11 @@ public TemperatureSensorService() ; // optional characteristics - AddCharacteristic(typeof(StatusActiveCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(StatusLowBatteryCharacteristic)) - .AddCharacteristic(typeof(StatusTamperedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(StatusActiveCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusLowBatteryCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusTamperedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/src/platforms/homekit/Services/Definitions/ThermostatService.cs index 6a6da61..8ed5c33 100644 --- a/src/platforms/homekit/Services/Definitions/ThermostatService.cs +++ b/src/platforms/homekit/Services/Definitions/ThermostatService.cs @@ -39,11 +39,11 @@ public ThermostatService() ; // optional characteristics - AddCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) - .AddCharacteristic(typeof(TargetRelativeHumidityCharacteristic)) - .AddCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) - .AddCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(CurrentRelativeHumidityCharacteristic)) + .AddOptionalCharacteristic(typeof(TargetRelativeHumidityCharacteristic)) + .AddOptionalCharacteristic(typeof(CoolingThresholdTemperatureCharacteristic)) + .AddOptionalCharacteristic(typeof(HeatingThresholdTemperatureCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/ValveService.cs b/src/platforms/homekit/Services/Definitions/ValveService.cs index b6f1924..3fde727 100644 --- a/src/platforms/homekit/Services/Definitions/ValveService.cs +++ b/src/platforms/homekit/Services/Definitions/ValveService.cs @@ -37,12 +37,12 @@ public ValveService() ; // optional characteristics - AddCharacteristic(typeof(SetDurationCharacteristic)) - .AddCharacteristic(typeof(RemainingDurationCharacteristic)) - .AddCharacteristic(typeof(IsConfiguredCharacteristic)) - .AddCharacteristic(typeof(ServiceLabelIndexCharacteristic)) - .AddCharacteristic(typeof(StatusFaultCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(SetDurationCharacteristic)) + .AddOptionalCharacteristic(typeof(RemainingDurationCharacteristic)) + .AddOptionalCharacteristic(typeof(IsConfiguredCharacteristic)) + .AddOptionalCharacteristic(typeof(ServiceLabelIndexCharacteristic)) + .AddOptionalCharacteristic(typeof(StatusFaultCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs index ab6be40..13ad0a5 100644 --- a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs @@ -37,13 +37,13 @@ public WindowCoveringService() ; // optional characteristics - AddCharacteristic(typeof(HoldPositionCharacteristic)) - .AddCharacteristic(typeof(TargetHorizontalTiltAngleCharacteristic)) - .AddCharacteristic(typeof(TargetVerticalTiltAngleCharacteristic)) - .AddCharacteristic(typeof(CurrentHorizontalTiltAngleCharacteristic)) - .AddCharacteristic(typeof(CurrentVerticalTiltAngleCharacteristic)) - .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(HoldPositionCharacteristic)) + .AddOptionalCharacteristic(typeof(TargetHorizontalTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(TargetVerticalTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(CurrentHorizontalTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(CurrentVerticalTiltAngleCharacteristic)) + .AddOptionalCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Definitions/WindowService.cs b/src/platforms/homekit/Services/Definitions/WindowService.cs index 0f51413..438d7b5 100644 --- a/src/platforms/homekit/Services/Definitions/WindowService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowService.cs @@ -37,9 +37,9 @@ public WindowService() ; // optional characteristics - AddCharacteristic(typeof(HoldPositionCharacteristic)) - .AddCharacteristic(typeof(ObstructionDetectedCharacteristic)) - .AddCharacteristic(typeof(NameCharacteristic)) + AddOptionalCharacteristic(typeof(HoldPositionCharacteristic)) + .AddOptionalCharacteristic(typeof(ObstructionDetectedCharacteristic)) + .AddOptionalCharacteristic(typeof(NameCharacteristic)) ; } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index 5c93f22..dcf776a 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -117,6 +117,7 @@ public ICharacteristic GetOptionalCharacteristic(Type characteristic) public IService AddCharacteristic(ICharacteristic characteristic) { if (characteristic == null) throw new ArgumentNullException(nameof(characteristic)); + if (_characteristics.ContainsKey(characteristic.GetType())) return this; // if characteristic already exists, just skip the call. _characteristics.Add(characteristic.GetType(), characteristic); OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. @@ -125,6 +126,8 @@ public IService AddCharacteristic(ICharacteristic characteristic) public IService AddCharacteristic(Type t) { + if (_characteristics.ContainsKey(t)) return this; // if characteristic already exists, just skip the call. + var characteristic = (ICharacteristic)Activator.CreateInstance(t); AddCharacteristic(characteristic); return this; // allow chaining. @@ -132,6 +135,9 @@ public IService AddCharacteristic(Type t) public IService AddOptionalCharacteristic(ICharacteristic characteristic) { + if (characteristic == null) throw new ArgumentNullException(nameof(characteristic)); + if (_optionalCharacteristics.ContainsKey(characteristic.GetType())) return this; // if characteristic already exists, just skip the call. + _optionalCharacteristics.Add(characteristic.GetType(), characteristic); OnEvent(ServiceConfigurationChange, EventArgs.Empty); // notify listeners. return this; // allow chaining. @@ -139,6 +145,8 @@ public IService AddOptionalCharacteristic(ICharacteristic characteristic) public IService AddOptionalCharacteristic(Type t) { + if (_optionalCharacteristics.ContainsKey(t)) return this; // if characteristic already exists, just skip the call. + var optionalCharacteristic = (ICharacteristic)Activator.CreateInstance(t); AddOptionalCharacteristic(optionalCharacteristic); return this; // allow chaining. From bc2b3d3582c2034467903374a560d019c65c3c81 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 14:18:52 +0300 Subject: [PATCH 067/152] initial mdns implementation. --- src/homer/Servers/Server.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 0370f95..68e73c7 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -22,6 +22,7 @@ #endregion using System; +using System.Linq; using System.Threading.Tasks; using Homer.Core.Host; using Homer.Platform.HomeKit.Bridges.Setup; @@ -51,11 +52,33 @@ public async Task RunAsync() var mdns = new MulticastService(); + mdns.QueryReceived += (s, e) => + { + var names = e.Message.Questions.Select(q => q.Name + " " + q.Type); + _logger.Information($"got a query for {string.Join(", ", names)}"); + }; + mdns.AnswerReceived += (s, e) => + { + var names = e.Message.Answers.Select(q => q.Name + " " + q.Type).Distinct(); + _logger.Information($"got answer for {string.Join(", ", names)}"); + }; + mdns.NetworkInterfaceDiscovered += (s, e) => + { + foreach (var nic in e.NetworkInterfaces) + { + _logger.Information($"discovered NIC '{nic.Name}'"); + } + }; + foreach (var a in MulticastService.GetIPAddresses()) { _logger.Information($"IP address {a}"); } + var serviceDiscovery = new ServiceDiscovery(mdns); + var hap = new ServiceProfile("hap", "_hap._tcp", 5012); + serviceDiscovery.Advertise(hap); + mdns.Start(); } catch (Exception e) { From 2a69eb75faf5e057671a4efcfd525c8f76174a09 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 15:04:29 +0300 Subject: [PATCH 068/152] accessorybase now prints it's data. --- src/homer/Servers/Server.cs | 2 + .../homekit/Accessories/Accessory.cs | 26 ++----------- .../homekit/Accessories/AccessoryBase.cs | 39 ++++++++++++++++++- .../homekit/Accessories/IAccessoryBase.cs | 11 ++++++ .../Bridges/Setup/BridgeSetupManager.cs | 4 ++ 5 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 68e73c7..4543188 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -45,6 +45,8 @@ public async Task RunAsync() { try { + _logger.Information("initializing server.."); + var generator = UUIDFactory.CreateGenerator(5, 1); var uuid = generator.Generate("homer"); diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index 118e64b..d4396f3 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -21,30 +21,9 @@ // Licensor: Hüseyin Uslu #endregion -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - +using System; using Homer.Platform.HomeKit.Bridges; +using Serilog; namespace Homer.Platform.HomeKit.Accessories { @@ -56,6 +35,7 @@ public class Accessory : AccessoryBase, IAccessory protected Accessory(string uuid, string displayName, bool isBridged = false, bool isReachable = true, AccessoryCategory category = AccessoryCategory.Other) : base(uuid, displayName, isBridged, isReachable, category) { + Logger = Log.ForContext(); } } } diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index 35d1e57..24e8854 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -24,9 +24,12 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq.Expressions; +using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Services; using Homer.Platform.HomeKit.Services.Definitions; +using Serilog; using uuid.net.Classes.UUID; using uuid.net.Static_Classes.UUID_Validator; @@ -34,6 +37,10 @@ namespace Homer.Platform.HomeKit.Accessories { public class AccessoryBase : IAccessoryBase { + public ILogger Logger { get; protected set; } + + public ILogger AccessoryLogger { get; protected set; } + public UUID Uuid { get; } public string DisplayName { get; } @@ -59,6 +66,8 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; else throw new ArgumentException("Must be created with a non-empty displayName.", nameof(displayName)); + Logger = Log.ForContext(); + IsBridged = isBridged; IsReachable = isReachable; Category = category; @@ -72,6 +81,33 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is .SetCharacteristic(typeof(ModelCharacteristic), "Default-Model") .SetCharacteristic(typeof(SerialNumberCharacteristic), "Default-SerialNumber") .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); + + AddService(new ProtocolInformationService()) + .SetCharacteristic(typeof(VersionCharacteristic), "1.1.0"); + + LogAccessorySummary(); + } + + private void LogAccessorySummary() + { + Logger.Information("[{Type}] name: {Name}", this.GetType().Name, DisplayName); + Logger.Information("-------------------------------------------------"); + Logger.Information("uuid: {Uuid}", Uuid); + + foreach (var kvpService in _services) + { + Logger.Information("service: [{Type}]", kvpService.Key.Name); + + foreach (var kvpCharacteristic in kvpService.Value.Characteristics) + { + Logger.Information("characteristic: [{Type}] => ({Format}) {Value}", kvpCharacteristic.Key.Name, ((ICharacteristicProps)kvpCharacteristic.Value).Format, kvpCharacteristic.Value.Value); + } + + foreach (var kvpOptionalCharacteristic in kvpService.Value.OptionalCharacteristics) + { + Logger.Information("optional characteristic: [{Type}] => ({Format}) {Value}", kvpOptionalCharacteristic.Key.Name, ((ICharacteristicProps)kvpOptionalCharacteristic.Value).Format, kvpOptionalCharacteristic.Value.Value); + } + } } public IService AddService(IService service) @@ -89,7 +125,8 @@ public IService GetService(Type service) public void Publish() { - throw new NotImplementedException(); + + } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 5b93cc9..8978d00 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -25,6 +25,7 @@ using System.Collections.Generic; using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; +using Serilog; namespace Homer.Platform.HomeKit.Accessories { @@ -33,6 +34,16 @@ namespace Homer.Platform.HomeKit.Accessories /// public interface IAccessoryBase : IEntity { + /// + /// Master logger instance. + /// + ILogger Logger { get; } + + /// + /// Accessory logger. + /// + ILogger AccessoryLogger { get; } + /// /// true if we are hosted "behind" a Bridge Accessory /// diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs index 6c25d42..3748b5c 100644 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -35,6 +35,8 @@ public class BridgeSetupManager : Bridge public BridgeSetupManager(string uuid, string displayName) : base(uuid, displayName) { + + // create handler characteristic. var controlPointCharacteristic = new ControlPointCharacteristic(); controlPointCharacteristic.Get += HandleReadRequest; @@ -54,6 +56,8 @@ public BridgeSetupManager(string uuid, string displayName) .SetCharacteristic(typeof(ModelCharacteristic), "Homer") .SetCharacteristic(typeof(SerialNumberCharacteristic), "CC:22:3D:E3:CE:30") .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); + + Publish(); } From 7da385026024addf019802c185d33d030ba338ad Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 15:10:54 +0300 Subject: [PATCH 069/152] more LogAccessorySummary() work. --- .../homekit/Accessories/AccessoryBase.cs | 47 +++++++++---------- .../homekit/Accessories/IAccessoryBase.cs | 2 + 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index 24e8854..33b8652 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -84,30 +84,6 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is AddService(new ProtocolInformationService()) .SetCharacteristic(typeof(VersionCharacteristic), "1.1.0"); - - LogAccessorySummary(); - } - - private void LogAccessorySummary() - { - Logger.Information("[{Type}] name: {Name}", this.GetType().Name, DisplayName); - Logger.Information("-------------------------------------------------"); - Logger.Information("uuid: {Uuid}", Uuid); - - foreach (var kvpService in _services) - { - Logger.Information("service: [{Type}]", kvpService.Key.Name); - - foreach (var kvpCharacteristic in kvpService.Value.Characteristics) - { - Logger.Information("characteristic: [{Type}] => ({Format}) {Value}", kvpCharacteristic.Key.Name, ((ICharacteristicProps)kvpCharacteristic.Value).Format, kvpCharacteristic.Value.Value); - } - - foreach (var kvpOptionalCharacteristic in kvpService.Value.OptionalCharacteristics) - { - Logger.Information("optional characteristic: [{Type}] => ({Format}) {Value}", kvpOptionalCharacteristic.Key.Name, ((ICharacteristicProps)kvpOptionalCharacteristic.Value).Format, kvpOptionalCharacteristic.Value.Value); - } - } } public IService AddService(IService service) @@ -125,8 +101,29 @@ public IService GetService(Type service) public void Publish() { - + LogAccessorySummary(); + } + + public void LogAccessorySummary() + { + Logger.Verbose("[{Type}] name: {Name}", this.GetType().Name, DisplayName); + Logger.Verbose("-------------------------------------------------"); + Logger.Verbose("uuid: {Uuid}", Uuid); + + foreach (var (key, service) in _services) + { + Logger.Verbose("service: [{Type}]", key.Name); + foreach (var (type, characteristic) in service.Characteristics) + { + Logger.Verbose("characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); + } + + foreach (var (type, characteristic) in service.OptionalCharacteristics) + { + Logger.Verbose("optional characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); + } + } } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 8978d00..bf04c3d 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -74,5 +74,7 @@ public interface IAccessoryBase : IEntity IService GetService(Type t); void Publish(); + + void LogAccessorySummary(); } } From 2890661bbf1d66a4f821103932321034ed033569 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 16:48:43 +0300 Subject: [PATCH 070/152] added homekit config support. --- src/core/Homer.Core.csproj | 1 - src/core/Internals/Logging/LogManager.cs | 8 ++-- .../Configuration/ConfigurationService.cs | 14 +++--- .../Models/ConfigurationModel.cs | 4 ++ .../Models/IConfigurationModel.cs | 6 +++ .../{JobsLogModel.cs => AccessoryLogModel.cs} | 2 +- .../Configuration/Models/Logs/LogsModel.cs | 4 +- .../Models/Platforms/Homekit/HomekitModel.cs | 35 ++++++++++++++ .../Platforms/Homekit/Setup/SetupModel.cs | 48 +++++++++++++++++++ .../Models/Platforms/PlatformsModel.cs | 35 ++++++++++++++ src/core/config/default.yaml | 2 +- src/core/config/production.yaml | 2 +- src/homer/Servers/IServer.cs | 1 - src/homer/Servers/Server.cs | 12 +++-- .../homekit/Accessories/Accessory.cs | 1 - .../homekit/Accessories/AccessoryBase.cs | 3 +- .../homekit/Accessories/IAccessoryBase.cs | 2 +- .../homekit/Accessories/Info/IAcessoryInfo.cs | 10 ++++ src/platforms/homekit/Bridges/Bridge.cs | 2 +- .../Bridges/Setup/BridgeSetupManager.cs | 18 +++++-- .../homekit/Homer.Platform.HomeKit.csproj | 16 +++++++ .../config/platforms/homekit/.gitignore | 1 + .../config/platforms/homekit/default.yaml | 7 +++ .../config/platforms/homekit/development.yaml | 1 + .../config/platforms/homekit/production.yaml | 15 ++++++ .../config/platforms/homekit/test.yaml | 1 + 26 files changed, 219 insertions(+), 32 deletions(-) rename src/core/Internals/Services/Configuration/Models/Logs/{JobsLogModel.cs => AccessoryLogModel.cs} (95%) create mode 100644 src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs create mode 100644 src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs create mode 100644 src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs create mode 100644 src/platforms/homekit/config/platforms/homekit/.gitignore create mode 100644 src/platforms/homekit/config/platforms/homekit/default.yaml create mode 100644 src/platforms/homekit/config/platforms/homekit/development.yaml create mode 100644 src/platforms/homekit/config/platforms/homekit/production.yaml create mode 100644 src/platforms/homekit/config/platforms/homekit/test.yaml diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj index 923e66c..e9a4897 100644 --- a/src/core/Homer.Core.csproj +++ b/src/core/Homer.Core.csproj @@ -43,7 +43,6 @@ - diff --git a/src/core/Internals/Logging/LogManager.cs b/src/core/Internals/Logging/LogManager.cs index c3d0a42..ad1f121 100644 --- a/src/core/Internals/Logging/LogManager.cs +++ b/src/core/Internals/Logging/LogManager.cs @@ -104,11 +104,11 @@ public ILogger GetPluginLogger(string name) .Enrich.With(new SourceEnricher()) // used for enriching logs with sources. .MinimumLevel.Verbose(); // lower the default minimum level to verbose as sinks can only rise them but not lower. - if (_configurationService.Configuration.Logs.Jobs.Console.Enabled) // if console log is enabled. - builder = builder.WriteTo.Console(GetLogLevel(_configurationService.Configuration.Logs.Jobs.Console.Level), JobConsoleLoggerTemplate, theme: AnsiConsoleTheme.Code); + if (_configurationService.Configuration.Logs.Accessories.Console.Enabled) // if console log is enabled. + builder = builder.WriteTo.Console(GetLogLevel(_configurationService.Configuration.Logs.Accessories.Console.Level), JobConsoleLoggerTemplate, theme: AnsiConsoleTheme.Code); - if (_configurationService.Configuration.Logs.Jobs.File.Enabled) // if file log is enabled. - builder = builder.WriteTo.File(path, GetLogLevel(_configurationService.Configuration.Logs.Jobs.File.Level), JobFileLoggerTemplate); + if (_configurationService.Configuration.Logs.Accessories.File.Enabled) // if file log is enabled. + builder = builder.WriteTo.File(path, GetLogLevel(_configurationService.Configuration.Logs.Accessories.File.Level), JobFileLoggerTemplate); _pluginLoggers[name] = builder.CreateLogger(); // create the logger. diff --git a/src/core/Internals/Services/Configuration/ConfigurationService.cs b/src/core/Internals/Services/Configuration/ConfigurationService.cs index af283f8..f725804 100644 --- a/src/core/Internals/Services/Configuration/ConfigurationService.cs +++ b/src/core/Internals/Services/Configuration/ConfigurationService.cs @@ -39,7 +39,7 @@ public bool Load(string[] args) _builder = new ConfigurationBuilder() .SetBasePath(basePath) // set the base path. .LoadCoreYamlConfiguration(_runtimeInfoService) // load core yaml configuration. - //.LoadPluginYamlConfiguration(_runtimeInfoService) // load services yaml configuration. + .LoadPlatformsYamlConfiguration(_runtimeInfoService, basePath) // load platforms yaml configuration. .AddEnvironmentVariables() // add environment variables. .AddCommandLine(args) // add command line arguments. .Build(); // build the configuration root. @@ -83,18 +83,16 @@ public static IConfigurationBuilder LoadCoreYamlConfiguration(this IConfiguratio return builder.LoadYamlFiles(runtimeInfoService); } - public static IConfigurationBuilder LoadPluginYamlConfiguration(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService) + public static IConfigurationBuilder LoadPlatformsYamlConfiguration(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService, string basePath) { if (runtimeInfoService == null) throw new ArgumentNullException(nameof(runtimeInfoService)); - // get services config path; - var servicePath = $"{Assembly.GetEntryAssembly()?.GetName().Name}/"; - servicePath = servicePath?.Substring(servicePath.IndexOf('.', StringComparison.CurrentCulture) + 1); - servicePath = servicePath?.Replace('.', '/'); + // get platforms config path; + var platformsPath = Path.Combine(basePath, "platforms", "homekit/"); - return servicePath == "testhost/" + return Assembly.GetEntryAssembly()?.GetName().Name == "testhost" ? builder // skip loading per-service configuration files while testing core project. - : builder.LoadYamlFiles(runtimeInfoService, servicePath); // load per-service configuration. + : builder.LoadYamlFiles(runtimeInfoService, platformsPath); // load per-service configuration. } private static IConfigurationBuilder LoadYamlFiles(this IConfigurationBuilder builder, IRuntimeInfoService runtimeInfoService, string root = "") diff --git a/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs b/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs index 530331b..ec1e20c 100644 --- a/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs +++ b/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs @@ -1,4 +1,5 @@ using Homer.Core.Internals.Services.Configuration.Models.Logs; +using Homer.Core.Internals.Services.Configuration.Models.Platforms; namespace Homer.Core.Internals.Services.Configuration.Models { @@ -9,5 +10,8 @@ public class ConfigurationModel : IConfigurationModel { /// public LogsModel Logs { get; set; } + + /// + public PlatformsModel Platforms { get; set; } } } diff --git a/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs b/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs index 95dec22..b1b6c76 100644 --- a/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs +++ b/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs @@ -1,4 +1,5 @@ using Homer.Core.Internals.Services.Configuration.Models.Logs; +using Homer.Core.Internals.Services.Configuration.Models.Platforms; namespace Homer.Core.Internals.Services.Configuration.Models { @@ -11,5 +12,10 @@ public interface IConfigurationModel /// Logs configuration. /// LogsModel Logs { get; set; } + + /// + /// Platforms configuration. + /// + PlatformsModel Platforms { get; set; } } } diff --git a/src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs similarity index 95% rename from src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs rename to src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs index 1b0c800..aab5a8f 100644 --- a/src/core/Internals/Services/Configuration/Models/Logs/JobsLogModel.cs +++ b/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs @@ -10,7 +10,7 @@ namespace Homer.Core.Internals.Services.Configuration.Models.Logs { - public class JobsLogModel + public class AccessoryLogModel { /// /// Console log. diff --git a/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs b/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs index 2cf1e73..974885c 100644 --- a/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs +++ b/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs @@ -18,8 +18,8 @@ public class LogsModel public MasterLogModel Master { get; set; } /// - /// Scheduler log. + /// Accessory log. /// - public JobsLogModel Jobs { get; set; } + public AccessoryLogModel Accessories { get; set; } } } diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs b/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs new file mode 100644 index 0000000..f6d0fac --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs @@ -0,0 +1,35 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Core.Internals.Services.Configuration.Models.Platforms.Homekit.Setup; + +namespace Homer.Core.Internals.Services.Configuration.Models.Platforms.Homekit +{ + public class HomekitModel + { + /// + /// Setup config. + /// + public SetupModel Setup { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs b/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs new file mode 100644 index 0000000..8d63f15 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs @@ -0,0 +1,48 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +namespace Homer.Core.Internals.Services.Configuration.Models.Platforms.Homekit.Setup +{ + public class SetupModel + { + /// + /// Setup bridge serial. + /// + public string Serial { get; set; } + + /// + /// Pin code. + /// + public string Pin { get; set; } + + /// + /// Setup port. + /// + public int Port { get; set; } + + /// + /// Aloow insecure access? + /// + public bool Insecure { get; set; } + } +} diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs b/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs new file mode 100644 index 0000000..89bb0c3 --- /dev/null +++ b/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs @@ -0,0 +1,35 @@ +#region license +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +#endregion + +using Homer.Core.Internals.Services.Configuration.Models.Platforms.Homekit; + +namespace Homer.Core.Internals.Services.Configuration.Models.Platforms +{ + public class PlatformsModel + { + /// + /// Homekit configuration. + /// + public HomekitModel Homekit { get; set; } + } +} diff --git a/src/core/config/default.yaml b/src/core/config/default.yaml index 4dc6e04..ab3cc75 100644 --- a/src/core/config/default.yaml +++ b/src/core/config/default.yaml @@ -9,7 +9,7 @@ logs: file: # file logging. enabled: true # enable loggin to file? level: verbose # minimum log level. - jobs: + accessories: console: # console logging. enabled: true # enable console log? level: verbose # minimum log level. diff --git a/src/core/config/production.yaml b/src/core/config/production.yaml index fb119ab..85f75aa 100644 --- a/src/core/config/production.yaml +++ b/src/core/config/production.yaml @@ -6,7 +6,7 @@ file: enabled: true level: debug - jobs: + accessories: console: enabled: false level: info diff --git a/src/homer/Servers/IServer.cs b/src/homer/Servers/IServer.cs index 0a077f3..9b18ac3 100644 --- a/src/homer/Servers/IServer.cs +++ b/src/homer/Servers/IServer.cs @@ -22,7 +22,6 @@ #endregion using System.Threading.Tasks; -using Serilog; namespace Homer.Servers { diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 4543188..1e5895b 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -24,7 +24,7 @@ using System; using System.Linq; using System.Threading.Tasks; -using Homer.Core.Host; +using Homer.Core.Internals.Services.Configuration; using Homer.Platform.HomeKit.Bridges.Setup; using Makaretu.Dns; using Serilog; @@ -34,10 +34,14 @@ namespace Homer.Servers { public class Server : IServer { + private IConfigurationService _configurationService; + private ILogger _logger; - public Server() + public Server(IConfigurationService configurationService) { + _configurationService = configurationService ?? throw new ArgumentNullException(nameof(configurationService)); + _logger = Log.ForContext(); } @@ -50,7 +54,7 @@ public async Task RunAsync() var generator = UUIDFactory.CreateGenerator(5, 1); var uuid = generator.Generate("homer"); - var bridge = new BridgeSetupManager(uuid, "homer"); + var bridge = new BridgeSetupManager(uuid, "homer", _configurationService); var mdns = new MulticastService(); @@ -84,7 +88,7 @@ public async Task RunAsync() } catch (Exception e) { - _logger.Error("server initialization failed..."); + _logger.Error(e, "server initialization failed..."); } } } diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/src/platforms/homekit/Accessories/Accessory.cs index d4396f3..b080811 100644 --- a/src/platforms/homekit/Accessories/Accessory.cs +++ b/src/platforms/homekit/Accessories/Accessory.cs @@ -21,7 +21,6 @@ // Licensor: Hüseyin Uslu #endregion -using System; using Homer.Platform.HomeKit.Bridges; using Serilog; diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index 33b8652..29aa7ed 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -24,7 +24,6 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Linq.Expressions; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Services; @@ -99,7 +98,7 @@ public IService GetService(Type service) return _services.ContainsKey(service) ? _services[service] : null; } - public void Publish() + public void Publish(dynamic info, bool allowInsecureAccess = false) { LogAccessorySummary(); } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index bf04c3d..44930de 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -73,7 +73,7 @@ public interface IAccessoryBase : IEntity IService GetService(Type t); - void Publish(); + void Publish(dynamic info, bool allowInsecureAccess = false); void LogAccessorySummary(); } diff --git a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs new file mode 100644 index 0000000..e8487c3 --- /dev/null +++ b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Homer.Platform.HomeKit.Accessories.Info +{ + public interface IAcessoryInfo + { + } +} diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index 3db691b..e11055b 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -37,7 +37,7 @@ public class Bridge : AccessoryBase, IBridge /// /// internal list of accessories. /// - private List _accessories; + private readonly List _accessories; protected Bridge(string uuid, string displayName, bool isReachable = true) : base(uuid, displayName, isReachable, true, AccessoryCategory.Bridge) diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs index 3748b5c..9932bb1 100644 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -22,6 +22,8 @@ #endregion using System; +using System.Dynamic; +using Homer.Core.Internals.Services.Configuration; using Homer.Platform.HomeKit.Bridges.Setup.Characteristics; using Homer.Platform.HomeKit.Bridges.Setup.Setup; using Homer.Platform.HomeKit.Characteristics.Definitions; @@ -32,10 +34,12 @@ namespace Homer.Platform.HomeKit.Bridges.Setup { public class BridgeSetupManager : Bridge { - public BridgeSetupManager(string uuid, string displayName) + private IConfigurationService _configurationService; + + public BridgeSetupManager(string uuid, string displayName, IConfigurationService configurationService) : base(uuid, displayName) { - + _configurationService = configurationService ?? throw new ArgumentNullException(nameof(configurationService)); // create handler characteristic. var controlPointCharacteristic = new ControlPointCharacteristic(); @@ -54,10 +58,16 @@ public BridgeSetupManager(string uuid, string displayName) GetService(typeof(AccessoryInformationService)) .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") .SetCharacteristic(typeof(ModelCharacteristic), "Homer") - .SetCharacteristic(typeof(SerialNumberCharacteristic), "CC:22:3D:E3:CE:30") + .SetCharacteristic(typeof(SerialNumberCharacteristic), _configurationService.Configuration.Platforms.Homekit.Setup.Serial) .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); - Publish(); + dynamic info = new ExpandoObject(); + info.serial = _configurationService.Configuration.Platforms.Homekit.Setup.Serial; + info.port = _configurationService.Configuration.Platforms.Homekit.Setup.Port; + info.pin = _configurationService.Configuration.Platforms.Homekit.Setup.Pin; + info.category = Category; + + Publish(info, _configurationService.Configuration.Platforms.Homekit.Setup.Insecure); } diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 805fe44..87ad3e0 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -29,10 +29,26 @@ + + + + Always + + + Always + + + Always + + + Always + + + diff --git a/src/platforms/homekit/config/platforms/homekit/.gitignore b/src/platforms/homekit/config/platforms/homekit/.gitignore new file mode 100644 index 0000000..bd5d334 --- /dev/null +++ b/src/platforms/homekit/config/platforms/homekit/.gitignore @@ -0,0 +1 @@ +local.yaml diff --git a/src/platforms/homekit/config/platforms/homekit/default.yaml b/src/platforms/homekit/config/platforms/homekit/default.yaml new file mode 100644 index 0000000..5d2b561 --- /dev/null +++ b/src/platforms/homekit/config/platforms/homekit/default.yaml @@ -0,0 +1,7 @@ +platforms: + homekit: + setup: + serial: CC:22:3D:E3:CE:30 + pin: 031-45-154 + port: 25777 + insecure: true # allow insecure access? \ No newline at end of file diff --git a/src/platforms/homekit/config/platforms/homekit/development.yaml b/src/platforms/homekit/config/platforms/homekit/development.yaml new file mode 100644 index 0000000..30259b2 --- /dev/null +++ b/src/platforms/homekit/config/platforms/homekit/development.yaml @@ -0,0 +1 @@ + diff --git a/src/platforms/homekit/config/platforms/homekit/production.yaml b/src/platforms/homekit/config/platforms/homekit/production.yaml new file mode 100644 index 0000000..85f75aa --- /dev/null +++ b/src/platforms/homekit/config/platforms/homekit/production.yaml @@ -0,0 +1,15 @@ +logs: + master: + console: + enabled: true + level: info + file: + enabled: true + level: debug + accessories: + console: + enabled: false + level: info + file: + enabled: true + level: debug diff --git a/src/platforms/homekit/config/platforms/homekit/test.yaml b/src/platforms/homekit/config/platforms/homekit/test.yaml new file mode 100644 index 0000000..19a76f1 --- /dev/null +++ b/src/platforms/homekit/config/platforms/homekit/test.yaml @@ -0,0 +1 @@ + \ No newline at end of file From a20b192cda49ed2653e70fc143aaf8f76fb0ca33 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Mon, 10 Feb 2020 18:42:19 +0300 Subject: [PATCH 071/152] added const uuids to characteristics and services. initial accessoryinfo and identifiercache work. --- contrib/importer/characteristic.html | 2 + contrib/importer/service.html | 2 + .../homekit/Accessories/AccessoryBase.cs | 46 +++++++++++- .../homekit/Accessories/IAccessoryBase.cs | 29 +++++--- .../homekit/Accessories/Info/AccessoryInfo.cs | 73 +++++++++++++++++++ .../homekit/Accessories/Info/IAcessoryInfo.cs | 36 ++++++++- src/platforms/homekit/Bridges/Bridge.cs | 2 +- .../Bridges/Setup/BridgeSetupManager.cs | 2 +- .../Caches/Identifiers/IIdentifierCache.cs | 28 +++++++ .../Caches/Identifiers/IdentifierCache.cs | 45 ++++++++++++ .../homekit/Characteristics/Characteristic.cs | 9 +++ .../AccessoryFlagsCharacteristic.cs | 2 + .../Definitions/ActiveCharacteristic.cs | 2 + .../AdministratorOnlyAccessCharacteristic.cs | 2 + .../AirParticulateDensityCharacteristic.cs | 2 + .../AirParticulateSizeCharacteristic.cs | 2 + .../Definitions/AirQualityCharacteristic.cs | 2 + .../AudioFeedbackCharacteristic.cs | 2 + .../Definitions/BatteryLevelCharacteristic.cs | 2 + .../Definitions/BrightnessCharacteristic.cs | 2 + .../CarbonDioxideDetectedCharacteristic.cs | 2 + .../CarbonDioxideLevelCharacteristic.cs | 2 + .../CarbonDioxidePeakLevelCharacteristic.cs | 2 + .../CarbonMonoxideDetectedCharacteristic.cs | 2 + .../CarbonMonoxideLevelCharacteristic.cs | 2 + .../CarbonMonoxidePeakLevelCharacteristic.cs | 2 + .../ChargingStateCharacteristic.cs | 2 + .../ColorTemperatureCharacteristic.cs | 2 + .../ContactSensorStateCharacteristic.cs | 2 + ...olingThresholdTemperatureCharacteristic.cs | 2 + .../CurrentAirPurifierStateCharacteristic.cs | 2 + .../CurrentAmbientLightLevelCharacteristic.cs | 2 + .../CurrentDoorStateCharacteristic.cs | 2 + .../CurrentFanStateCharacteristic.cs | 2 + .../CurrentHeaterCoolerStateCharacteristic.cs | 2 + ...urrentHeatingCoolingStateCharacteristic.cs | 2 + ...urrentHorizontalTiltAngleCharacteristic.cs | 2 + ...midifierDehumidifierStateCharacteristic.cs | 2 + .../CurrentPositionCharacteristic.cs | 2 + .../CurrentRelativeHumidityCharacteristic.cs | 2 + .../CurrentSlatStateCharacteristic.cs | 2 + .../CurrentTemperatureCharacteristic.cs | 2 + .../CurrentTiltAngleCharacteristic.cs | 2 + .../CurrentVerticalTiltAngleCharacteristic.cs | 2 + .../Definitions/DigitalZoomCharacteristic.cs | 2 + .../FilterChangeIndicationCharacteristic.cs | 2 + .../FilterLifeLevelCharacteristic.cs | 2 + .../FirmwareRevisionCharacteristic.cs | 2 + .../HardwareRevisionCharacteristic.cs | 2 + ...atingThresholdTemperatureCharacteristic.cs | 2 + .../Definitions/HoldPositionCharacteristic.cs | 2 + .../Definitions/HueCharacteristic.cs | 2 + .../Definitions/IdentifyCharacteristic.cs | 2 + .../ImageMirroringCharacteristic.cs | 2 + .../ImageRotationCharacteristic.cs | 2 + .../Definitions/InUseCharacteristic.cs | 2 + .../Definitions/IsConfiguredCharacteristic.cs | 2 + .../Definitions/LeakDetectedCharacteristic.cs | 2 + .../LockControlPointCharacteristic.cs | 2 + .../LockCurrentStateCharacteristic.cs | 2 + .../LockLastKnownActionCharacteristic.cs | 2 + ...gementAutoSecurityTimeoutCharacteristic.cs | 2 + .../LockPhysicalControlsCharacteristic.cs | 2 + .../LockTargetStateCharacteristic.cs | 2 + .../Definitions/LogsCharacteristic.cs | 2 + .../Definitions/ManufacturerCharacteristic.cs | 2 + .../Definitions/ModelCharacteristic.cs | 2 + .../MotionDetectedCharacteristic.cs | 2 + .../Definitions/MuteCharacteristic.cs | 2 + .../Definitions/NameCharacteristic.cs | 2 + .../Definitions/NightVisionCharacteristic.cs | 2 + .../NitrogenDioxideDensityCharacteristic.cs | 2 + .../ObstructionDetectedCharacteristic.cs | 2 + .../OccupancyDetectedCharacteristic.cs | 2 + .../Definitions/OnCharacteristic.cs | 2 + .../Definitions/OpticalZoomCharacteristic.cs | 2 + .../Definitions/OutletInUseCharacteristic.cs | 2 + .../Definitions/OzoneDensityCharacteristic.cs | 2 + .../Definitions/PM10DensityCharacteristic.cs | 2 + .../Definitions/PM2_5DensityCharacteristic.cs | 2 + .../Definitions/PairSetupCharacteristic.cs | 2 + .../Definitions/PairVerifyCharacteristic.cs | 2 + .../PairingFeaturesCharacteristic.cs | 2 + .../PairingPairingsCharacteristic.cs | 2 + .../PositionStateCharacteristic.cs | 2 + .../Definitions/ProgramModeCharacteristic.cs | 2 + .../ProgrammableSwitchEventCharacteristic.cs | 2 + ...dityDehumidifierThresholdCharacteristic.cs | 2 + ...midityHumidifierThresholdCharacteristic.cs | 2 + .../RemainingDurationCharacteristic.cs | 2 + .../ResetFilterIndicationCharacteristic.cs | 2 + .../RotationDirectionCharacteristic.cs | 2 + .../RotationSpeedCharacteristic.cs | 2 + .../Definitions/SaturationCharacteristic.cs | 2 + .../SecuritySystemAlarmTypeCharacteristic.cs | 2 + ...ecuritySystemCurrentStateCharacteristic.cs | 2 + ...SecuritySystemTargetStateCharacteristic.cs | 2 + ...tedRTPStreamConfigurationCharacteristic.cs | 2 + .../Definitions/SerialNumberCharacteristic.cs | 2 + .../ServiceLabelIndexCharacteristic.cs | 2 + .../ServiceLabelNamespaceCharacteristic.cs | 2 + .../Definitions/SetDurationCharacteristic.cs | 2 + .../SetupEndpointsCharacteristic.cs | 2 + .../Definitions/SlatTypeCharacteristic.cs | 2 + .../SmokeDetectedCharacteristic.cs | 2 + .../Definitions/StatusActiveCharacteristic.cs | 2 + .../Definitions/StatusFaultCharacteristic.cs | 2 + .../Definitions/StatusJammedCharacteristic.cs | 2 + .../StatusLowBatteryCharacteristic.cs | 2 + .../StatusTamperedCharacteristic.cs | 2 + .../StreamingStatusCharacteristic.cs | 2 + .../SulphurDioxideDensityCharacteristic.cs | 2 + ...dAudioStreamConfigurationCharacteristic.cs | 2 + ...SupportedRTPConfigurationCharacteristic.cs | 2 + ...dVideoStreamConfigurationCharacteristic.cs | 2 + .../Definitions/SwingModeCharacteristic.cs | 2 + .../TargetAirPurifierStateCharacteristic.cs | 2 + .../TargetAirQualityCharacteristic.cs | 2 + .../TargetDoorStateCharacteristic.cs | 2 + .../TargetFanStateCharacteristic.cs | 2 + .../TargetHeaterCoolerStateCharacteristic.cs | 2 + ...TargetHeatingCoolingStateCharacteristic.cs | 2 + ...TargetHorizontalTiltAngleCharacteristic.cs | 2 + ...midifierDehumidifierStateCharacteristic.cs | 2 + .../TargetPositionCharacteristic.cs | 2 + .../TargetRelativeHumidityCharacteristic.cs | 2 + .../TargetSlatStateCharacteristic.cs | 2 + .../TargetTemperatureCharacteristic.cs | 2 + .../TargetTiltAngleCharacteristic.cs | 2 + .../TargetVerticalTiltAngleCharacteristic.cs | 2 + .../TemperatureDisplayUnitsCharacteristic.cs | 2 + .../Definitions/VOCDensityCharacteristic.cs | 2 + .../Definitions/ValveTypeCharacteristic.cs | 2 + .../Definitions/VersionCharacteristic.cs | 2 + .../Definitions/VolumeCharacteristic.cs | 2 + .../Definitions/WaterLevelCharacteristic.cs | 2 + .../Characteristics/ICharacteristic.cs | 6 ++ .../homekit/Homer.Platform.HomeKit.csproj | 1 + .../AccessoryInformationService.cs | 2 + .../Definitions/AirPurifierService.cs | 2 + .../Definitions/AirQualitySensorService.cs | 2 + .../Definitions/BatteryServiceService.cs | 2 + .../CameraRTPStreamManagementService.cs | 2 + .../Definitions/CarbonDioxideSensorService.cs | 2 + .../CarbonMonoxideSensorService.cs | 2 + .../Definitions/ContactSensorService.cs | 2 + .../Services/Definitions/DoorService.cs | 2 + .../Services/Definitions/DoorbellService.cs | 2 + .../Services/Definitions/FanService.cs | 2 + .../Services/Definitions/Fanv2Service.cs | 2 + .../Services/Definitions/FaucetService.cs | 2 + .../Definitions/FilterMaintenanceService.cs | 2 + .../Definitions/GarageDoorOpenerService.cs | 2 + .../Definitions/HeaterCoolerService.cs | 2 + .../HumidifierDehumidifierService.cs | 2 + .../Definitions/HumiditySensorService.cs | 2 + .../Definitions/IrrigationSystemService.cs | 2 + .../Services/Definitions/LeakSensorService.cs | 2 + .../Definitions/LightSensorService.cs | 2 + .../Services/Definitions/LightbulbService.cs | 2 + .../Definitions/LockManagementService.cs | 2 + .../Definitions/LockMechanismService.cs | 2 + .../Services/Definitions/MicrophoneService.cs | 2 + .../Definitions/MotionSensorService.cs | 2 + .../Definitions/OccupancySensorService.cs | 2 + .../Services/Definitions/OutletService.cs | 2 + .../Definitions/SecuritySystemService.cs | 2 + .../Definitions/ServiceLabelService.cs | 2 + .../Services/Definitions/SlatService.cs | 2 + .../Definitions/SmokeSensorService.cs | 2 + .../Services/Definitions/SpeakerService.cs | 2 + .../StatelessProgrammableSwitchService.cs | 2 + .../Services/Definitions/SwitchService.cs | 2 + .../Definitions/TemperatureSensorService.cs | 2 + .../Services/Definitions/ThermostatService.cs | 2 + .../Services/Definitions/ValveService.cs | 2 + .../Definitions/WindowCoveringService.cs | 2 + .../Services/Definitions/WindowService.cs | 2 + src/platforms/homekit/Services/IService.cs | 5 ++ src/platforms/homekit/Services/Service.cs | 19 ++++- .../config/platforms/homekit/default.yaml | 4 +- 181 files changed, 620 insertions(+), 19 deletions(-) create mode 100644 src/platforms/homekit/Accessories/Info/AccessoryInfo.cs create mode 100644 src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs create mode 100644 src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs diff --git a/contrib/importer/characteristic.html b/contrib/importer/characteristic.html index 4d02f57..10e7b87 100644 --- a/contrib/importer/characteristic.html +++ b/contrib/importer/characteristic.html @@ -27,6 +27,8 @@ { public class {{classyName}}Characteristic: Characteristic { + public const string Uuid = "{{characteristic.UUID}}"; + {% if characteristic.Constraints and characteristic.Constraints.ValidValues -%} {% for key,value in characteristic.Constraints.ValidValues -%} {%- set name = ucwords(value).replace(r/[^\w]+/g, '_') -%} diff --git a/contrib/importer/service.html b/contrib/importer/service.html index 639ca14..0576caf 100644 --- a/contrib/importer/service.html +++ b/contrib/importer/service.html @@ -27,6 +27,8 @@ { public class {{classyName}}Service: Service { + public const string Uuid = "{{service.UUID}}"; + public {{classyName}}Service() : base("{{ service.UUID }}", "{{ service.Name }}") { diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index 29aa7ed..225f897 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -24,6 +24,10 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using Homer.Platform.HomeKit.Accessories.Info; +using Homer.Platform.HomeKit.Bridges; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Services; @@ -36,14 +40,12 @@ namespace Homer.Platform.HomeKit.Accessories { public class AccessoryBase : IAccessoryBase { - public ILogger Logger { get; protected set; } - - public ILogger AccessoryLogger { get; protected set; } - public UUID Uuid { get; } public string DisplayName { get; } + public int? AccessoryId { get; private set; } + public bool IsBridged { get; } public bool IsReachable { get; } @@ -52,6 +54,14 @@ public class AccessoryBase : IAccessoryBase public IReadOnlyDictionary Services { get; } + public IAccessoryInfo AccessoryInfo { get; private set; } + + public IIdentifierCache IdentifierCache { get; private set; } + + public ILogger Logger { get; protected set; } + + public ILogger AccessoryLogger { get; protected set; } + /// /// internal list of services. /// @@ -67,6 +77,7 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is Logger = Log.ForContext(); + AccessoryId = null; IsBridged = isBridged; IsReachable = isReachable; Category = category; @@ -100,6 +111,10 @@ public IService GetService(Type service) public void Publish(dynamic info, bool allowInsecureAccess = false) { + AccessoryInfo = new AccessoryInfo(this, info); + IdentifierCache = new IdentifierCache(info); + AssignIds(IdentifierCache); + LogAccessorySummary(); } @@ -108,6 +123,7 @@ public void LogAccessorySummary() Logger.Verbose("[{Type}] name: {Name}", this.GetType().Name, DisplayName); Logger.Verbose("-------------------------------------------------"); Logger.Verbose("uuid: {Uuid}", Uuid); + Logger.Verbose("accessory id: {Aid}", AccessoryId); foreach (var (key, service) in _services) { @@ -124,5 +140,27 @@ public void LogAccessorySummary() } } } + + /// + /// Assigns aid/iid to ourselves, any Accessories we are bridging, and all associated Services+Characteristics. Uses + /// the provided identifierCache to keep IDs stable. + /// + /// + public void AssignIds(IIdentifierCache identifierCache) + { + if (!IsBridged && this is IBridge) + { + // as we are the bridge, we must have id = 1. + AccessoryId = 1; + } + + foreach (var (_, service) in Services) + { + if (this is IBridge) + service.AssignIds(IdentifierCache, this, 2000000000); + else + service.AssignIds(identifierCache, this); + } + } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index 44930de..ff4f2e7 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -23,6 +23,9 @@ using System; using System.Collections.Generic; +using Homer.Platform.HomeKit.Accessories.Info; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; using Serilog; @@ -34,15 +37,7 @@ namespace Homer.Platform.HomeKit.Accessories /// public interface IAccessoryBase : IEntity { - /// - /// Master logger instance. - /// - ILogger Logger { get; } - - /// - /// Accessory logger. - /// - ILogger AccessoryLogger { get; } + int? AccessoryId { get; } /// /// true if we are hosted "behind" a Bridge Accessory @@ -64,6 +59,20 @@ public interface IAccessoryBase : IEntity /// IReadOnlyDictionary Services { get; } + IAccessoryInfo AccessoryInfo { get; } + + IIdentifierCache IdentifierCache { get; } + + /// + /// Master logger instance. + /// + ILogger Logger { get; } + + /// + /// Accessory logger. + /// + ILogger AccessoryLogger { get; } + /// /// Adds service. /// @@ -76,5 +85,7 @@ public interface IAccessoryBase : IEntity void Publish(dynamic info, bool allowInsecureAccess = false); void LogAccessorySummary(); + + void AssignIds(IIdentifierCache identifierCache); } } diff --git a/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs b/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs new file mode 100644 index 0000000..e15bbb1 --- /dev/null +++ b/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Nacl; + +namespace Homer.Platform.HomeKit.Accessories.Info +{ + public class AccessoryInfo : IAccessoryInfo + { + public string Username { get; } + + public string DisplayName { get; } + + public AccessoryCategory Category { get; } + + public string PinCode { get; } + + public string SecretKey { get; } + + public string PublicKey { get; } + + public IReadOnlyList PairedClients { get; } + + public int ConfigVersion { get; } + + public string ConfigHash { get; } + + public string SetupId { get; } + + public bool RelayEnabled { get; } + + public int RelayState { get; } + + public string RelayAccessoryId { get; } + + public string RelayAdminId { get; } + + public IReadOnlyList RelayPairedControllers { get; } + + public string BagUrl { get; } + + public AccessoryInfo(IAccessoryBase accessoryBase, dynamic info) + { + if (accessoryBase == null) throw new ArgumentNullException(nameof(accessoryBase)); + + Username = info.username; + + DisplayName = accessoryBase.DisplayName; + Category = accessoryBase.Category; + PinCode = info.pin; + + // create secret & private keys. + SecretKey = "GK4GzNY+fbkRPd5fwYUaca70iENh2A1QRss1KBtpWU4="; + var publicKey = TweetNaCl.CryptoBoxKeypair(Convert.FromBase64String(SecretKey)); + PublicKey = Encoding.ASCII.GetString(publicKey); + + // generate setup id. + SetupId = RandomString(4); + } + + + private static readonly Random _random = new Random(); + + public static string RandomString(int length) + { + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + return new string(Enumerable.Repeat(chars, length) + .Select(s => s[_random.Next(s.Length)]).ToArray()); + } + } +} diff --git a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs index e8487c3..6256476 100644 --- a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs +++ b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs @@ -4,7 +4,41 @@ namespace Homer.Platform.HomeKit.Accessories.Info { - public interface IAcessoryInfo + /// + /// Internal data for accessory that get persisted to disk. + /// + public interface IAccessoryInfo { + string Username { get; } + + string DisplayName { get; } + + AccessoryCategory Category { get; } + + string PinCode { get; } + + string SecretKey { get; } + + string PublicKey { get; } + + IReadOnlyList PairedClients { get; } + + int ConfigVersion { get; } + + string ConfigHash { get; } + + string SetupId { get; } + + bool RelayEnabled { get; } + + int RelayState { get; } + + string RelayAccessoryId { get; } + + string RelayAdminId { get; } + + IReadOnlyList RelayPairedControllers { get; } + + string BagUrl { get; } } } diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index e11055b..b130dc7 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -40,7 +40,7 @@ public class Bridge : AccessoryBase, IBridge private readonly List _accessories; protected Bridge(string uuid, string displayName, bool isReachable = true) - : base(uuid, displayName, isReachable, true, AccessoryCategory.Bridge) + : base(uuid, displayName, false, isReachable, AccessoryCategory.Bridge) { _accessories = new List(); diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs index 9932bb1..ead625b 100644 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs @@ -62,7 +62,7 @@ public BridgeSetupManager(string uuid, string displayName, IConfigurationService .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); dynamic info = new ExpandoObject(); - info.serial = _configurationService.Configuration.Platforms.Homekit.Setup.Serial; + info.username = _configurationService.Configuration.Platforms.Homekit.Setup.Serial; info.port = _configurationService.Configuration.Platforms.Homekit.Setup.Port; info.pin = _configurationService.Configuration.Platforms.Homekit.Setup.Pin; info.category = Category; diff --git a/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs b/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs new file mode 100644 index 0000000..4809a8e --- /dev/null +++ b/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Characteristics; +using Homer.Platform.HomeKit.Services; + +namespace Homer.Platform.HomeKit.Caches.Identifiers +{ + /// + /// IdentifierCache is a model class that manages a system of associating HAP "Accessory IDs" and "Instance IDs" + /// with other values that don't usually change. HomeKit Clients use Accessory/Instance IDs as a primary key of + /// sorts, so the IDs need to remain "stable". For instance, if you create a HomeKit "Scene" called "Leaving Home" + /// that sets your Alarm System's "Target Alarm State" Characteristic to "Arm Away", that Scene will store whatever + /// "Instance ID" it was given for the "Target Alarm State" Characteristic.If the ID changes later on this server, + /// the scene will stop working. + /// + public interface IIdentifierCache + { + string Username { get; } + + IReadOnlyDictionary Cache { get; } + + IReadOnlyDictionary UsedCache { get; } + + string SavedCacheHash { get; } + + string GetInstanceId(IAccessoryBase accessory, IService service, ICharacteristic characteristic); + } +} diff --git a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs new file mode 100644 index 0000000..fe8d957 --- /dev/null +++ b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Characteristics; +using Homer.Platform.HomeKit.Services; + +namespace Homer.Platform.HomeKit.Caches.Identifiers +{ + public class IdentifierCache : IIdentifierCache + { + public string Username { get; } + + public IReadOnlyDictionary Cache { get; } + + public IReadOnlyDictionary UsedCache { get; } + + public string SavedCacheHash { get; } + + private Dictionary _cache; + + private Dictionary _usedCache; + + public IdentifierCache(dynamic info) + { + _cache = new Dictionary(); + _usedCache = new Dictionary(); + + Cache = new ReadOnlyDictionary(_cache); + UsedCache = new ReadOnlyDictionary(_usedCache); + + Username = info.username; + SavedCacheHash = ""; + } + + public string GetInstanceId(IAccessoryBase accessory, IService service, ICharacteristic characteristic) + { + if (accessory == null) throw new ArgumentNullException(nameof(characteristic)); + if (service == null) throw new ArgumentNullException(nameof(characteristic)); + if (characteristic == null) throw new ArgumentNullException(nameof(characteristic)); + + return $"{accessory.Uuid}|{service.Uuid}|{characteristic.Uuid}"; +; } + } +} diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index ff599dc..bdf3b1b 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -24,7 +24,11 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Events; +using Homer.Platform.HomeKit.Services; using uuid.net.Classes.UUID; using uuid.net.Static_Classes.UUID_Validator; @@ -186,6 +190,11 @@ public string ToHapJson() throw new NotImplementedException(); } + public void AssignId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service) + { + throw new NotImplementedException(); + } + private void ValidateValue(dynamic value) { diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs index 6fe1bfb..8d4da40 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AccessoryFlagsCharacteristic: Characteristic { + public const string Uuid = "000000A6-0000-1000-8000-0026BB765291"; + public AccessoryFlagsCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs index c4e6894..3d39019 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ActiveCharacteristic: Characteristic { + public const string Uuid = "000000B0-0000-1000-8000-0026BB765291"; + public const int Inactive = 0; public const int Active = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs index 9c152c6..8f2fe87 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AdministratorOnlyAccessCharacteristic: Characteristic { + public const string Uuid = "00000001-0000-1000-8000-0026BB765291"; + public AdministratorOnlyAccessCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs index ed58713..7c04ba1 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirParticulateDensityCharacteristic: Characteristic { + public const string Uuid = "00000064-0000-1000-8000-0026BB765291"; + public AirParticulateDensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs index 6943add..e482d12 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirParticulateSizeCharacteristic: Characteristic { + public const string Uuid = "00000065-0000-1000-8000-0026BB765291"; + public const int _2_5_m = 0; public const int _10_m = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs index 4a8d32e..1f4e76c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AirQualityCharacteristic: Characteristic { + public const string Uuid = "00000095-0000-1000-8000-0026BB765291"; + public const int Unknown = 0; public const int Excellent = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs index 23aabea..0c5bc1c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class AudioFeedbackCharacteristic: Characteristic { + public const string Uuid = "00000005-0000-1000-8000-0026BB765291"; + public AudioFeedbackCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs index a0aef93..f0b54db 100644 --- a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class BatteryLevelCharacteristic: Characteristic { + public const string Uuid = "00000068-0000-1000-8000-0026BB765291"; + public BatteryLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs index ce5edd9..3bebefb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class BrightnessCharacteristic: Characteristic { + public const string Uuid = "00000008-0000-1000-8000-0026BB765291"; + public BrightnessCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs index ba3ea94..93b4b22 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxideDetectedCharacteristic: Characteristic { + public const string Uuid = "00000092-0000-1000-8000-0026BB765291"; + public const int CO2_Levels_Normal = 0; public const int CO2_Levels_Abnormal = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs index 24850d4..447c5c0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxideLevelCharacteristic: Characteristic { + public const string Uuid = "00000093-0000-1000-8000-0026BB765291"; + public CarbonDioxideLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs index 9d2da2e..0e52fd5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonDioxidePeakLevelCharacteristic: Characteristic { + public const string Uuid = "00000094-0000-1000-8000-0026BB765291"; + public CarbonDioxidePeakLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs index 99c33da..55adc85 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxideDetectedCharacteristic: Characteristic { + public const string Uuid = "00000069-0000-1000-8000-0026BB765291"; + public const int CO_Levels_Normal = 0; public const int CO_Levels_Abnormal = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs index de92e16..1aa441f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxideLevelCharacteristic: Characteristic { + public const string Uuid = "00000090-0000-1000-8000-0026BB765291"; + public CarbonMonoxideLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs index 6a54043..febad67 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CarbonMonoxidePeakLevelCharacteristic: Characteristic { + public const string Uuid = "00000091-0000-1000-8000-0026BB765291"; + public CarbonMonoxidePeakLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs index 6c63552..3be5017 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ChargingStateCharacteristic: Characteristic { + public const string Uuid = "0000008F-0000-1000-8000-0026BB765291"; + public const int Not_Charging = 0; public const int Charging = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs index b6e208b..234403e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ColorTemperatureCharacteristic: Characteristic { + public const string Uuid = "000000CE-0000-1000-8000-0026BB765291"; + public ColorTemperatureCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs index 7ec7699..f299a39 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ContactSensorStateCharacteristic: Characteristic { + public const string Uuid = "0000006A-0000-1000-8000-0026BB765291"; + public const int Contact_Detected = 0; public const int Contact_Not_Detected = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs index 7c1a53a..d718486 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CoolingThresholdTemperatureCharacteristic: Characteristic { + public const string Uuid = "0000000D-0000-1000-8000-0026BB765291"; + public CoolingThresholdTemperatureCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs index fdf1038..095dbf5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentAirPurifierStateCharacteristic: Characteristic { + public const string Uuid = "000000A9-0000-1000-8000-0026BB765291"; + public const int Inactive = 0; public const int Idle = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs index eace0a1..8d81d18 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentAmbientLightLevelCharacteristic: Characteristic { + public const string Uuid = "0000006B-0000-1000-8000-0026BB765291"; + public CurrentAmbientLightLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs index 73d9e0a..a28c4ee 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentDoorStateCharacteristic: Characteristic { + public const string Uuid = "0000000E-0000-1000-8000-0026BB765291"; + public const int Open = 0; public const int Closed = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs index 97281cd..4d4f01c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentFanStateCharacteristic: Characteristic { + public const string Uuid = "000000AF-0000-1000-8000-0026BB765291"; + public const int Inactive = 0; public const int Idle = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs index 1b4d43e..817531f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHeaterCoolerStateCharacteristic: Characteristic { + public const string Uuid = "000000B1-0000-1000-8000-0026BB765291"; + public const int Inactive = 0; public const int Idle = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs index ac12773..6a96407 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHeatingCoolingStateCharacteristic: Characteristic { + public const string Uuid = "0000000F-0000-1000-8000-0026BB765291"; + public const int Off = 0; public const int Heat = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs index 3d07852..2f0debb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHorizontalTiltAngleCharacteristic: Characteristic { + public const string Uuid = "0000006C-0000-1000-8000-0026BB765291"; + public CurrentHorizontalTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs index 00ae9ef..83b6ae2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentHumidifierDehumidifierStateCharacteristic: Characteristic { + public const string Uuid = "000000B3-0000-1000-8000-0026BB765291"; + public const int Inactive = 0; public const int Idle = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs index d596a23..64c7c81 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentPositionCharacteristic: Characteristic { + public const string Uuid = "0000006D-0000-1000-8000-0026BB765291"; + public CurrentPositionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs index 7202c93..cf4db70 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentRelativeHumidityCharacteristic: Characteristic { + public const string Uuid = "00000010-0000-1000-8000-0026BB765291"; + public CurrentRelativeHumidityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs index 2344128..92d4d5b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentSlatStateCharacteristic: Characteristic { + public const string Uuid = "000000AA-0000-1000-8000-0026BB765291"; + public const int Fixed = 0; public const int Jammed = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs index ce2573f..cc0aa19 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentTemperatureCharacteristic: Characteristic { + public const string Uuid = "00000011-0000-1000-8000-0026BB765291"; + public CurrentTemperatureCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs index 529475e..dc333ea 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentTiltAngleCharacteristic: Characteristic { + public const string Uuid = "000000C1-0000-1000-8000-0026BB765291"; + public CurrentTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs index 4447136..b6301da 100644 --- a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class CurrentVerticalTiltAngleCharacteristic: Characteristic { + public const string Uuid = "0000006E-0000-1000-8000-0026BB765291"; + public CurrentVerticalTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs index f383800..fd3fa31 100644 --- a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class DigitalZoomCharacteristic: Characteristic { + public const string Uuid = "0000011D-0000-1000-8000-0026BB765291"; + public DigitalZoomCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs index e8a24a8..cbc17b5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FilterChangeIndicationCharacteristic: Characteristic { + public const string Uuid = "000000AC-0000-1000-8000-0026BB765291"; + public const int Filter_OK = 0; public const int Change_Filter = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs index 96b5d12..77b276b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FilterLifeLevelCharacteristic: Characteristic { + public const string Uuid = "000000AB-0000-1000-8000-0026BB765291"; + public FilterLifeLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs index b309f52..8f0474d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class FirmwareRevisionCharacteristic: Characteristic { + public const string Uuid = "00000052-0000-1000-8000-0026BB765291"; + public FirmwareRevisionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs index 40cf957..dad9f62 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HardwareRevisionCharacteristic: Characteristic { + public const string Uuid = "00000053-0000-1000-8000-0026BB765291"; + public HardwareRevisionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs index cc0166f..b8df1d8 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HeatingThresholdTemperatureCharacteristic: Characteristic { + public const string Uuid = "00000012-0000-1000-8000-0026BB765291"; + public HeatingThresholdTemperatureCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs index 8967bf1..9c387a3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HoldPositionCharacteristic: Characteristic { + public const string Uuid = "0000006F-0000-1000-8000-0026BB765291"; + public HoldPositionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs index 4aa5b11..76d284b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class HueCharacteristic: Characteristic { + public const string Uuid = "00000013-0000-1000-8000-0026BB765291"; + public HueCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs index af3e0c9..cf8b62a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class IdentifyCharacteristic: Characteristic { + public const string Uuid = "00000014-0000-1000-8000-0026BB765291"; + public IdentifyCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs index a235be5..9fabbc0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ImageMirroringCharacteristic: Characteristic { + public const string Uuid = "0000011F-0000-1000-8000-0026BB765291"; + public ImageMirroringCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs index c5af9c1..0ae92c0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ImageRotationCharacteristic: Characteristic { + public const string Uuid = "0000011E-0000-1000-8000-0026BB765291"; + public ImageRotationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs index 6c7dd0e..7d974b7 100644 --- a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class InUseCharacteristic: Characteristic { + public const string Uuid = "000000D2-0000-1000-8000-0026BB765291"; + public const int Not_In_Use = 0; public const int In_Use = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs index 43906fc..1867a8e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class IsConfiguredCharacteristic: Characteristic { + public const string Uuid = "000000D6-0000-1000-8000-0026BB765291"; + public const int Not_Configured = 0; public const int Configured = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs index dd58ec1..716c333 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LeakDetectedCharacteristic: Characteristic { + public const string Uuid = "00000070-0000-1000-8000-0026BB765291"; + public const int Leak_Not_Detected = 0; public const int Leak_Detected = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs index 29b3f0e..d8227cb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockControlPointCharacteristic: Characteristic { + public const string Uuid = "00000019-0000-1000-8000-0026BB765291"; + public LockControlPointCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs index 1839748..6701b3f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockCurrentStateCharacteristic: Characteristic { + public const string Uuid = "0000001D-0000-1000-8000-0026BB765291"; + public const int Unsecured = 0; public const int Secured = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs index 3e736fe..f95328a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockLastKnownActionCharacteristic: Characteristic { + public const string Uuid = "0000001C-0000-1000-8000-0026BB765291"; + public const int Secured_Physically_Interior = 0; public const int Unsecured_Physically_Interior = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs index 8a70f86..7476f64 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockManagementAutoSecurityTimeoutCharacteristic: Characteristic { + public const string Uuid = "0000001A-0000-1000-8000-0026BB765291"; + public LockManagementAutoSecurityTimeoutCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs index 4bd8ab6..c9996dc 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockPhysicalControlsCharacteristic: Characteristic { + public const string Uuid = "000000A7-0000-1000-8000-0026BB765291"; + public const int Control_Lock_Disabled = 0; public const int Control_Lock_Enabled = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs index 97b29fb..35bdf49 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LockTargetStateCharacteristic: Characteristic { + public const string Uuid = "0000001E-0000-1000-8000-0026BB765291"; + public const int Unsecured = 0; public const int Secured = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs index 7f15e5a..00d228a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class LogsCharacteristic: Characteristic { + public const string Uuid = "0000001F-0000-1000-8000-0026BB765291"; + public LogsCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs index 33fac8b..4cbbcf0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ManufacturerCharacteristic: Characteristic { + public const string Uuid = "00000020-0000-1000-8000-0026BB765291"; + public ManufacturerCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs index a7f9aea..2a69c49 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ModelCharacteristic: Characteristic { + public const string Uuid = "00000021-0000-1000-8000-0026BB765291"; + public ModelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs index c9ae191..77c2bbb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class MotionDetectedCharacteristic: Characteristic { + public const string Uuid = "00000022-0000-1000-8000-0026BB765291"; + public MotionDetectedCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs index a761e21..2f609fa 100644 --- a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class MuteCharacteristic: Characteristic { + public const string Uuid = "0000011A-0000-1000-8000-0026BB765291"; + public MuteCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs index 1da19c9..b33bad6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NameCharacteristic: Characteristic { + public const string Uuid = "00000023-0000-1000-8000-0026BB765291"; + public NameCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs index d6e6316..3124630 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NightVisionCharacteristic: Characteristic { + public const string Uuid = "0000011B-0000-1000-8000-0026BB765291"; + public NightVisionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs index 5d26199..241674d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class NitrogenDioxideDensityCharacteristic: Characteristic { + public const string Uuid = "000000C4-0000-1000-8000-0026BB765291"; + public NitrogenDioxideDensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs index 5c21e10..fb04b30 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ObstructionDetectedCharacteristic: Characteristic { + public const string Uuid = "00000024-0000-1000-8000-0026BB765291"; + public ObstructionDetectedCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs index e78a0a8..207ecaa 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OccupancyDetectedCharacteristic: Characteristic { + public const string Uuid = "00000071-0000-1000-8000-0026BB765291"; + public const int Occupancy_Not_Detected = 0; public const int Occupancy_Detected = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs index a480987..1fffde6 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OnCharacteristic: Characteristic { + public const string Uuid = "00000025-0000-1000-8000-0026BB765291"; + public OnCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs index 903f1c1..87a42f0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OpticalZoomCharacteristic: Characteristic { + public const string Uuid = "0000011C-0000-1000-8000-0026BB765291"; + public OpticalZoomCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs index 08e4d17..681c60c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OutletInUseCharacteristic: Characteristic { + public const string Uuid = "00000026-0000-1000-8000-0026BB765291"; + public OutletInUseCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs index 86d2cc1..161bb60 100644 --- a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class OzoneDensityCharacteristic: Characteristic { + public const string Uuid = "000000C3-0000-1000-8000-0026BB765291"; + public OzoneDensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs index a1ae7f5..7d80481 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PM10DensityCharacteristic: Characteristic { + public const string Uuid = "000000C7-0000-1000-8000-0026BB765291"; + public PM10DensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs index 098ab0e..4b01c0c 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PM2_5DensityCharacteristic: Characteristic { + public const string Uuid = "000000C6-0000-1000-8000-0026BB765291"; + public PM2_5DensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs index d315bf2..302800b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairSetupCharacteristic: Characteristic { + public const string Uuid = "0000004C-0000-1000-8000-0026BB765291"; + public PairSetupCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs index 0be7336..73051cd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairVerifyCharacteristic: Characteristic { + public const string Uuid = "0000004E-0000-1000-8000-0026BB765291"; + public PairVerifyCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs index 1d7cd5e..d61509d 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairingFeaturesCharacteristic: Characteristic { + public const string Uuid = "0000004F-0000-1000-8000-0026BB765291"; + public PairingFeaturesCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs index b70ed48..e25f216 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PairingPairingsCharacteristic: Characteristic { + public const string Uuid = "00000050-0000-1000-8000-0026BB765291"; + public PairingPairingsCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs index 5563fc6..3d698e2 100644 --- a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class PositionStateCharacteristic: Characteristic { + public const string Uuid = "00000072-0000-1000-8000-0026BB765291"; + public const int Decreasing = 0; public const int Increasing = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs index f19ec72..6db7e67 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ProgramModeCharacteristic: Characteristic { + public const string Uuid = "000000D1-0000-1000-8000-0026BB765291"; + public const int No_Program_Scheduled = 0; public const int Program_Scheduled = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs index fedb4b1..fd50f85 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ProgrammableSwitchEventCharacteristic: Characteristic { + public const string Uuid = "00000073-0000-1000-8000-0026BB765291"; + public const int Single_Press = 0; public const int Double_Press = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs index 14b2876..766973e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RelativeHumidityDehumidifierThresholdCharacteristic: Characteristic { + public const string Uuid = "000000C9-0000-1000-8000-0026BB765291"; + public RelativeHumidityDehumidifierThresholdCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs index 2c450ea..e5f84b5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RelativeHumidityHumidifierThresholdCharacteristic: Characteristic { + public const string Uuid = "000000CA-0000-1000-8000-0026BB765291"; + public RelativeHumidityHumidifierThresholdCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs index 86ccc6c..7c7ad45 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RemainingDurationCharacteristic: Characteristic { + public const string Uuid = "000000D4-0000-1000-8000-0026BB765291"; + public RemainingDurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs index c95f5b2..1580d7f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ResetFilterIndicationCharacteristic: Characteristic { + public const string Uuid = "000000AD-0000-1000-8000-0026BB765291"; + public ResetFilterIndicationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs index 11f6857..b1909cf 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RotationDirectionCharacteristic: Characteristic { + public const string Uuid = "00000028-0000-1000-8000-0026BB765291"; + public const int Clockwise = 0; public const int Counter_clockwise = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs index 9899286..5e86c2a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class RotationSpeedCharacteristic: Characteristic { + public const string Uuid = "00000029-0000-1000-8000-0026BB765291"; + public RotationSpeedCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs index 7aed282..61235d3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SaturationCharacteristic: Characteristic { + public const string Uuid = "0000002F-0000-1000-8000-0026BB765291"; + public SaturationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs index 232aa25..a043acd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemAlarmTypeCharacteristic: Characteristic { + public const string Uuid = "0000008E-0000-1000-8000-0026BB765291"; + public SecuritySystemAlarmTypeCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs index c73d510..dbe1ec5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemCurrentStateCharacteristic: Characteristic { + public const string Uuid = "00000066-0000-1000-8000-0026BB765291"; + public const int Stay_Arm = 0; public const int Away_Arm = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs index 7ca679c..c32311b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SecuritySystemTargetStateCharacteristic: Characteristic { + public const string Uuid = "00000067-0000-1000-8000-0026BB765291"; + public const int Stay_Arm = 0; public const int Away_Arm = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs index 1078089..3121895 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SelectedRTPStreamConfigurationCharacteristic: Characteristic { + public const string Uuid = "00000117-0000-1000-8000-0026BB765291"; + public SelectedRTPStreamConfigurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs index 5f1e968..faf298f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SerialNumberCharacteristic: Characteristic { + public const string Uuid = "00000030-0000-1000-8000-0026BB765291"; + public SerialNumberCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs index c8877ba..9d2a7c4 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ServiceLabelIndexCharacteristic: Characteristic { + public const string Uuid = "000000CB-0000-1000-8000-0026BB765291"; + public ServiceLabelIndexCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs index 32ea52a..dd1759a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ServiceLabelNamespaceCharacteristic: Characteristic { + public const string Uuid = "000000CD-0000-1000-8000-0026BB765291"; + public const int Dots = 0; public const int Arabic_Numerals = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs index fb1f7cf..4063385 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SetDurationCharacteristic: Characteristic { + public const string Uuid = "000000D3-0000-1000-8000-0026BB765291"; + public SetDurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs index b13307c..955acc3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SetupEndpointsCharacteristic: Characteristic { + public const string Uuid = "00000118-0000-1000-8000-0026BB765291"; + public SetupEndpointsCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs index 83ba4e4..6c1f1bd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SlatTypeCharacteristic: Characteristic { + public const string Uuid = "000000C0-0000-1000-8000-0026BB765291"; + public const int Horizontal = 0; public const int Vertical = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs index 80b9cd4..7a84773 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SmokeDetectedCharacteristic: Characteristic { + public const string Uuid = "00000076-0000-1000-8000-0026BB765291"; + public const int Smoke_Not_Detected = 0; public const int Smoke_Detected = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs index 3a73286..bd48699 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusActiveCharacteristic: Characteristic { + public const string Uuid = "00000075-0000-1000-8000-0026BB765291"; + public StatusActiveCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs index 66214c7..fecdcea 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusFaultCharacteristic: Characteristic { + public const string Uuid = "00000077-0000-1000-8000-0026BB765291"; + public const int No_Fault = 0; public const int General_Fault = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs index 076ad12..219897f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusJammedCharacteristic: Characteristic { + public const string Uuid = "00000078-0000-1000-8000-0026BB765291"; + public const int Not_Jammed = 0; public const int Jammed = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs index 0b6c319..4233872 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusLowBatteryCharacteristic: Characteristic { + public const string Uuid = "00000079-0000-1000-8000-0026BB765291"; + public const int Battery_Level_Normal = 0; public const int Battery_Level_Low = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs index 9bd1f94..d268170 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StatusTamperedCharacteristic: Characteristic { + public const string Uuid = "0000007A-0000-1000-8000-0026BB765291"; + public const int Not_Tampered = 0; public const int Tampered = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs index cd4bf97..3e0af0e 100644 --- a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class StreamingStatusCharacteristic: Characteristic { + public const string Uuid = "00000120-0000-1000-8000-0026BB765291"; + public StreamingStatusCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs index 5d731b0..108490f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SulphurDioxideDensityCharacteristic: Characteristic { + public const string Uuid = "000000C5-0000-1000-8000-0026BB765291"; + public SulphurDioxideDensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs index c0e5f3f..10a4aba 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedAudioStreamConfigurationCharacteristic: Characteristic { + public const string Uuid = "00000115-0000-1000-8000-0026BB765291"; + public SupportedAudioStreamConfigurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs index e050e44..06f576f 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedRTPConfigurationCharacteristic: Characteristic { + public const string Uuid = "00000116-0000-1000-8000-0026BB765291"; + public SupportedRTPConfigurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs index e1f5cba..8ad07d5 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SupportedVideoStreamConfigurationCharacteristic: Characteristic { + public const string Uuid = "00000114-0000-1000-8000-0026BB765291"; + public SupportedVideoStreamConfigurationCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs index 40dafba..cf5ffb3 100644 --- a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class SwingModeCharacteristic: Characteristic { + public const string Uuid = "000000B6-0000-1000-8000-0026BB765291"; + public const int Swing_Disabled = 0; public const int Swing_Enabled = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs index 4c57bce..ad116b9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetAirPurifierStateCharacteristic: Characteristic { + public const string Uuid = "000000A8-0000-1000-8000-0026BB765291"; + public const int Manual = 0; public const int Auto = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs index c9de51b..9029a67 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetAirQualityCharacteristic: Characteristic { + public const string Uuid = "000000AE-0000-1000-8000-0026BB765291"; + public const int Excellent = 0; public const int Good = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs index 2bf0870..fb5c8f9 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetDoorStateCharacteristic: Characteristic { + public const string Uuid = "00000032-0000-1000-8000-0026BB765291"; + public const int Open = 0; public const int Closed = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs index c45c24d..b917362 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetFanStateCharacteristic: Characteristic { + public const string Uuid = "000000BF-0000-1000-8000-0026BB765291"; + public const int Manual = 0; public const int Auto = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs index 2033818..4df2e38 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHeaterCoolerStateCharacteristic: Characteristic { + public const string Uuid = "000000B2-0000-1000-8000-0026BB765291"; + public const int Auto = 0; public const int Heat = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs index 5912f72..7fc549b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHeatingCoolingStateCharacteristic: Characteristic { + public const string Uuid = "00000033-0000-1000-8000-0026BB765291"; + public const int Off = 0; public const int Heat = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs index 2a70be7..0ee3002 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHorizontalTiltAngleCharacteristic: Characteristic { + public const string Uuid = "0000007B-0000-1000-8000-0026BB765291"; + public TargetHorizontalTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs index 8b633a6..904f33a 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetHumidifierDehumidifierStateCharacteristic: Characteristic { + public const string Uuid = "000000B4-0000-1000-8000-0026BB765291"; + public const int Humidifier_Or_Dehumidifier = 0; public const int Humidifier = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs index 06b7885..d663a2b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetPositionCharacteristic: Characteristic { + public const string Uuid = "0000007C-0000-1000-8000-0026BB765291"; + public TargetPositionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs index 44bed98..ace6ada 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetRelativeHumidityCharacteristic: Characteristic { + public const string Uuid = "00000034-0000-1000-8000-0026BB765291"; + public TargetRelativeHumidityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs index b94d742..cf0eb86 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetSlatStateCharacteristic: Characteristic { + public const string Uuid = "000000BE-0000-1000-8000-0026BB765291"; + public const int Manual = 0; public const int Auto = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs index 3a4d17b..3dddd4b 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetTemperatureCharacteristic: Characteristic { + public const string Uuid = "00000035-0000-1000-8000-0026BB765291"; + public TargetTemperatureCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs index 167f1fc..9b158e0 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetTiltAngleCharacteristic: Characteristic { + public const string Uuid = "000000C2-0000-1000-8000-0026BB765291"; + public TargetTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs index 1449587..fb64b46 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TargetVerticalTiltAngleCharacteristic: Characteristic { + public const string Uuid = "0000007D-0000-1000-8000-0026BB765291"; + public TargetVerticalTiltAngleCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs index 2d242d3..97170cd 100644 --- a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class TemperatureDisplayUnitsCharacteristic: Characteristic { + public const string Uuid = "00000036-0000-1000-8000-0026BB765291"; + public const int Celsius = 0; public const int Fahrenheit = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs index 775b469..9372b73 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VOCDensityCharacteristic: Characteristic { + public const string Uuid = "000000C8-0000-1000-8000-0026BB765291"; + public VOCDensityCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs index 8d4571a..3b52bff 100644 --- a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class ValveTypeCharacteristic: Characteristic { + public const string Uuid = "000000D5-0000-1000-8000-0026BB765291"; + public const int Generic_Valve = 0; public const int Irrigation = 1; diff --git a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs index a195aa2..4db38cb 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VersionCharacteristic: Characteristic { + public const string Uuid = "00000037-0000-1000-8000-0026BB765291"; + public VersionCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs index 9109a5b..2473a21 100644 --- a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class VolumeCharacteristic: Characteristic { + public const string Uuid = "00000119-0000-1000-8000-0026BB765291"; + public VolumeCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs index dc9d0bd..03f9016 100644 --- a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs +++ b/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Characteristics.Definitions { public class WaterLevelCharacteristic: Characteristic { + public const string Uuid = "000000B5-0000-1000-8000-0026BB765291"; + public WaterLevelCharacteristic(): base( diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 52df252..053da8b 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -22,6 +22,10 @@ #endregion using System; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; +using Homer.Platform.HomeKit.Services; using uuid.net.Classes.UUID; namespace Homer.Platform.HomeKit.Characteristics @@ -116,5 +120,7 @@ public interface ICharacteristic void SetValue(dynamic value); string ToHapJson(); + + void AssignId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service); } } diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 87ad3e0..4593250 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -25,6 +25,7 @@ + diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs index 2a545f2..c1aeb0b 100644 --- a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs +++ b/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class AccessoryInformationService: Service { + public const string Uuid = "0000003E-0000-1000-8000-0026BB765291"; + public AccessoryInformationService() : base("0000003E-0000-1000-8000-0026BB765291", "Accessory Information") { diff --git a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs index f114121..fec3601 100644 --- a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs +++ b/src/platforms/homekit/Services/Definitions/AirPurifierService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class AirPurifierService: Service { + public const string Uuid = "000000BB-0000-1000-8000-0026BB765291"; + public AirPurifierService() : base("000000BB-0000-1000-8000-0026BB765291", "Air Purifier") { diff --git a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs index bb9afba..97e248c 100644 --- a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class AirQualitySensorService: Service { + public const string Uuid = "0000008D-0000-1000-8000-0026BB765291"; + public AirQualitySensorService() : base("0000008D-0000-1000-8000-0026BB765291", "Air Quality Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs index ec1ed86..9bc44bc 100644 --- a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs +++ b/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class BatteryServiceService: Service { + public const string Uuid = "00000096-0000-1000-8000-0026BB765291"; + public BatteryServiceService() : base("00000096-0000-1000-8000-0026BB765291", "Battery Service") { diff --git a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs index a05f620..326f198 100644 --- a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class CameraRTPStreamManagementService: Service { + public const string Uuid = "00000110-0000-1000-8000-0026BB765291"; + public CameraRTPStreamManagementService() : base("00000110-0000-1000-8000-0026BB765291", "Camera RTP Stream Management") { diff --git a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs index c711c7e..213e096 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class CarbonDioxideSensorService: Service { + public const string Uuid = "00000097-0000-1000-8000-0026BB765291"; + public CarbonDioxideSensorService() : base("00000097-0000-1000-8000-0026BB765291", "Carbon Dioxide Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs index ee0e1a7..615ae1a 100644 --- a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class CarbonMonoxideSensorService: Service { + public const string Uuid = "0000007F-0000-1000-8000-0026BB765291"; + public CarbonMonoxideSensorService() : base("0000007F-0000-1000-8000-0026BB765291", "Carbon Monoxide Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs index ad0aadd..21ab6d1 100644 --- a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/ContactSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class ContactSensorService: Service { + public const string Uuid = "00000080-0000-1000-8000-0026BB765291"; + public ContactSensorService() : base("00000080-0000-1000-8000-0026BB765291", "Contact Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/DoorService.cs b/src/platforms/homekit/Services/Definitions/DoorService.cs index 2c0201b..0696d2f 100644 --- a/src/platforms/homekit/Services/Definitions/DoorService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class DoorService: Service { + public const string Uuid = "00000081-0000-1000-8000-0026BB765291"; + public DoorService() : base("00000081-0000-1000-8000-0026BB765291", "Door") { diff --git a/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/src/platforms/homekit/Services/Definitions/DoorbellService.cs index 67fd2a6..7074173 100644 --- a/src/platforms/homekit/Services/Definitions/DoorbellService.cs +++ b/src/platforms/homekit/Services/Definitions/DoorbellService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class DoorbellService: Service { + public const string Uuid = "00000121-0000-1000-8000-0026BB765291"; + public DoorbellService() : base("00000121-0000-1000-8000-0026BB765291", "Doorbell") { diff --git a/src/platforms/homekit/Services/Definitions/FanService.cs b/src/platforms/homekit/Services/Definitions/FanService.cs index 37987b9..083b104 100644 --- a/src/platforms/homekit/Services/Definitions/FanService.cs +++ b/src/platforms/homekit/Services/Definitions/FanService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class FanService: Service { + public const string Uuid = "00000040-0000-1000-8000-0026BB765291"; + public FanService() : base("00000040-0000-1000-8000-0026BB765291", "Fan") { diff --git a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs index df2b1e4..492bef0 100644 --- a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs +++ b/src/platforms/homekit/Services/Definitions/Fanv2Service.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class Fanv2Service: Service { + public const string Uuid = "000000B7-0000-1000-8000-0026BB765291"; + public Fanv2Service() : base("000000B7-0000-1000-8000-0026BB765291", "Fan v2") { diff --git a/src/platforms/homekit/Services/Definitions/FaucetService.cs b/src/platforms/homekit/Services/Definitions/FaucetService.cs index e69cc0f..bfe09bb 100644 --- a/src/platforms/homekit/Services/Definitions/FaucetService.cs +++ b/src/platforms/homekit/Services/Definitions/FaucetService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class FaucetService: Service { + public const string Uuid = "000000D7-0000-1000-8000-0026BB765291"; + public FaucetService() : base("000000D7-0000-1000-8000-0026BB765291", "Faucet") { diff --git a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs index f6c78b5..99b0cdd 100644 --- a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs +++ b/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class FilterMaintenanceService: Service { + public const string Uuid = "000000BA-0000-1000-8000-0026BB765291"; + public FilterMaintenanceService() : base("000000BA-0000-1000-8000-0026BB765291", "Filter Maintenance") { diff --git a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs index 51432a4..cd6d333 100644 --- a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs +++ b/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class GarageDoorOpenerService: Service { + public const string Uuid = "00000041-0000-1000-8000-0026BB765291"; + public GarageDoorOpenerService() : base("00000041-0000-1000-8000-0026BB765291", "Garage Door Opener") { diff --git a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs index 270f48d..42a5836 100644 --- a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs +++ b/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class HeaterCoolerService: Service { + public const string Uuid = "000000BC-0000-1000-8000-0026BB765291"; + public HeaterCoolerService() : base("000000BC-0000-1000-8000-0026BB765291", "Heater Cooler") { diff --git a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs index fc37f98..a73e06d 100644 --- a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs +++ b/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class HumidifierDehumidifierService: Service { + public const string Uuid = "000000BD-0000-1000-8000-0026BB765291"; + public HumidifierDehumidifierService() : base("000000BD-0000-1000-8000-0026BB765291", "Humidifier Dehumidifier") { diff --git a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs index fcfe4d7..7f6d323 100644 --- a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class HumiditySensorService: Service { + public const string Uuid = "00000082-0000-1000-8000-0026BB765291"; + public HumiditySensorService() : base("00000082-0000-1000-8000-0026BB765291", "Humidity Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs index 3321673..5eafde9 100644 --- a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs +++ b/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class IrrigationSystemService: Service { + public const string Uuid = "000000CF-0000-1000-8000-0026BB765291"; + public IrrigationSystemService() : base("000000CF-0000-1000-8000-0026BB765291", "Irrigation System") { diff --git a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs index 714f994..80f5019 100644 --- a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LeakSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class LeakSensorService: Service { + public const string Uuid = "00000083-0000-1000-8000-0026BB765291"; + public LeakSensorService() : base("00000083-0000-1000-8000-0026BB765291", "Leak Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/src/platforms/homekit/Services/Definitions/LightSensorService.cs index a7f7aed..c9c1270 100644 --- a/src/platforms/homekit/Services/Definitions/LightSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/LightSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class LightSensorService: Service { + public const string Uuid = "00000084-0000-1000-8000-0026BB765291"; + public LightSensorService() : base("00000084-0000-1000-8000-0026BB765291", "Light Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/src/platforms/homekit/Services/Definitions/LightbulbService.cs index 787f081..131e5a6 100644 --- a/src/platforms/homekit/Services/Definitions/LightbulbService.cs +++ b/src/platforms/homekit/Services/Definitions/LightbulbService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class LightbulbService: Service { + public const string Uuid = "00000043-0000-1000-8000-0026BB765291"; + public LightbulbService() : base("00000043-0000-1000-8000-0026BB765291", "Lightbulb") { diff --git a/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/src/platforms/homekit/Services/Definitions/LockManagementService.cs index f771faa..6306f83 100644 --- a/src/platforms/homekit/Services/Definitions/LockManagementService.cs +++ b/src/platforms/homekit/Services/Definitions/LockManagementService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class LockManagementService: Service { + public const string Uuid = "00000044-0000-1000-8000-0026BB765291"; + public LockManagementService() : base("00000044-0000-1000-8000-0026BB765291", "Lock Management") { diff --git a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs index 61d73a1..69d9051 100644 --- a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs +++ b/src/platforms/homekit/Services/Definitions/LockMechanismService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class LockMechanismService: Service { + public const string Uuid = "00000045-0000-1000-8000-0026BB765291"; + public LockMechanismService() : base("00000045-0000-1000-8000-0026BB765291", "Lock Mechanism") { diff --git a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs index b4002aa..8646f8f 100644 --- a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs +++ b/src/platforms/homekit/Services/Definitions/MicrophoneService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class MicrophoneService: Service { + public const string Uuid = "00000112-0000-1000-8000-0026BB765291"; + public MicrophoneService() : base("00000112-0000-1000-8000-0026BB765291", "Microphone") { diff --git a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs index 7af2e4e..1065131 100644 --- a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/MotionSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class MotionSensorService: Service { + public const string Uuid = "00000085-0000-1000-8000-0026BB765291"; + public MotionSensorService() : base("00000085-0000-1000-8000-0026BB765291", "Motion Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs index 52a8d1b..b92d1b3 100644 --- a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs +++ b/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class OccupancySensorService: Service { + public const string Uuid = "00000086-0000-1000-8000-0026BB765291"; + public OccupancySensorService() : base("00000086-0000-1000-8000-0026BB765291", "Occupancy Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/OutletService.cs b/src/platforms/homekit/Services/Definitions/OutletService.cs index 655af1f..daa037c 100644 --- a/src/platforms/homekit/Services/Definitions/OutletService.cs +++ b/src/platforms/homekit/Services/Definitions/OutletService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class OutletService: Service { + public const string Uuid = "00000047-0000-1000-8000-0026BB765291"; + public OutletService() : base("00000047-0000-1000-8000-0026BB765291", "Outlet") { diff --git a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs index b4c3dfb..6376df0 100644 --- a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs +++ b/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class SecuritySystemService: Service { + public const string Uuid = "0000007E-0000-1000-8000-0026BB765291"; + public SecuritySystemService() : base("0000007E-0000-1000-8000-0026BB765291", "Security System") { diff --git a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs index 0f7e1fc..dbe427d 100644 --- a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs +++ b/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class ServiceLabelService: Service { + public const string Uuid = "000000CC-0000-1000-8000-0026BB765291"; + public ServiceLabelService() : base("000000CC-0000-1000-8000-0026BB765291", "Service Label") { diff --git a/src/platforms/homekit/Services/Definitions/SlatService.cs b/src/platforms/homekit/Services/Definitions/SlatService.cs index 8f0d180..b94cf79 100644 --- a/src/platforms/homekit/Services/Definitions/SlatService.cs +++ b/src/platforms/homekit/Services/Definitions/SlatService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class SlatService: Service { + public const string Uuid = "000000B9-0000-1000-8000-0026BB765291"; + public SlatService() : base("000000B9-0000-1000-8000-0026BB765291", "Slat") { diff --git a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs index 4c30150..c6fc414 100644 --- a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class SmokeSensorService: Service { + public const string Uuid = "00000087-0000-1000-8000-0026BB765291"; + public SmokeSensorService() : base("00000087-0000-1000-8000-0026BB765291", "Smoke Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/src/platforms/homekit/Services/Definitions/SpeakerService.cs index a01ccfb..f8e8f42 100644 --- a/src/platforms/homekit/Services/Definitions/SpeakerService.cs +++ b/src/platforms/homekit/Services/Definitions/SpeakerService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class SpeakerService: Service { + public const string Uuid = "00000113-0000-1000-8000-0026BB765291"; + public SpeakerService() : base("00000113-0000-1000-8000-0026BB765291", "Speaker") { diff --git a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs index 9964d5a..a1f2427 100644 --- a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class StatelessProgrammableSwitchService: Service { + public const string Uuid = "00000089-0000-1000-8000-0026BB765291"; + public StatelessProgrammableSwitchService() : base("00000089-0000-1000-8000-0026BB765291", "Stateless Programmable Switch") { diff --git a/src/platforms/homekit/Services/Definitions/SwitchService.cs b/src/platforms/homekit/Services/Definitions/SwitchService.cs index 5d86cd0..0f6d394 100644 --- a/src/platforms/homekit/Services/Definitions/SwitchService.cs +++ b/src/platforms/homekit/Services/Definitions/SwitchService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class SwitchService: Service { + public const string Uuid = "00000049-0000-1000-8000-0026BB765291"; + public SwitchService() : base("00000049-0000-1000-8000-0026BB765291", "Switch") { diff --git a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs index c70b8d1..e229bfe 100644 --- a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs +++ b/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class TemperatureSensorService: Service { + public const string Uuid = "0000008A-0000-1000-8000-0026BB765291"; + public TemperatureSensorService() : base("0000008A-0000-1000-8000-0026BB765291", "Temperature Sensor") { diff --git a/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/src/platforms/homekit/Services/Definitions/ThermostatService.cs index 8ed5c33..3c78872 100644 --- a/src/platforms/homekit/Services/Definitions/ThermostatService.cs +++ b/src/platforms/homekit/Services/Definitions/ThermostatService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class ThermostatService: Service { + public const string Uuid = "0000004A-0000-1000-8000-0026BB765291"; + public ThermostatService() : base("0000004A-0000-1000-8000-0026BB765291", "Thermostat") { diff --git a/src/platforms/homekit/Services/Definitions/ValveService.cs b/src/platforms/homekit/Services/Definitions/ValveService.cs index 3fde727..da012a3 100644 --- a/src/platforms/homekit/Services/Definitions/ValveService.cs +++ b/src/platforms/homekit/Services/Definitions/ValveService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class ValveService: Service { + public const string Uuid = "000000D0-0000-1000-8000-0026BB765291"; + public ValveService() : base("000000D0-0000-1000-8000-0026BB765291", "Valve") { diff --git a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs index 13ad0a5..0b4a61f 100644 --- a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class WindowCoveringService: Service { + public const string Uuid = "0000008C-0000-1000-8000-0026BB765291"; + public WindowCoveringService() : base("0000008C-0000-1000-8000-0026BB765291", "Window Covering") { diff --git a/src/platforms/homekit/Services/Definitions/WindowService.cs b/src/platforms/homekit/Services/Definitions/WindowService.cs index 438d7b5..0b06e05 100644 --- a/src/platforms/homekit/Services/Definitions/WindowService.cs +++ b/src/platforms/homekit/Services/Definitions/WindowService.cs @@ -27,6 +27,8 @@ namespace Homer.Platform.HomeKit.Services.Definitions { public class WindowService: Service { + public const string Uuid = "0000008B-0000-1000-8000-0026BB765291"; + public WindowService() : base("0000008B-0000-1000-8000-0026BB765291", "Window") { diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 07ec04f..5e3bbe1 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -23,6 +23,9 @@ using System; using System.Collections.Generic; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Entity; @@ -143,5 +146,7 @@ public interface IService: IEntity ICharacteristic GetOptionalCharacteristicByInstanceId(int iid); string ToHapJson(); + + void AssignIds(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index dcf776a..d3ad30f 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -26,9 +26,13 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; +using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Caches; +using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Events; +using Homer.Platform.HomeKit.Services.Definitions; using uuid.net.Classes.UUID; using uuid.net.Static_Classes.UUID_Validator; @@ -44,7 +48,7 @@ public class Service : EventEmitter, IService public string DisplayName { get; } /// - public int InstanceId { get; } + public int InstanceId { get; private set; } /// public IReadOnlyDictionary Characteristics { get; } @@ -228,5 +232,18 @@ public string ToHapJson() { return ""; } + + public void AssignIds(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0) + { + // Accessory Information service must have a (reserved by IdentifierCache) ID of 1 + if (Uuid == AccessoryInformationService.Uuid) + InstanceId = 1; + + // assign id's to characteristics. + foreach (var (_, characteristic) in this.Characteristics) + { + characteristic.AssignId(identifierCache, accessory, this); + } + } } } diff --git a/src/platforms/homekit/config/platforms/homekit/default.yaml b/src/platforms/homekit/config/platforms/homekit/default.yaml index 5d2b561..505944f 100644 --- a/src/platforms/homekit/config/platforms/homekit/default.yaml +++ b/src/platforms/homekit/config/platforms/homekit/default.yaml @@ -1,7 +1,7 @@ platforms: homekit: setup: - serial: CC:22:3D:E3:CE:30 - pin: 031-45-154 + serial: F1:F6:AC:2B:7E:8B + pin: 069-39-561 port: 25777 insecure: true # allow insecure access? \ No newline at end of file From 044a7ee3a9b050657c58dbdca717429f5a63c65d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 Feb 2020 20:22:53 +0000 Subject: [PATCH 072/152] Update dependency Microsoft.VisualStudio.Threading.Analyzers to v16.5.132 --- src/core/Homer.Core.csproj | 2 +- src/homer/Homer.csproj | 2 +- src/platforms/homekit/Homer.Platform.HomeKit.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/Homer.Core.csproj b/src/core/Homer.Core.csproj index e9a4897..49b7412 100644 --- a/src/core/Homer.Core.csproj +++ b/src/core/Homer.Core.csproj @@ -27,7 +27,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/homer/Homer.csproj b/src/homer/Homer.csproj index 6317a73..13cc815 100644 --- a/src/homer/Homer.csproj +++ b/src/homer/Homer.csproj @@ -21,7 +21,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 4593250..e479d4e 100644 --- a/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -18,7 +18,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive From fc3257ec7eea66996d5922bdf37d60cd1a972f30 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Tue, 11 Feb 2020 00:34:37 +0300 Subject: [PATCH 073/152] started implementing a simple node version. --- node/config/.gitignore | 1 + node/config/default.yaml | 18 ++ node/config/development.yaml | 1 + node/config/production.yaml | 8 + node/config/test.yaml | 7 + node/package-lock.json | 415 +++++++++++++++++++++++++++++++++++ node/package.json | 50 +++++ node/src/app.js | 106 +++++++++ node/src/homekit/homekit.js | 46 ++++ node/src/homekit/server.js | 67 ++++++ node/src/lib/env.js | 30 +++ node/src/lib/logger.js | 132 +++++++++++ node/src/lib/user.js | 33 +++ 13 files changed, 914 insertions(+) create mode 100644 node/config/.gitignore create mode 100644 node/config/default.yaml create mode 100644 node/config/development.yaml create mode 100644 node/config/production.yaml create mode 100644 node/config/test.yaml create mode 100644 node/package-lock.json create mode 100644 node/package.json create mode 100644 node/src/app.js create mode 100644 node/src/homekit/homekit.js create mode 100644 node/src/homekit/server.js create mode 100644 node/src/lib/env.js create mode 100644 node/src/lib/logger.js create mode 100644 node/src/lib/user.js diff --git a/node/config/.gitignore b/node/config/.gitignore new file mode 100644 index 0000000..bd5d334 --- /dev/null +++ b/node/config/.gitignore @@ -0,0 +1 @@ +local.yaml diff --git a/node/config/default.yaml b/node/config/default.yaml new file mode 100644 index 0000000..66e54ed --- /dev/null +++ b/node/config/default.yaml @@ -0,0 +1,18 @@ +# The default config that will be merged with the mode config [development, production, test] and then local.yaml. + +############################ +# Logging config. +############################ +logging: + console: # console logging. + enabled: true # enable console log? + level: debug # minimum log level. + requests: true # log http requests? + file: # file logging. + enabled: true # enable loggin to file? + level: debug # minimum log level. + accesslog: true # enable access.log ? + errorlog: true # enable error.log? + task: # task specific logger. + enabled: true # enable the task speciffic loggers? + level: info # minimum log level \ No newline at end of file diff --git a/node/config/development.yaml b/node/config/development.yaml new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/node/config/development.yaml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node/config/production.yaml b/node/config/production.yaml new file mode 100644 index 0000000..ff59289 --- /dev/null +++ b/node/config/production.yaml @@ -0,0 +1,8 @@ +logging: + console: + level: info + requests: false + file: + level: info + task: + level: info \ No newline at end of file diff --git a/node/config/test.yaml b/node/config/test.yaml new file mode 100644 index 0000000..e3dcafa --- /dev/null +++ b/node/config/test.yaml @@ -0,0 +1,7 @@ +logging: + console: + enabled: true + requests: false + file: + enabled: true + level: debug \ No newline at end of file diff --git a/node/package-lock.json b/node/package-lock.json new file mode 100644 index 0000000..179e42d --- /dev/null +++ b/node/package-lock.json @@ -0,0 +1,415 @@ +{ + "name": "homer", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "bonjour-hap": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.4.tgz", + "integrity": "sha512-MgU27SEZYQ09Skm71Xa7SZoAg259V4IlAJNWaloFVMlYDn1OjJy3nkwSixRHnDzrcLWocVI84f9exI1ObZChBw==", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^7.2.0", + "multicast-dns-service-types": "^1.1.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "config": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/config/-/config-3.2.5.tgz", + "integrity": "sha512-8itpjyR01lAJanhAlPncBngYRZez/LoRLW8wnGi+6SEcsUyA1wvHvbpIrAJYDJT+W9BScnj4mYoUgbtp9I+0+Q==", + "requires": { + "json5": "^1.0.1" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decimal.js": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.5.1.tgz", + "integrity": "sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ==" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", + "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", + "requires": { + "ip": "^1.1.5", + "safe-buffer": "^5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-srp-hap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", + "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "hap-nodejs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.5.6.tgz", + "integrity": "sha512-hK6HaRUKhO948roA/SF9+5t61qyAWsTCj9SeR3qTt9uQIyIWUpKIAiJlNQADMTb4LcJwC0yaVexw8cU5z2wxNw==", + "requires": { + "bonjour-hap": "^3.5.1", + "debug": "^2.2.0", + "decimal.js": "^7.2.3", + "fast-srp-hap": "^1.0.1", + "ip": "^1.1.3", + "node-persist": "^0.0.11", + "tweetnacl": "^1.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "hirestime": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hirestime/-/hirestime-4.0.0.tgz", + "integrity": "sha512-hC55JfnXRLoCEdmAvwGk1IGXWt0CUox2LJ0WxjRTFjNoTK7Yi8EfOyTM7++9NeCchEW2Vqy0wg0SQddkY8PHYA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-duration-format": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", + "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.0.tgz", + "integrity": "sha512-Tu2QORGOFANB124NWQ/JTRhMf/ODouVLEuvu5Dz8YWEU55zQgRgFGnBHfIh5PbfNDAuaRl7yLB+pgWhSqVxi2Q==", + "requires": { + "dns-packet": "^4.0.0", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "node-persist": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", + "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "requires": { + "mkdirp": "~0.5.1", + "q": "~1.1.1" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "q": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", + "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=" + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "winston": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", + "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + } + } + } +} diff --git a/node/package.json b/node/package.json new file mode 100644 index 0000000..074be0a --- /dev/null +++ b/node/package.json @@ -0,0 +1,50 @@ +{ + "name": "homer", + "version": "0.0.1", + "description": "The complete home automation for Homer Simpson.", + "os": [ + "linux", + "darwin", + "win32" + ], + "cpu": [ + "x64", + "ia32", + "arm" + ], + "main": "src/app.js", + "scripts": { + "test": "npm test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bonesoul/homer.git" + }, + "bugs": { + "url": "https://github.com/bonesoul/homer/issues" + }, + "keywords": [ + "homer", + "homekit", + "smarthome", + "home", + "automation" + ], + "author": "Hüseyin Uslu", + "license": "MIT", + "homepage": "https://github.com/bonesoul/homer#readme", + "dependencies": { + "app-module-path": "2.2.0", + "config": "3.2.5", + "hap-nodejs": "0.5.6", + "hirestime": "4.0.0", + "js-yaml": "3.13.1", + "moment": "2.24.0", + "moment-duration-format": "2.3.2", + "winston": "2.4.4" + }, + "engines": { + "node": ">=13.7.0", + "npm": ">=6.13.6" + } +} diff --git a/node/src/app.js b/node/src/app.js new file mode 100644 index 0000000..8494122 --- /dev/null +++ b/node/src/app.js @@ -0,0 +1,106 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +require('app-module-path').addPath(__dirname); +const config = require('config'); +const os = require('os'); +const path = require('path'); +const winston = require('winston'); +const util = require('util'); +const events = require('events'); +const emitter = new events.EventEmitter(); +const logger = require('lib/logger'); +const packageInfo = require('../package.json'); + +const startup = async () => { + try { + // ======================================== + // initialize env manager. + // ======================================== + require('lib/env'); + + // ======================================== + // initialize log manager. + // ======================================== + await logger.processLogger('homer'); + + // ======================================== + // print startup banner. + // ======================================== + + winston.info(' ___ _____ '); + winston.info(' .\'/,-Y" "~-. '); + winston.info(' l.Y ^. '); + winston.info(' /\ _\_ "Doh!" '); + winston.info(' i ___/" "\ '); + winston.info(' | /" "\ o ! '); + winston.info(' l ] o !__./ '); + winston.info(' \ _ _ \.___./ "~\ '); + winston.info(' X \/ \ ___./ '); + winston.info(' ( \ ___. _..--~~" ~`-. '); + winston.info(' ` Z,-- / \ '); + winston.info(' \__. ( / ______) '); + winston.info(' \ l /-----~~" / '); + winston.info(' Y \ / '); + winston.info(' | "x______.^ '); + winston.info(' | \\ '); + winston.info(' j Y '); + winston.info(''); + winston.info(`[APP] starting up homer version: ${packageInfo.version} [${env}]`); // eslint-disable-line no-undef + winston.info(`[APP] running on: ${os.platform()}-${os.arch()} [${os.type()} ${os.release()}]`); + winston.info(`[APP] node: ${process.versions.node}, v8: ${process.versions.v8}, uv: ${process.versions.uv}, openssl: ${process.versions.openssl}`); + winston.info(`[APP] running over ${os.cpus().length} core system.`); + + // ======================================== + // start homekit support. + // ======================================== + await require('homekit/homekit')(); + + // ======================================== + // add process signal handlers. + // ======================================== + process.on('SIGTERM', gracefulExit); + process.on('SIGINT', gracefulExit); + + // ======================================== + // broadcast startup event. + // ======================================== + winston.info('[APP] startup done..'); + emitter.emit('startup'); + } catch (err) { + winston.error(`startup error: ${err}`); + } +}; + +const gracefulExit = code => { + winston.info(`[APP] exiting process with code: ${code}`); + process.exit(code); +}; + +process.on('unhandledRejection', (reason, promise) => { + winston.error(`Possibly unhandled rejection at promise; ${util.inspect(promise)}`); +}); + +startup(); + +module.exports = emitter; \ No newline at end of file diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js new file mode 100644 index 0000000..c2dd382 --- /dev/null +++ b/node/src/homekit/homekit.js @@ -0,0 +1,46 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const hap = require("hap-nodejs"); +const user = require('lib/user'); +const Server = require('homekit/server'); + +module.exports = async () => { + try { + let user = await require('lib/user'); + + // ======================================== + // start hap-nodejs. + // ======================================== + hap.init(user.persistPath()); + + // ======================================== + // start server. + // ======================================== + var server = new Server({cleanCachedAccessories: false, insecureAccess: false}); + server.run(); + + } catch (err) { + throw new Error(`error initializing homekit server: ${err}`); + } +}; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js new file mode 100644 index 0000000..b067359 --- /dev/null +++ b/node/src/homekit/server.js @@ -0,0 +1,67 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const Bridge = require("hap-nodejs").Bridge; +const Accessory = require("hap-nodejs").Accessory; +const Service = require("hap-nodejs").Service; +const Characteristic = require("hap-nodejs").Characteristic; +const AccessoryLoader = require("hap-nodejs").AccessoryLoader; +const Uuid = require("hap-nodejs").uuid; +const winston = require('winston'); +const packageInfo = require('../../package.json'); + +module.exports = class Server { + + constructor(cleanCachedAccessories = false, insecureAccess = false) { + this._cleanCachedAccessories = cleanCachedAccessories; + + // should be only allowed for debugging purposes as this will allow unauthenticated requests. + this._allowInsecureAccess = insecureAccess; + + this._bridge = this._createBridge(); + } + + run = () => { + this._publish(); + } + + _publish = () => { + var bridgeConfig = {}; + + var accessoryInformation = this._bridge.getService(Service.AccessoryInformation) + .setCharacteristic(Characteristic.Manufacturer, packageInfo.author.name) + .setCharacteristic(Characteristic.Model, packageInfo.name) + .setCharacteristic(Characteristic.SerialNumber, bridgeConfig.username) + .setCharacteristic(Characteristic.FirmwareRevision, packageInfo.version); + } + + _createBridge = () => { + var uuid = Uuid.generate('homer'); + winston.verbose(`[HOMEKIT] creating bridge: homer, uuid: ${uuid}`) + return new Bridge('homer', uuid); + } +} + +function toTitleCase(str) { + return str.replace(/\w\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()); +} \ No newline at end of file diff --git a/node/src/lib/env.js b/node/src/lib/env.js new file mode 100644 index 0000000..b00b4e6 --- /dev/null +++ b/node/src/lib/env.js @@ -0,0 +1,30 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +module.exports = (() => { + // check if we have an invalid node_env set. + if (process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') // eslint-disable-line curly + process.env.NODE_ENV = 'development'; // set to development by default. + + global.env = process.env.NODE_ENV; // eslint-disable-line no-unused-vars +})(); diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js new file mode 100644 index 0000000..22b1953 --- /dev/null +++ b/node/src/lib/logger.js @@ -0,0 +1,132 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const config = require('config'); +const winston = require('winston'); +const moment = require('moment'); +require('moment-duration-format')(moment); +const hirestime = require('hirestime'); + +module.exports.processLogger = async processName => { + try { + // setup the logging directory and ensure it exists. + const logPath = path.join(__dirname, '../../../logs'); + fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename + + // remove the default console log. + winston.remove(winston.transports.Console); + + if (config.logging.console.enabled) { // re-setup the console log if enabled. + winston.add(winston.transports.Console, { + level: config.logging.console.level, + handleExceptions: true, + humanReadableUnhandledException: true, + colorize: true, + prettyPrint: true, + timestamp: () => { + var date = new Date(); + return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)} [${global.process.pid}]`; + } + }); + } + + if (config.logging.file.enabled) { // setup the server log if enabled. + winston.add(winston.transports.File, { + handleExceptions: true, + humanReadableUnhandledException: true, + filename: path.join(logPath, `/${processName}.log`), + level: config.logging.file.level, + json: false + }); + } + } catch (err) { + throw new Error(`Error initiliazing process logger - ${err}.`); + } +}; + +module.exports.taskLogger = taskName => { + try { + const logger = createCustomLogger(taskName); // the custom winston logger. + let profiler = null; // the profiler. + + return { + log: logger, + started: function () { + // commit the start notice. + logger.info('---------------------------------------------'); + logger.info(`starting: ${moment.utc()}`); + logger.info('---------------------------------------------'); + + // start profiling. + profiler = hirestime(); + }, + finished: function (stats, fails = null) { + // end profiling. + const duration = profiler(); + const elapsed = moment.duration(duration).format(); + + // commit the end notice. + logger.info('---------------------------------------------'); + logger.info(`completed: in ${elapsed}..`, stats); + logger.info('---------------------------------------------'); + + // summarize fails if needed. + if (fails && fails.length > 0) { + logger.info('failed:'); + for (const entry of fails) { + logger.info(` - ${entry}`); + } + } + + return elapsed; // also return the elapsed time. + } + }; + } catch (err) { + throw new Error(`Error initiliazing task logger - ${err}.`); + } +}; + +const createCustomLogger = taskName => { + // setup the logging directory and ensure it exists. + const logPath = path.join(__dirname, '../../../logs/tasks'); + fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename + + const transports = []; + if (config.logging.task.enabled) + transports.push(new winston.transports.File({ + name: `${taskName}`, + filename: path.join(logPath, `/${taskName}.log`), + level: config.logging.task.level, + colorize: false, + json: false + })); + + const logger = new winston.Logger({ + transports: transports, + exitOnError: false + }); + + return logger; +}; diff --git a/node/src/lib/user.js b/node/src/lib/user.js new file mode 100644 index 0000000..3f86183 --- /dev/null +++ b/node/src/lib/user.js @@ -0,0 +1,33 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const os = require('os'); +const path = require('path'); + +module.exports.storagePath = () => { + return path.join(os.homedir(), ".homer"); +}; + +module.exports.persistPath = () => { + return path.join(module.exports.storagePath(), "persist"); +}; \ No newline at end of file From 56a77dc520683b592b8cdf539e28422f4a5fe176 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 12:52:44 +0300 Subject: [PATCH 074/152] initial discovery done. --- node/config/default.yaml | 15 ++++++++ node/package-lock.json | 74 ++++++++++++++++++++++++++++++++++--- node/package.json | 9 ++++- node/src/homekit/homekit.js | 8 ++-- node/src/homekit/server.js | 46 +++++++++++++++++------ 5 files changed, 131 insertions(+), 21 deletions(-) diff --git a/node/config/default.yaml b/node/config/default.yaml index 66e54ed..a16f247 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -1,5 +1,20 @@ # The default config that will be merged with the mode config [development, production, test] and then local.yaml. +############################ +# platforms config. +############################ +platforms: + + ############################ + # homekit config. + ############################ + homekit: + setup: + serial: F1:F6:AC:2B:7E:8B + pin: 069-39-561 + port: 25777 + insecure: true # allow insecure access? + ############################ # Logging config. ############################ diff --git a/node/package-lock.json b/node/package-lock.json index 179e42d..53b3a19 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -4,6 +4,20 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, "app-module-path": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", @@ -45,6 +59,28 @@ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -179,6 +215,17 @@ "ip": "^1.1.3", "node-persist": "^0.0.11", "tweetnacl": "^1.0.1" + }, + "dependencies": { + "node-persist": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", + "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "requires": { + "mkdirp": "~0.5.1", + "q": "~1.1.1" + } + } } }, "has": { @@ -189,6 +236,11 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", @@ -307,12 +359,11 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-3.0.5.tgz", + "integrity": "sha512-zJmBA58kI9QAxXLMc4NLswgzXVIqKfsfQtiySMF6eEQ3kVvoM3YHzcP0//L9u30Fqx3cYe1FL/a+fyB3VwO/oQ==", "requires": { - "mkdirp": "~0.5.1", - "q": "~1.1.1" + "mkdirp": "~0.5.1" } }, "object-inspect": { @@ -346,6 +397,11 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=" }, + "qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==" + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -388,6 +444,14 @@ "function-bind": "^1.1.1" } }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", diff --git a/node/package.json b/node/package.json index 074be0a..0794bcd 100644 --- a/node/package.json +++ b/node/package.json @@ -30,17 +30,24 @@ "home", "automation" ], - "author": "Hüseyin Uslu", + "author": { + "name": "Hüseyin Uslu", + "email": "shalafiraistlin@gmail.com", + "url": "https://github.com/bonesoul/homer" + }, "license": "MIT", "homepage": "https://github.com/bonesoul/homer#readme", "dependencies": { "app-module-path": "2.2.0", + "chalk": "3.0.0", "config": "3.2.5", "hap-nodejs": "0.5.6", "hirestime": "4.0.0", "js-yaml": "3.13.1", "moment": "2.24.0", "moment-duration-format": "2.3.2", + "node-persist": "3.0.5", + "qrcode-terminal": "0.12.0", "winston": "2.4.4" }, "engines": { diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js index c2dd382..3ab5c68 100644 --- a/node/src/homekit/homekit.js +++ b/node/src/homekit/homekit.js @@ -30,17 +30,17 @@ module.exports = async () => { let user = await require('lib/user'); // ======================================== - // start hap-nodejs. + // init hap-nodejs. // ======================================== hap.init(user.persistPath()); // ======================================== - // start server. + // start homekit server. // ======================================== - var server = new Server({cleanCachedAccessories: false, insecureAccess: false}); + var server = new Server({cleanCachedAccessories: false}); server.run(); } catch (err) { - throw new Error(`error initializing homekit server: ${err}`); + throw new Error(`[HOMEKIT] error initializing homekit server: ${err}`); } }; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index b067359..e783b48 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -28,17 +28,23 @@ const Characteristic = require("hap-nodejs").Characteristic; const AccessoryLoader = require("hap-nodejs").AccessoryLoader; const Uuid = require("hap-nodejs").uuid; const winston = require('winston'); +const config = require('config'); +const qrcode = require('qrcode-terminal'); +const chalk = require('chalk'); const packageInfo = require('../../package.json'); module.exports = class Server { - constructor(cleanCachedAccessories = false, insecureAccess = false) { + constructor(cleanCachedAccessories = false) { this._cleanCachedAccessories = cleanCachedAccessories; // should be only allowed for debugging purposes as this will allow unauthenticated requests. - this._allowInsecureAccess = insecureAccess; + this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); this._bridge = this._createBridge(); + this._bridge.on('listening', function(port) { + winston.info(`homer is running on port ${port}.`); + }); } run = () => { @@ -46,22 +52,40 @@ module.exports = class Server { } _publish = () => { - var bridgeConfig = {}; - - var accessoryInformation = this._bridge.getService(Service.AccessoryInformation) + let accessoryInformationService = this._bridge.getService(Service.AccessoryInformation) .setCharacteristic(Characteristic.Manufacturer, packageInfo.author.name) .setCharacteristic(Characteristic.Model, packageInfo.name) - .setCharacteristic(Characteristic.SerialNumber, bridgeConfig.username) + .setCharacteristic(Characteristic.SerialNumber, config.get('platforms.homekit.setup.serial')) .setCharacteristic(Characteristic.FirmwareRevision, packageInfo.version); + + var publishInfo = { + username: config.get('platforms.homekit.setup.serial'), + port: config.get('platforms.homekit.setup.port'), + pincode: config.get('platforms.homekit.setup.pin'), + category: Accessory.Categories.BRIDGE, + } + + winston.verbose(`[SERVER] publishing ${publishInfo.username} over port ${publishInfo.port} using pin ${publishInfo.pincode}..`); + + this._bridge.publish(publishInfo, this._allowInsecureAccess); + this._printSetupInfo(); } _createBridge = () => { var uuid = Uuid.generate('homer'); - winston.verbose(`[HOMEKIT] creating bridge: homer, uuid: ${uuid}`) + winston.verbose(`[SERVER] creating bridge: homer, uuid: ${uuid}`) return new Bridge('homer', uuid); } -} -function toTitleCase(str) { - return str.replace(/\w\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()); -} \ No newline at end of file + _printSetupInfo = () => { + winston.info(`[SERVER] setup payload ${this._bridge.setupURI()}`); + winston.info(`[SERVER] scan this code with your Homekit device to pair..`); + qrcode.generate(this._bridge.setupURI()); + winston.info(`[SERVER] or enter this pin on your Homekit device to pair..`); + winston.info(chalk.black.bgYellow(` `)); + winston.info(chalk.black.bgYellow(` ┌────────────┐ `)); + winston.info(chalk.black.bgYellow(` │ ${config.get('platforms.homekit.setup.pin')} │ `)); + winston.info(chalk.black.bgYellow(` └────────────┘ `)); + winston.info(chalk.black.bgYellow(` `)); + } +} From 25b663b84611ae16ff334f6a2f9a9f3ee41c4eed Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 13:13:46 +0300 Subject: [PATCH 075/152] initial api work. --- node/package-lock.json | 16 ++++++++++++---- node/package.json | 2 +- node/src/app.js | 1 - node/src/homekit/homekit.js | 2 ++ node/src/homekit/plugin/api/api.js | 27 +++++++++++++++++++++++++++ node/src/homekit/server.js | 19 +++++++++++++++++-- node/src/lib/user.js | 4 ++++ 7 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 node/src/homekit/plugin/api/api.js diff --git a/node/package-lock.json b/node/package-lock.json index 53b3a19..d124299 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -359,11 +359,19 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node-persist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-3.0.5.tgz", - "integrity": "sha512-zJmBA58kI9QAxXLMc4NLswgzXVIqKfsfQtiySMF6eEQ3kVvoM3YHzcP0//L9u30Fqx3cYe1FL/a+fyB3VwO/oQ==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.8.tgz", + "integrity": "sha1-pWxzm8b/2c7vGcDo2JWXkX8Ikkk=", "requires": { - "mkdirp": "~0.5.1" + "mkdirp": "~0.3.5", + "q": "~1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + } } }, "object-inspect": { diff --git a/node/package.json b/node/package.json index 0794bcd..c2095a4 100644 --- a/node/package.json +++ b/node/package.json @@ -46,7 +46,7 @@ "js-yaml": "3.13.1", "moment": "2.24.0", "moment-duration-format": "2.3.2", - "node-persist": "3.0.5", + "node-persist": "0.0.8", "qrcode-terminal": "0.12.0", "winston": "2.4.4" }, diff --git a/node/src/app.js b/node/src/app.js index 8494122..6243c1f 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -47,7 +47,6 @@ const startup = async () => { // ======================================== // print startup banner. // ======================================== - winston.info(' ___ _____ '); winston.info(' .\'/,-Y" "~-. '); winston.info(' l.Y ^. '); diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js index 3ab5c68..2e37b60 100644 --- a/node/src/homekit/homekit.js +++ b/node/src/homekit/homekit.js @@ -23,6 +23,7 @@ const hap = require("hap-nodejs"); const user = require('lib/user'); +const winston = require('winston'); const Server = require('homekit/server'); module.exports = async () => { @@ -32,6 +33,7 @@ module.exports = async () => { // ======================================== // init hap-nodejs. // ======================================== + winston.verbose(`initializing hap-nodejs over path ${user.persistPath()}`); hap.init(user.persistPath()); // ======================================== diff --git a/node/src/homekit/plugin/api/api.js b/node/src/homekit/plugin/api/api.js new file mode 100644 index 0000000..38ec3f0 --- /dev/null +++ b/node/src/homekit/plugin/api/api.js @@ -0,0 +1,27 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +module.exports = class PluginApi { + constructor() { + }; +} \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index e783b48..2098836 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -31,15 +31,26 @@ const winston = require('winston'); const config = require('config'); const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); +const user = require('lib/user'); +const PluginApi = require('homekit/plugin/api/api'); +const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); module.exports = class Server { constructor(cleanCachedAccessories = false) { this._cleanCachedAccessories = cleanCachedAccessories; + this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); // should be only allowed for debugging purposes as this will allow unauthenticated requests. - // should be only allowed for debugging purposes as this will allow unauthenticated requests. - this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); + // init accessory storage. + winston.verbose(`initializing accessory storage over path ${user.cachedAccessoryPath()}`); + accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); + + // init plugin apis. + this._pluginApi = new PluginApi(); + + // load plugins. + this._loadPlugins(); this._bridge = this._createBridge(); this._bridge.on('listening', function(port) { @@ -71,6 +82,10 @@ module.exports = class Server { this._printSetupInfo(); } + _loadPlugins = () => { + winston.verbose('loading plugins..'); + }; + _createBridge = () => { var uuid = Uuid.generate('homer'); winston.verbose(`[SERVER] creating bridge: homer, uuid: ${uuid}`) diff --git a/node/src/lib/user.js b/node/src/lib/user.js index 3f86183..8233845 100644 --- a/node/src/lib/user.js +++ b/node/src/lib/user.js @@ -30,4 +30,8 @@ module.exports.storagePath = () => { module.exports.persistPath = () => { return path.join(module.exports.storagePath(), "persist"); +}; + +module.exports.cachedAccessoryPath = () => { + return path.join(module.exports.storagePath(), "accessories"); }; \ No newline at end of file From ba201fd5d23b70301154f7b249566f600e9a07fa Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 13:35:58 +0300 Subject: [PATCH 076/152] added async/await support. --- node/src/app.js | 12 ++++----- node/src/homekit/homekit.js | 10 ++++---- node/src/homekit/server.js | 49 ++++++++++++++++++++----------------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/node/src/app.js b/node/src/app.js index 6243c1f..641bb4e 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -65,10 +65,10 @@ const startup = async () => { winston.info(' | \\ '); winston.info(' j Y '); winston.info(''); - winston.info(`[APP] starting up homer version: ${packageInfo.version} [${env}]`); // eslint-disable-line no-undef - winston.info(`[APP] running on: ${os.platform()}-${os.arch()} [${os.type()} ${os.release()}]`); - winston.info(`[APP] node: ${process.versions.node}, v8: ${process.versions.v8}, uv: ${process.versions.uv}, openssl: ${process.versions.openssl}`); - winston.info(`[APP] running over ${os.cpus().length} core system.`); + winston.info(`[HOMER] starting up homer version: ${packageInfo.version} [${env}]`); // eslint-disable-line no-undef + winston.info(`[HOMER] running on: ${os.platform()}-${os.arch()} [${os.type()} ${os.release()}]`); + winston.info(`[HOMER] node: ${process.versions.node}, v8: ${process.versions.v8}, uv: ${process.versions.uv}, openssl: ${process.versions.openssl}`); + winston.info(`[HOMER] running over ${os.cpus().length} core system.`); // ======================================== // start homekit support. @@ -84,7 +84,7 @@ const startup = async () => { // ======================================== // broadcast startup event. // ======================================== - winston.info('[APP] startup done..'); + winston.info('[HOMER] startup done..'); emitter.emit('startup'); } catch (err) { winston.error(`startup error: ${err}`); @@ -92,7 +92,7 @@ const startup = async () => { }; const gracefulExit = code => { - winston.info(`[APP] exiting process with code: ${code}`); + winston.info(`[HOMER] exiting process with code: ${code}`); process.exit(code); }; diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js index 2e37b60..4165343 100644 --- a/node/src/homekit/homekit.js +++ b/node/src/homekit/homekit.js @@ -33,16 +33,16 @@ module.exports = async () => { // ======================================== // init hap-nodejs. // ======================================== - winston.verbose(`initializing hap-nodejs over path ${user.persistPath()}`); - hap.init(user.persistPath()); + winston.verbose(`[HOMEKIT] initializing hap-nodejs over path ${user.persistPath()}`); + await hap.init(user.persistPath()); // ======================================== // start homekit server. // ======================================== - var server = new Server({cleanCachedAccessories: false}); - server.run(); - + var server = await new Server(); + await server.run(); } catch (err) { + winston.debug(err); throw new Error(`[HOMEKIT] error initializing homekit server: ${err}`); } }; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 2098836..bae3010 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -37,32 +37,35 @@ const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); module.exports = class Server { + constructor() { + return (async () => { + this._cleanCachedAccessories = false; + this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); // should be only allowed for debugging purposes as this will allow unauthenticated requests. - constructor(cleanCachedAccessories = false) { - this._cleanCachedAccessories = cleanCachedAccessories; - this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); // should be only allowed for debugging purposes as this will allow unauthenticated requests. + // init accessory storage. + winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); + accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); - // init accessory storage. - winston.verbose(`initializing accessory storage over path ${user.cachedAccessoryPath()}`); - accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); + // init plugin apis. + this._pluginApi = new PluginApi(); - // init plugin apis. - this._pluginApi = new PluginApi(); + // load plugins. + await this._loadPlugins(); - // load plugins. - this._loadPlugins(); + this._bridge = await this._createBridge(); + this._bridge.on('listening', function(port) { + winston.info(`[SERVER] homer is running on port ${port}.`); + }); - this._bridge = this._createBridge(); - this._bridge.on('listening', function(port) { - winston.info(`homer is running on port ${port}.`); - }); + return this; + })(); } - run = () => { - this._publish(); + run = async () => { + await this._publish(); } - _publish = () => { + _publish = async () => { let accessoryInformationService = this._bridge.getService(Service.AccessoryInformation) .setCharacteristic(Characteristic.Manufacturer, packageInfo.author.name) .setCharacteristic(Characteristic.Model, packageInfo.name) @@ -78,21 +81,21 @@ module.exports = class Server { winston.verbose(`[SERVER] publishing ${publishInfo.username} over port ${publishInfo.port} using pin ${publishInfo.pincode}..`); - this._bridge.publish(publishInfo, this._allowInsecureAccess); - this._printSetupInfo(); + await this._bridge.publish(publishInfo, this._allowInsecureAccess); + await this._printSetupInfo(); } - _loadPlugins = () => { - winston.verbose('loading plugins..'); + _loadPlugins = async () => { + winston.verbose('[SERVER] loading plugins..'); }; - _createBridge = () => { + _createBridge = async () => { var uuid = Uuid.generate('homer'); winston.verbose(`[SERVER] creating bridge: homer, uuid: ${uuid}`) return new Bridge('homer', uuid); } - _printSetupInfo = () => { + _printSetupInfo = async () => { winston.info(`[SERVER] setup payload ${this._bridge.setupURI()}`); winston.info(`[SERVER] scan this code with your Homekit device to pair..`); qrcode.generate(this._bridge.setupURI()); From c3b957fb9b78f9c74d2677d1c63713c4dd7ccca7 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 16:46:36 +0300 Subject: [PATCH 077/152] more plugin manager work. --- node/.eslintrc.yaml | 5 ++ node/package-lock.json | 46 ++++++++++ node/package.json | 3 + node/src/homekit/plugin/manager.js | 131 +++++++++++++++++++++++++++++ node/src/homekit/server.js | 13 +++ 5 files changed, 198 insertions(+) create mode 100644 node/.eslintrc.yaml create mode 100644 node/src/homekit/plugin/manager.js diff --git a/node/.eslintrc.yaml b/node/.eslintrc.yaml new file mode 100644 index 0000000..aed0167 --- /dev/null +++ b/node/.eslintrc.yaml @@ -0,0 +1,5 @@ +env: + es6: true +parserOptions: + sourceType: module + ecmaVersion: 2019 \ No newline at end of file diff --git a/node/package-lock.json b/node/package-lock.json index d124299..72562d5 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -198,11 +198,34 @@ "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=" }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "requires": { + "ini": "^1.3.5" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, "hap-nodejs": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.5.6.tgz", @@ -251,6 +274,11 @@ "resolved": "https://registry.npmjs.org/hirestime/-/hirestime-4.0.0.tgz", "integrity": "sha512-hC55JfnXRLoCEdmAvwGk1IGXWt0CUox2LJ0WxjRTFjNoTK7Yi8EfOyTM7++9NeCchEW2Vqy0wg0SQddkY8PHYA==" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -316,6 +344,19 @@ } } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", @@ -470,6 +511,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "winston": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", diff --git a/node/package.json b/node/package.json index c2095a4..d8f882a 100644 --- a/node/package.json +++ b/node/package.json @@ -41,9 +41,12 @@ "app-module-path": "2.2.0", "chalk": "3.0.0", "config": "3.2.5", + "fs-extra": "8.1.0", + "global-dirs": "2.0.1", "hap-nodejs": "0.5.6", "hirestime": "4.0.0", "js-yaml": "3.13.1", + "lodash": "4.17.15", "moment": "2.24.0", "moment-duration-format": "2.3.2", "node-persist": "0.0.8", diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js new file mode 100644 index 0000000..4bcc771 --- /dev/null +++ b/node/src/homekit/plugin/manager.js @@ -0,0 +1,131 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const winston = require('winston'); +const path = require('path'); +const fs = require('fs-extra') +const _ = require('lodash'); +const globalDirectories = require('global-dirs'); + +module.exports = class PluginManager { + discover = async () => { + let discovered = []; + let searchedPaths = {}; + let paths = await this._getPaths(); + + winston.verbose(`[PLUGIN_MANAGER] discovering plugins..`); + + for (const path of paths) { + if (searchedPaths[path]) return; + searchedPaths[path] = true; + + let plugins = await this._discoverPath(path); + + if (Object.keys(plugins).length === 0) + continue; + + Object.entries(plugins).forEach(([key, value]) => { + winston.verbose(`[PLUGIN_MANAGER] discovered plugin: ${key}..`); + discovered[key] = value; + }); + } + + return discovered; + } + + load = async(name, dir) => { + winston.info(`[PLUGIN_MANAGER] loading plugin ${name}..`); + } + + _discoverPath = async (dir) => { + try { + winston.verbose(`[PLUGIN_MANAGER] checking ${dir} for plugins..`); + + let plugins = []; + + // check the directory. + if (!await fs.exists(dir)) + return plugins; + + // read subdirectories. + let names = await fs.readdir(dir); + + // if this is a module directory with package.json, just skip it. + if (await fs.exists(path.join(dir, "package.json"))) + names = [""]; + + for (const name of names) { + let pluginPath = path.join(dir, name); + var plugin = await this._checkPlugin(pluginPath); + if (!plugin) continue; + + plugins[plugin.name] = pluginPath; + } + + return plugins; + } catch (err) { + if (err.errno !== -4058) winston.error(err); // -4058 is just path not found error. + } + } + + _checkPlugin = async (dir) => { + let stat = await fs.stat(dir); + if (!stat.isDirectory()) return; // make sure it's a directory. + + let json = await this._loadPluginJson(dir); // try loading the package.json of the plugin. + return json; + } + + _loadPluginJson = async (dir) => { + let packageJsonPath = path.join(dir, "package.json"); + + if (!await fs.exists(packageJsonPath)) + return; + + try { + let file = await fs.readFile(packageJsonPath); // read the package.json. + let json = await JSON.parse(file); // try parsing it. + + // make sure the plugin name starts with homebridge- or homer- + if (!json.name || (json.name.indexOf('homebridge-') !== 0 && json.name.indexOf('homer-') !== 0)) + return; + + // verify the plugin is correctly tagged with homebridge-plugin or homer-plugin. + if (!json.keywords || (json.keywords.indexOf("homebridge-plugin") == -1 && json.keywords.indexOf("homer-plugin") == -1)) + return; + + return json; + } catch (err) { + return; + } + } + + _getPaths = async () => { + let paths = []; + + paths = paths.concat(require.main.paths); // add require paths. + paths.push(path.join(globalDirectories.npm.packages)); + + return paths; + } +} \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index bae3010..5cda59c 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -33,6 +33,7 @@ const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); const user = require('lib/user'); const PluginApi = require('homekit/plugin/api/api'); +const PluginManager = require('homekit/plugin/manager'); const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); @@ -87,6 +88,18 @@ module.exports = class Server { _loadPlugins = async () => { winston.verbose('[SERVER] loading plugins..'); + + let pluginManager = new PluginManager(); + let plugins = await pluginManager.discover(); + + Object.entries(plugins).forEach(async ([name, dir]) => { + try { + await pluginManager.load(name, dir); + } + catch (err) { + winston.error(`[SERVER] error loading plugin ${name}: ${err}`); + } + }); }; _createBridge = async () => { From 42cb49d8a4ad7dc77e10a625018a52d4c83b131c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 17:22:30 +0300 Subject: [PATCH 078/152] plugin init work. --- node/package-lock.json | 5 +++ node/package.json | 1 + node/src/homekit/plugin/manager.js | 52 ++++++++++++++++++++++++++++++ node/src/homekit/server.js | 18 +++++------ 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/node/package-lock.json b/node/package-lock.json index 72562d5..6b2dd7d 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -465,6 +465,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, + "semver": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.2.tgz", + "integrity": "sha512-BJs9T/H8sEVHbeigqzIEo57Iu/3DG6c4QoqTfbQB3BPA4zgzAomh/Fk9E7QtjWQ8mx2dgA9YCfSF4y9k9bHNpQ==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/node/package.json b/node/package.json index d8f882a..3ecdcf4 100644 --- a/node/package.json +++ b/node/package.json @@ -51,6 +51,7 @@ "moment-duration-format": "2.3.2", "node-persist": "0.0.8", "qrcode-terminal": "0.12.0", + "semver": "7.1.2", "winston": "2.4.4" }, "engines": { diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 4bcc771..7684c39 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -25,7 +25,11 @@ const winston = require('winston'); const path = require('path'); const fs = require('fs-extra') const _ = require('lodash'); +const semver = require('semver'); const globalDirectories = require('global-dirs'); +const packageInfo = require('../../../package.json'); + +const homebridge_compatiblity_version = "0.4.5"; module.exports = class PluginManager { discover = async () => { @@ -55,6 +59,54 @@ module.exports = class PluginManager { load = async(name, dir) => { winston.info(`[PLUGIN_MANAGER] loading plugin ${name}..`); + + var json = await this._loadPluginJson(dir); + + // make sure it has a valid json. + if (json === undefined) + throw new Error(`[PLUGIN_MANAGER] error loading plugin: ${name}..`); + + // check if it has homebridge or homer as engine. + if (!json.engines || (!json.engines.homebridge && !json.engines.homer)) + throw new Error(`Plugin ${name} does not contain correct engines definitions..`); + + // check if homer version is satisfied. + if (json.engines.homer && !semver.satisfies(packageInfo.version, json.engines.homer) ) + throw new Error(`Plugin ${name} requires homer version ${json.engines.homer} which is not satisfied by current version ${packageInfo.version}. Please consider upgrading your homer installation..`); + + // check if homebridge version is satisfied. + if (json.engines.homebridge && !semver.satisfies(homebridge_compatiblity_version, json.engines.homebridge) ) + throw new Error(`Plugin ${name} requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${homebridge_compatiblity_version}. Please consider upgrading your homer installation..`); + + // check node version. + if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) + winston.warn(`Plugin ${name} required node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`); + + // get plugin entrance + let entrance = json.main || "./index.js"; + let entrancePath = path.join(dir, entrance); + + // try getting the plugin initializer. + var module = require(entrancePath); + + if (typeof module === "function") + return module; + else if (module && typeof module.default === "function") + return module.default; + else + throw new Error(`Plugin ${name} does not export an initializer..`) + } + + initialize = async(name, dir) => { + try { + let initializer = await this.load(name, dir); + initializer(this._pluginApi); + return true; + } + catch (err) { + winston.error(`[PLUGIN_MANAGER] error loading plugin ${name}: ${err.stack}`); + return false; + } } _discoverPath = async (dir) => { diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 5cda59c..e092be0 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -89,17 +89,17 @@ module.exports = class Server { _loadPlugins = async () => { winston.verbose('[SERVER] loading plugins..'); + let plugins = []; let pluginManager = new PluginManager(); - let plugins = await pluginManager.discover(); - - Object.entries(plugins).forEach(async ([name, dir]) => { - try { - await pluginManager.load(name, dir); - } - catch (err) { - winston.error(`[SERVER] error loading plugin ${name}: ${err}`); - } + let discovered = await pluginManager.discover(); + + Object.entries(discovered).forEach(async ([name, dir]) => { + if (await pluginManager.initialize(name, dir)) + plugins.push(name); }); + + if (plugins.length === 0) + winston.warn('no plugins found. See the README for information on installing plugins..') }; _createBridge = async () => { From 799ccf37412cd7ad4afb318793ed6f58a7b9eaf9 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 18:06:17 +0300 Subject: [PATCH 079/152] improved plugin subsystem. --- node/src/homekit/homekit.js | 3 +- node/src/homekit/plugin/api/api.js | 32 ++++++- node/src/homekit/plugin/manager.js | 137 ++++++++++------------------- node/src/homekit/plugin/plugin.js | 110 +++++++++++++++++++++++ node/src/homekit/server.js | 27 ++---- 5 files changed, 194 insertions(+), 115 deletions(-) create mode 100644 node/src/homekit/plugin/plugin.js diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js index 4165343..871c3f3 100644 --- a/node/src/homekit/homekit.js +++ b/node/src/homekit/homekit.js @@ -42,7 +42,6 @@ module.exports = async () => { var server = await new Server(); await server.run(); } catch (err) { - winston.debug(err); - throw new Error(`[HOMEKIT] error initializing homekit server: ${err}`); + throw new Error(`[HOMEKIT] error initializing homekit server: ${err.stack}`); } }; \ No newline at end of file diff --git a/node/src/homekit/plugin/api/api.js b/node/src/homekit/plugin/api/api.js index 38ec3f0..8e865b2 100644 --- a/node/src/homekit/plugin/api/api.js +++ b/node/src/homekit/plugin/api/api.js @@ -21,7 +21,37 @@ // Licensor: Hüseyin Uslu 'use strict'; +const hap = require("hap-nodejs"); +const winston = require('winston'); +const user = require('lib/user'); + module.exports = class PluginApi { constructor() { - }; + this._accessories = {}; + this._configurableAccessories = {}; + + this._platforms = {}; + this._dynamicPlatforms = {}; + + // expose the homebridge API version + this.version = 2.4; + + // expose the homebridge server version + this.serverVersion = "0.4.5"; + + // expose the User class methods to plugins to get paths. Example: homebridge.user.storagePath() + this.user = user; + + // expose hap-nodejs. + this.hap = hap; + } + + registerAccessory = (pluginName, accessoryName, constructor, configurationRequestHandler) => { + let name = `${pluginName}.${accessoryName}`; + + if (this._accessories[name]) + throw new Error(`plugin ${pluginName} attempted to registern an accessory: ${accessoryName} which has been already registered!`); + + winston.info(`[PLUGIN:${pluginName}] registering accessory: ${accessoryName}..`); + } } \ No newline at end of file diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 7684c39..2361982 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -24,15 +24,41 @@ const winston = require('winston'); const path = require('path'); const fs = require('fs-extra') -const _ = require('lodash'); -const semver = require('semver'); const globalDirectories = require('global-dirs'); +const Plugin = require('homekit/plugin/plugin'); +const PluginApi = require('homekit/plugin/api/api'); const packageInfo = require('../../../package.json'); -const homebridge_compatiblity_version = "0.4.5"; - module.exports = class PluginManager { - discover = async () => { + constructor() { + // init plugin apis. + this._pluginApi = new PluginApi(); + } + + discover = async() => { + winston.verbose('[PLUGIN_MANAGER] loading plugins..'); + + this._plugins = await this._discover(); + + if (this._plugins.length === 0) + winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) + else + winston.info(`[PLUGIN_MANAGER] discovered a total of ${this._plugins.length} plugins..`) + } + + load = async() => { + for (const plugin of this._plugins) { + await plugin.load(); + } + } + + initialize = async() => { + for (const plugin of this._plugins) { + await plugin.initialize(this._pluginApi); + } + }; + + _discover = async () => { let discovered = []; let searchedPaths = {}; let paths = await this._getPaths(); @@ -40,75 +66,25 @@ module.exports = class PluginManager { winston.verbose(`[PLUGIN_MANAGER] discovering plugins..`); for (const path of paths) { - if (searchedPaths[path]) return; + if (searchedPaths[path]) + continue; + searchedPaths[path] = true; let plugins = await this._discoverPath(path); - if (Object.keys(plugins).length === 0) + if (plugins.length === 0) continue; - - Object.entries(plugins).forEach(([key, value]) => { - winston.verbose(`[PLUGIN_MANAGER] discovered plugin: ${key}..`); - discovered[key] = value; - }); + + for(const plugin of plugins) { + winston.verbose(`[PLUGIN_MANAGER] discovered plugin: ${plugin.name}..`); + discovered.push(plugin); + } } return discovered; } - load = async(name, dir) => { - winston.info(`[PLUGIN_MANAGER] loading plugin ${name}..`); - - var json = await this._loadPluginJson(dir); - - // make sure it has a valid json. - if (json === undefined) - throw new Error(`[PLUGIN_MANAGER] error loading plugin: ${name}..`); - - // check if it has homebridge or homer as engine. - if (!json.engines || (!json.engines.homebridge && !json.engines.homer)) - throw new Error(`Plugin ${name} does not contain correct engines definitions..`); - - // check if homer version is satisfied. - if (json.engines.homer && !semver.satisfies(packageInfo.version, json.engines.homer) ) - throw new Error(`Plugin ${name} requires homer version ${json.engines.homer} which is not satisfied by current version ${packageInfo.version}. Please consider upgrading your homer installation..`); - - // check if homebridge version is satisfied. - if (json.engines.homebridge && !semver.satisfies(homebridge_compatiblity_version, json.engines.homebridge) ) - throw new Error(`Plugin ${name} requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${homebridge_compatiblity_version}. Please consider upgrading your homer installation..`); - - // check node version. - if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) - winston.warn(`Plugin ${name} required node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`); - - // get plugin entrance - let entrance = json.main || "./index.js"; - let entrancePath = path.join(dir, entrance); - - // try getting the plugin initializer. - var module = require(entrancePath); - - if (typeof module === "function") - return module; - else if (module && typeof module.default === "function") - return module.default; - else - throw new Error(`Plugin ${name} does not export an initializer..`) - } - - initialize = async(name, dir) => { - try { - let initializer = await this.load(name, dir); - initializer(this._pluginApi); - return true; - } - catch (err) { - winston.error(`[PLUGIN_MANAGER] error loading plugin ${name}: ${err.stack}`); - return false; - } - } - _discoverPath = async (dir) => { try { winston.verbose(`[PLUGIN_MANAGER] checking ${dir} for plugins..`); @@ -128,10 +104,11 @@ module.exports = class PluginManager { for (const name of names) { let pluginPath = path.join(dir, name); - var plugin = await this._checkPlugin(pluginPath); - if (!plugin) continue; + var json = await this._checkPlugin(pluginPath); + if (!json) continue; - plugins[plugin.name] = pluginPath; + var plugin = new Plugin(name, pluginPath) + plugins.push(plugin); } return plugins; @@ -144,34 +121,10 @@ module.exports = class PluginManager { let stat = await fs.stat(dir); if (!stat.isDirectory()) return; // make sure it's a directory. - let json = await this._loadPluginJson(dir); // try loading the package.json of the plugin. + let json = await Plugin.getJson(dir); // try loading the package.json of the plugin. return json; } - _loadPluginJson = async (dir) => { - let packageJsonPath = path.join(dir, "package.json"); - - if (!await fs.exists(packageJsonPath)) - return; - - try { - let file = await fs.readFile(packageJsonPath); // read the package.json. - let json = await JSON.parse(file); // try parsing it. - - // make sure the plugin name starts with homebridge- or homer- - if (!json.name || (json.name.indexOf('homebridge-') !== 0 && json.name.indexOf('homer-') !== 0)) - return; - - // verify the plugin is correctly tagged with homebridge-plugin or homer-plugin. - if (!json.keywords || (json.keywords.indexOf("homebridge-plugin") == -1 && json.keywords.indexOf("homer-plugin") == -1)) - return; - - return json; - } catch (err) { - return; - } - } - _getPaths = async () => { let paths = []; diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js new file mode 100644 index 0000000..a378147 --- /dev/null +++ b/node/src/homekit/plugin/plugin.js @@ -0,0 +1,110 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const path = require('path'); +const winston = require('winston'); +const fs = require('fs-extra') +const semver = require('semver'); + +const homebridge_compatiblity_version = "0.4.5"; + +module.exports = class Plugin { + constructor(name, dir) { + this.name = name; + this.dir = dir; + this.initializer = undefined; // will be later filled by load(). + } + + load = async() => { + winston.info(`[PLUGIN:${this.name}] loading plugin..`); + + var json = await Plugin.getJson(this.dir); + + // make sure it has a valid json. + if (json === undefined) + throw new Error(`[PLUGIN:${this.name}] plugin does not have a valid package.json..`); + + // check if it has homebridge or homer as engine. + if (!json.engines || (!json.engines.homebridge && !json.engines.homer)) + throw new Error(`[PLUGIN:${this.name}] plugin does not contain correct engines definitions..`); + + // check if homer version is satisfied. + if (json.engines.homer && !semver.satisfies(packageInfo.version, json.engines.homer) ) + throw new Error(`[PLUGIN:${this.name}] plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${packageInfo.version}. Please consider upgrading your homer installation..`); + + // check if homebridge version is satisfied. + if (json.engines.homebridge && !semver.satisfies(homebridge_compatiblity_version, json.engines.homebridge) ) + throw new Error(`[PLUGIN:${this.name}] plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${homebridge_compatiblity_version}. Please consider upgrading your homer installation..`); + + // check node version. + if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) + winston.warn(`[PLUGIN:${this.name}] plugin requires node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`); + + // get plugin entrance + let entrance = json.main || "./index.js"; + let entrancePath = path.join(this.dir, entrance); + + // try getting the plugin initializer. + var module = require(entrancePath); + + if (typeof module === "function") + this.initializer = module; + else if (module && typeof module.default === "function") + this.initializer = module.default; + else + throw new Error(`[PLUGIN:${this.name}] plugin does not export an initializer..`) + } + + initialize = async (api) => { + try { + winston.info(`[PLUGIN:${this.name}] initializing plugin..`); + this.initializer(api); + } catch (err) { + throw new Error(`[PLUGIN:${this.name}] error initializing plugin ${err.stack}`) + } + } + + static getJson = async (dir) => { + let packageJsonPath = path.join(dir, "package.json"); + + if (!await fs.exists(packageJsonPath)) + return; + + try { + let file = await fs.readFile(packageJsonPath); // read the package.json. + let json = await JSON.parse(file); // try parsing it. + + // make sure the plugin name starts with homebridge- or homer- + if (!json.name || (json.name.indexOf('homebridge-') !== 0 && json.name.indexOf('homer-') !== 0)) + return; + + // verify the plugin is correctly tagged with homebridge-plugin or homer-plugin. + if (!json.keywords || (json.keywords.indexOf("homebridge-plugin") == -1 && json.keywords.indexOf("homer-plugin") == -1)) + return; + + return json; + } catch (err) { + return; + } + } +}; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index e092be0..38ea645 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -32,7 +32,6 @@ const config = require('config'); const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); const user = require('lib/user'); -const PluginApi = require('homekit/plugin/api/api'); const PluginManager = require('homekit/plugin/manager'); const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); @@ -47,11 +46,15 @@ module.exports = class Server { winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); - // init plugin apis. - this._pluginApi = new PluginApi(); + // load plugins. + let pluginManager = new PluginManager(); + await pluginManager.discover(); // load plugins. - await this._loadPlugins(); + await pluginManager.load(); + + // initialize plugins. + await pluginManager.initialize(); this._bridge = await this._createBridge(); this._bridge.on('listening', function(port) { @@ -86,22 +89,6 @@ module.exports = class Server { await this._printSetupInfo(); } - _loadPlugins = async () => { - winston.verbose('[SERVER] loading plugins..'); - - let plugins = []; - let pluginManager = new PluginManager(); - let discovered = await pluginManager.discover(); - - Object.entries(discovered).forEach(async ([name, dir]) => { - if (await pluginManager.initialize(name, dir)) - plugins.push(name); - }); - - if (plugins.length === 0) - winston.warn('no plugins found. See the README for information on installing plugins..') - }; - _createBridge = async () => { var uuid = Uuid.generate('homer'); winston.verbose(`[SERVER] creating bridge: homer, uuid: ${uuid}`) From bff2dbdde3ee74e5fb96a481a5f6eb6549058f73 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Tue, 11 Feb 2020 18:26:37 +0300 Subject: [PATCH 080/152] more plugin manager work. --- .../plugin/api/{ => homebridge}/api.js | 5 ++-- .../homekit/plugin/api/homebridge/version.js | 26 +++++++++++++++++ node/src/homekit/plugin/api/homer/version.js | 28 +++++++++++++++++++ node/src/homekit/plugin/manager.js | 19 +++++++------ node/src/homekit/plugin/plugin.js | 8 +++--- 5 files changed, 71 insertions(+), 15 deletions(-) rename node/src/homekit/plugin/api/{ => homebridge}/api.js (91%) create mode 100644 node/src/homekit/plugin/api/homebridge/version.js create mode 100644 node/src/homekit/plugin/api/homer/version.js diff --git a/node/src/homekit/plugin/api/api.js b/node/src/homekit/plugin/api/homebridge/api.js similarity index 91% rename from node/src/homekit/plugin/api/api.js rename to node/src/homekit/plugin/api/homebridge/api.js index 8e865b2..3b151a7 100644 --- a/node/src/homekit/plugin/api/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -24,8 +24,9 @@ const hap = require("hap-nodejs"); const winston = require('winston'); const user = require('lib/user'); +const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); -module.exports = class PluginApi { +module.exports = class HomebridgePluginApi { constructor() { this._accessories = {}; this._configurableAccessories = {}; @@ -37,7 +38,7 @@ module.exports = class PluginApi { this.version = 2.4; // expose the homebridge server version - this.serverVersion = "0.4.5"; + this.serverVersion = HomebridgeApiVersion.ApiCompatibilityVersion; // expose the User class methods to plugins to get paths. Example: homebridge.user.storagePath() this.user = user; diff --git a/node/src/homekit/plugin/api/homebridge/version.js b/node/src/homekit/plugin/api/homebridge/version.js new file mode 100644 index 0000000..e3fff2c --- /dev/null +++ b/node/src/homekit/plugin/api/homebridge/version.js @@ -0,0 +1,26 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +module.exports = Object.freeze({ + ApiCompatibilityVersion: '0.4.5' +}); diff --git a/node/src/homekit/plugin/api/homer/version.js b/node/src/homekit/plugin/api/homer/version.js new file mode 100644 index 0000000..68d9eeb --- /dev/null +++ b/node/src/homekit/plugin/api/homer/version.js @@ -0,0 +1,28 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const packageInfo = require('../../../../../package.json'); + +module.exports = Object.freeze({ + ApiCompatibilityVersion: packageInfo.version +}); diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 2361982..0cb7f3e 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -26,13 +26,15 @@ const path = require('path'); const fs = require('fs-extra') const globalDirectories = require('global-dirs'); const Plugin = require('homekit/plugin/plugin'); -const PluginApi = require('homekit/plugin/api/api'); -const packageInfo = require('../../../package.json'); +const chalk = require('chalk'); +const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); +const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); +const HomerApiVersion = require('homekit/plugin/api/homer/version'); module.exports = class PluginManager { constructor() { - // init plugin apis. - this._pluginApi = new PluginApi(); + this._homebridgePluginApi = new HomebridgePluginApi(); // init plugin apis. + winston.info(`[PLUGIN_MANAGER] api compatibilities levels; homer: ${HomerApiVersion.ApiCompatibilityVersion}, homebridge: ${HomebridgeApiVersion.ApiCompatibilityVersion}..`) } discover = async() => { @@ -40,10 +42,9 @@ module.exports = class PluginManager { this._plugins = await this._discover(); - if (this._plugins.length === 0) - winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) - else - winston.info(`[PLUGIN_MANAGER] discovered a total of ${this._plugins.length} plugins..`) + this._plugins.length > 0 + ? winston.info(`[PLUGIN_MANAGER] discovered a total of ${this._plugins.length} plugins..`) + : winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) } load = async() => { @@ -54,7 +55,7 @@ module.exports = class PluginManager { initialize = async() => { for (const plugin of this._plugins) { - await plugin.initialize(this._pluginApi); + await plugin.initialize(this._homebridgePluginApi); } }; diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js index a378147..f8a5abd 100644 --- a/node/src/homekit/plugin/plugin.js +++ b/node/src/homekit/plugin/plugin.js @@ -25,8 +25,8 @@ const path = require('path'); const winston = require('winston'); const fs = require('fs-extra') const semver = require('semver'); - -const homebridge_compatiblity_version = "0.4.5"; +const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); +const HomerApiVersion = require('homekit/plugin/api/homer/version'); module.exports = class Plugin { constructor(name, dir) { @@ -49,11 +49,11 @@ module.exports = class Plugin { throw new Error(`[PLUGIN:${this.name}] plugin does not contain correct engines definitions..`); // check if homer version is satisfied. - if (json.engines.homer && !semver.satisfies(packageInfo.version, json.engines.homer) ) + if (json.engines.homer && !semver.satisfies(HomerApiVersion.ApiCompatibilityVersion, json.engines.homer) ) throw new Error(`[PLUGIN:${this.name}] plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${packageInfo.version}. Please consider upgrading your homer installation..`); // check if homebridge version is satisfied. - if (json.engines.homebridge && !semver.satisfies(homebridge_compatiblity_version, json.engines.homebridge) ) + if (json.engines.homebridge && !semver.satisfies(HomebridgeApiVersion.ApiCompatibilityVersion, json.engines.homebridge) ) throw new Error(`[PLUGIN:${this.name}] plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${homebridge_compatiblity_version}. Please consider upgrading your homer installation..`); // check node version. From 691ec3a5838b47a60e192fa1fe37ce296a461d6e Mon Sep 17 00:00:00 2001 From: bonesoul Date: Tue, 11 Feb 2020 21:57:31 +0300 Subject: [PATCH 081/152] tiny plugin & api version work. --- node/src/homekit/plugin/api/homebridge/api.js | 9 +++++++++ node/src/homekit/plugin/api/homebridge/version.js | 3 ++- node/src/homekit/plugin/api/homer/version.js | 3 ++- node/src/homekit/plugin/manager.js | 8 ++++---- node/src/homekit/plugin/plugin.js | 14 +++++++------- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 3b151a7..10a8f4e 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -55,4 +55,13 @@ module.exports = class HomebridgePluginApi { winston.info(`[PLUGIN:${pluginName}] registering accessory: ${accessoryName}..`); } + + registerPlatform = (pluginName, platformName, constructor, dynamic) => { + let name = `${pluginName}.${platformName}`; + + if (this._platforms[name]) + throw new Error(`plugin ${pluginName} attempted to registern an platform: ${platformName} which has been already registered!`); + + winston.info(`[PLUGIN:${pluginName}] registering platform: ${platformName}..`); + } } \ No newline at end of file diff --git a/node/src/homekit/plugin/api/homebridge/version.js b/node/src/homekit/plugin/api/homebridge/version.js index e3fff2c..bebea6a 100644 --- a/node/src/homekit/plugin/api/homebridge/version.js +++ b/node/src/homekit/plugin/api/homebridge/version.js @@ -22,5 +22,6 @@ 'use strict'; module.exports = Object.freeze({ - ApiCompatibilityVersion: '0.4.5' + ServerCompatibilityVersion: '0.4.46', + ApiCompatibilityVersion: '2.4' }); diff --git a/node/src/homekit/plugin/api/homer/version.js b/node/src/homekit/plugin/api/homer/version.js index 68d9eeb..bbd061f 100644 --- a/node/src/homekit/plugin/api/homer/version.js +++ b/node/src/homekit/plugin/api/homer/version.js @@ -24,5 +24,6 @@ const packageInfo = require('../../../../../package.json'); module.exports = Object.freeze({ - ApiCompatibilityVersion: packageInfo.version + ServerVersion: packageInfo.version, + ApiVersion: 0.1 }); diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 0cb7f3e..29a89a8 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -28,13 +28,13 @@ const globalDirectories = require('global-dirs'); const Plugin = require('homekit/plugin/plugin'); const chalk = require('chalk'); const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); -const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); -const HomerApiVersion = require('homekit/plugin/api/homer/version'); +const HomebridgVersion = require('homekit/plugin/api/homebridge/version'); +const HomerVersion = require('homekit/plugin/api/homer/version'); module.exports = class PluginManager { constructor() { this._homebridgePluginApi = new HomebridgePluginApi(); // init plugin apis. - winston.info(`[PLUGIN_MANAGER] api compatibilities levels; homer: ${HomerApiVersion.ApiCompatibilityVersion}, homebridge: ${HomebridgeApiVersion.ApiCompatibilityVersion}..`) + winston.info(`[PLUGIN_MANAGER] api compatibilities levels; homer: ${HomerVersion.ServerVersion} api: ${HomerVersion.ApiVersion}, homebridge: ${HomebridgVersion.ServerCompatibilityVersion} api: ${HomebridgVersion.ApiCompatibilityVersion}..`) } discover = async() => { @@ -44,7 +44,7 @@ module.exports = class PluginManager { this._plugins.length > 0 ? winston.info(`[PLUGIN_MANAGER] discovered a total of ${this._plugins.length} plugins..`) - : winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) + : winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) } load = async() => { diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js index f8a5abd..027c4c9 100644 --- a/node/src/homekit/plugin/plugin.js +++ b/node/src/homekit/plugin/plugin.js @@ -25,8 +25,8 @@ const path = require('path'); const winston = require('winston'); const fs = require('fs-extra') const semver = require('semver'); -const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); -const HomerApiVersion = require('homekit/plugin/api/homer/version'); +const HomerVersion = require('homekit/plugin/api/homer/version'); +const HomebridgVersion = require('homekit/plugin/api/homebridge/version'); module.exports = class Plugin { constructor(name, dir) { @@ -49,15 +49,15 @@ module.exports = class Plugin { throw new Error(`[PLUGIN:${this.name}] plugin does not contain correct engines definitions..`); // check if homer version is satisfied. - if (json.engines.homer && !semver.satisfies(HomerApiVersion.ApiCompatibilityVersion, json.engines.homer) ) - throw new Error(`[PLUGIN:${this.name}] plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${packageInfo.version}. Please consider upgrading your homer installation..`); + if (json.engines.homer && !semver.satisfies(HomerVersion.ServerVersion, json.engines.homer) ) + throw new Error(`[PLUGIN:${this.name}] plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${HomerVersion.ServerVersion}. Please consider upgrading your homer installation..`); // check if homebridge version is satisfied. - if (json.engines.homebridge && !semver.satisfies(HomebridgeApiVersion.ApiCompatibilityVersion, json.engines.homebridge) ) - throw new Error(`[PLUGIN:${this.name}] plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${homebridge_compatiblity_version}. Please consider upgrading your homer installation..`); + if (json.engines.homebridge && !semver.satisfies(HomebridgVersion.ServerCompatibilityVersion, json.engines.homebridge)) + throw new Error(`[PLUGIN:${this.name}] plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${HomebridgVersion.ServerCompatibilityVersion}. Please consider upgrading your homer installation..`); // check node version. - if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) + if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) winston.warn(`[PLUGIN:${this.name}] plugin requires node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`); // get plugin entrance From e96db156ebeb2b0297521b356f6cf5fb877d1519 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Tue, 11 Feb 2020 23:01:23 +0300 Subject: [PATCH 082/152] implemented accessory repository. closed my samsung tv - first! --- node/config/default.yaml | 25 +++-- node/src/homekit/plugin/api/homebridge/api.js | 50 +++++++-- node/src/homekit/plugin/manager.js | 9 +- node/src/homekit/plugin/plugin.js | 6 +- node/src/homekit/repository/accessory.js | 102 ++++++++++++++++++ node/src/homekit/server.js | 35 +++--- 6 files changed, 182 insertions(+), 45 deletions(-) create mode 100644 node/src/homekit/repository/accessory.js diff --git a/node/config/default.yaml b/node/config/default.yaml index a16f247..bfee720 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -1,19 +1,18 @@ # The default config that will be merged with the mode config [development, production, test] and then local.yaml. ############################ -# platforms config. +# homekit config. ############################ -platforms: - - ############################ - # homekit config. - ############################ - homekit: - setup: - serial: F1:F6:AC:2B:7E:8B - pin: 069-39-561 - port: 25777 - insecure: true # allow insecure access? +homekit: + setup: + serial: F1:F6:AC:2B:7E:8B + pin: 069-39-561 + port: 25777 + insecure: true # allow insecure access? + accessories: + - type: SamsungTV + name: UE42 + ip_address: 10.0.0.32 ############################ # Logging config. @@ -28,6 +27,6 @@ logging: level: debug # minimum log level. accesslog: true # enable access.log ? errorlog: true # enable error.log? - task: # task specific logger. + plugin: # task specific logger. enabled: true # enable the task speciffic loggers? level: info # minimum log level \ No newline at end of file diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 10a8f4e..518fdc0 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -48,20 +48,54 @@ module.exports = class HomebridgePluginApi { } registerAccessory = (pluginName, accessoryName, constructor, configurationRequestHandler) => { - let name = `${pluginName}.${accessoryName}`; + let fullName = `${pluginName}.${accessoryName}`; - if (this._accessories[name]) - throw new Error(`plugin ${pluginName} attempted to registern an accessory: ${accessoryName} which has been already registered!`); + if (this._accessories[fullName]) + throw new Error(`[API] plugin ${pluginName} attempted to registern an accessory: ${accessoryName} which has been already registered!`); - winston.info(`[PLUGIN:${pluginName}] registering accessory: ${accessoryName}..`); + winston.verbose(`[API] registering accessory: ${pluginName}.${accessoryName}..`); + + this._accessories[fullName] = constructor; + + if (configurationRequestHandler) + this._configurableAccessories[fullName] = configurationRequestHandler; + } + + accessory = async (name) => { + if (name.indexOf('.') == -1 ) { // if we got a short name supplied + let matches = []; + + // loop through all accessories and try matching ones. + for(const fullName in this._accessories) { + if (fullName.split(".")[1] == name) + matches.push(fullName); + } + + if (matches.length == 1) // if only found a single match + return this._accessories[matches[0]]; // return it. + else if (matches.length > 1) // if we found multiple matches + throw new Error(`found multiple matches for given accessory name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`); + else + throw new Error(`can't find a matching accessory for given name ${name}`); + } else { // if we got a full name in form of plugin.accessory notation. + if (!this._accessories[name]) + throw new Error(`can't find a matching accessory for given name ${name}`); + + return this._accessories[name]; + } } registerPlatform = (pluginName, platformName, constructor, dynamic) => { - let name = `${pluginName}.${platformName}`; + let fullName = `${pluginName}.${platformName}`; + + if (this._platforms[fullName]) + throw new Error(`[API] plugin ${pluginName} attempted to registern an platform: ${platformName} which has been already registered!`); + + winston.verbose(`[API] registering platform: ${pluginName}.${platformName}..`); - if (this._platforms[name]) - throw new Error(`plugin ${pluginName} attempted to registern an platform: ${platformName} which has been already registered!`); + this._platforms[fullName] = constructor; - winston.info(`[PLUGIN:${pluginName}] registering platform: ${platformName}..`); + if (dynamic) + this._dynamicPlatforms[fullName] = constructor; } } \ No newline at end of file diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 29a89a8..d0868e6 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -27,13 +27,12 @@ const fs = require('fs-extra') const globalDirectories = require('global-dirs'); const Plugin = require('homekit/plugin/plugin'); const chalk = require('chalk'); -const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); const HomebridgVersion = require('homekit/plugin/api/homebridge/version'); const HomerVersion = require('homekit/plugin/api/homer/version'); module.exports = class PluginManager { - constructor() { - this._homebridgePluginApi = new HomebridgePluginApi(); // init plugin apis. + constructor(pluginApi) { + this._pluginApi = pluginApi; winston.info(`[PLUGIN_MANAGER] api compatibilities levels; homer: ${HomerVersion.ServerVersion} api: ${HomerVersion.ApiVersion}, homebridge: ${HomebridgVersion.ServerCompatibilityVersion} api: ${HomebridgVersion.ApiCompatibilityVersion}..`) } @@ -55,7 +54,7 @@ module.exports = class PluginManager { initialize = async() => { for (const plugin of this._plugins) { - await plugin.initialize(this._homebridgePluginApi); + await plugin.initialize(this._pluginApi); } }; @@ -76,7 +75,7 @@ module.exports = class PluginManager { if (plugins.length === 0) continue; - + for(const plugin of plugins) { winston.verbose(`[PLUGIN_MANAGER] discovered plugin: ${plugin.name}..`); discovered.push(plugin); diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js index 027c4c9..30b2b3c 100644 --- a/node/src/homekit/plugin/plugin.js +++ b/node/src/homekit/plugin/plugin.js @@ -36,12 +36,12 @@ module.exports = class Plugin { } load = async() => { - winston.info(`[PLUGIN:${this.name}] loading plugin..`); + winston.verbose(`[PLUGIN:${this.name}] loading plugin..`); var json = await Plugin.getJson(this.dir); // make sure it has a valid json. - if (json === undefined) + if (json === undefined) throw new Error(`[PLUGIN:${this.name}] plugin does not have a valid package.json..`); // check if it has homebridge or homer as engine. @@ -77,7 +77,7 @@ module.exports = class Plugin { initialize = async (api) => { try { - winston.info(`[PLUGIN:${this.name}] initializing plugin..`); + winston.verbose(`[PLUGIN:${this.name}] initializing plugin..`); this.initializer(api); } catch (err) { throw new Error(`[PLUGIN:${this.name}] error initializing plugin ${err.stack}`) diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js new file mode 100644 index 0000000..b51fee9 --- /dev/null +++ b/node/src/homekit/repository/accessory.js @@ -0,0 +1,102 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const winston = require('winston'); +const config = require('config'); +var uuid = require("hap-nodejs").uuid; +var Accessory = require("hap-nodejs").Accessory; +var Service = require("hap-nodejs").Service; +var Characteristic = require("hap-nodejs").Characteristic; + +module.exports = class AccessoryRepository { + constructor(pluginApi, bridge) { + this._pluginApi = pluginApi; + this._bridge = bridge; + } + + load = async () => { + winston.verbose('[ACCESSORY_REPOSITORY] loading accessories..'); + + for (const entry of config.get('homekit.accessories')) { + await this._loadAccessory(entry); + } + } + + _loadAccessory = async(accessoryConfig) => { + try { + var ctor = await this._pluginApi.accessory(accessoryConfig.type); // get accessory's ctor. + var instance = new ctor(winston, accessoryConfig); // create an instance. + var accessory = await this._createAccessory(instance, accessoryConfig.name, accessoryConfig.type, accessoryConfig.uuid_base); // create accessory. + this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. + + } catch (err) { + winston.error(`[ACCESSORY_REPOSITORY] error loading accessory; ${err.stack}`) + } + } + + _createAccessory = async(accessoryInstance, displayName, accessoryType, uuid_base) => { + + winston.verbose(`[ACCESSORY_REPOSITORY] loading accessory: ${accessoryType} => ${displayName}..`); + + var services = accessoryInstance.getServices(); + + if (!(services[0] instanceof Service)) { // old homebridge api style. + // Create the actual HAP-NodeJS "Accessory" instance + return AccessoryLoader.parseAccessoryJSON({ + displayName: displayName, + services: services + }); + } else { // new homebridge api style. + var accessoryUUID = uuid.generate(`${accessoryType}:${(uuid_base || displayName)}`); + var accessory = new Accessory(displayName, accessoryUUID); + + // listen for the identify event if the accessory instance has defined an identify() method + if (accessoryInstance.identify) + accessory.on('identify', function(paired, callback) { accessoryInstance.identify(callback); }); + + for(const service of services) { + if (service instanceof Service.AccessoryInformation) { // accessory information service needs special handling. + var existingService = accessory.getService(Service.AccessoryInformation); + + // get the values defined by plugin's accesory information service. + var manufacturer = service.getCharacteristic(Characteristic.Manufacturer).value; + var model = service.getCharacteristic(Characteristic.Model).value; + var serialNumber = service.getCharacteristic(Characteristic.SerialNumber).value; + var firmwareRevision = service.getCharacteristic(Characteristic.FirmwareRevision).value; + var hardwareRevision = service.getCharacteristic(Characteristic.HardwareRevision).value; + + // set values overriden by plugin's accessory information service. + if (manufacturer) existingService.setCharacteristic(Characteristic.Manufacturer, manufacturer); + if (model) existingService.setCharacteristic(Characteristic.Model, model); + if (serialNumber) existingService.setCharacteristic(Characteristic.SerialNumber, serialNumber); + if (firmwareRevision) existingService.setCharacteristic(Characteristic.FirmwareRevision, firmwareRevision); + if (hardwareRevision) existingService.setCharacteristic(Characteristic.HardwareRevision, hardwareRevision); + } else { + accessory.addService(service); + } + } + + return accessory; + } + } +}; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 38ea645..1e0ea79 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -33,6 +33,8 @@ const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); const user = require('lib/user'); const PluginManager = require('homekit/plugin/manager'); +const AccessoryRepository = require('homekit/repository/accessory'); +const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); @@ -40,23 +42,21 @@ module.exports = class Server { constructor() { return (async () => { this._cleanCachedAccessories = false; - this._allowInsecureAccess = config.get('platforms.homekit.setup.insecure'); // should be only allowed for debugging purposes as this will allow unauthenticated requests. + this._allowInsecureAccess = config.get('homekit.setup.insecure'); // should be only allowed for debugging purposes as this will allow unauthenticated requests. + + this._bridge = await this._createBridge(); + this._pluginApi = new HomebridgePluginApi(); + this._pluginManager = new PluginManager(this._pluginApi); + this._accessoryRepository = new AccessoryRepository(this._pluginApi, this._bridge); // init accessory storage. winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); - // load plugins. - let pluginManager = new PluginManager(); - await pluginManager.discover(); - - // load plugins. - await pluginManager.load(); + await this._pluginManager.discover(); // discover plugins. + await this._pluginManager.load(); // load plugins. + await this._pluginManager.initialize(); // initialize plugins. - // initialize plugins. - await pluginManager.initialize(); - - this._bridge = await this._createBridge(); this._bridge.on('listening', function(port) { winston.info(`[SERVER] homer is running on port ${port}.`); }); @@ -66,6 +66,9 @@ module.exports = class Server { } run = async () => { + if (config.get('homekit.accessories')) + await this._accessoryRepository.load(); + await this._publish(); } @@ -73,13 +76,13 @@ module.exports = class Server { let accessoryInformationService = this._bridge.getService(Service.AccessoryInformation) .setCharacteristic(Characteristic.Manufacturer, packageInfo.author.name) .setCharacteristic(Characteristic.Model, packageInfo.name) - .setCharacteristic(Characteristic.SerialNumber, config.get('platforms.homekit.setup.serial')) + .setCharacteristic(Characteristic.SerialNumber, config.get('homekit.setup.serial')) .setCharacteristic(Characteristic.FirmwareRevision, packageInfo.version); var publishInfo = { - username: config.get('platforms.homekit.setup.serial'), - port: config.get('platforms.homekit.setup.port'), - pincode: config.get('platforms.homekit.setup.pin'), + username: config.get('homekit.setup.serial'), + port: config.get('homekit.setup.port'), + pincode: config.get('homekit.setup.pin'), category: Accessory.Categories.BRIDGE, } @@ -102,7 +105,7 @@ module.exports = class Server { winston.info(`[SERVER] or enter this pin on your Homekit device to pair..`); winston.info(chalk.black.bgYellow(` `)); winston.info(chalk.black.bgYellow(` ┌────────────┐ `)); - winston.info(chalk.black.bgYellow(` │ ${config.get('platforms.homekit.setup.pin')} │ `)); + winston.info(chalk.black.bgYellow(` │ ${config.get('homekit.setup.pin')} │ `)); winston.info(chalk.black.bgYellow(` └────────────┘ `)); winston.info(chalk.black.bgYellow(` `)); } From 5bc05db96b71841567f25cee8fdc41c2dd448d1a Mon Sep 17 00:00:00 2001 From: bonesoul Date: Tue, 11 Feb 2020 23:08:10 +0300 Subject: [PATCH 083/152] make accessory config compatible with homebridge. --- node/config/default.yaml | 2 +- node/src/homekit/repository/accessory.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/node/config/default.yaml b/node/config/default.yaml index bfee720..3b9339d 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -10,7 +10,7 @@ homekit: port: 25777 insecure: true # allow insecure access? accessories: - - type: SamsungTV + - accessory: SamsungTV name: UE42 ip_address: 10.0.0.32 diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index b51fee9..dc28d09 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -44,9 +44,9 @@ module.exports = class AccessoryRepository { _loadAccessory = async(accessoryConfig) => { try { - var ctor = await this._pluginApi.accessory(accessoryConfig.type); // get accessory's ctor. + var ctor = await this._pluginApi.accessory(accessoryConfig.accessory); // get accessory's ctor. var instance = new ctor(winston, accessoryConfig); // create an instance. - var accessory = await this._createAccessory(instance, accessoryConfig.name, accessoryConfig.type, accessoryConfig.uuid_base); // create accessory. + var accessory = await this._createAccessory(instance, accessoryConfig.name, accessoryConfig.accessory, accessoryConfig.uuid_base); // create accessory. this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. } catch (err) { From 64b4b3884d612832152c82aeb25eda9d586c57d5 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Tue, 11 Feb 2020 23:23:41 +0300 Subject: [PATCH 084/152] accessory events / on, off tests. --- node/src/homekit/repository/accessory.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index dc28d09..4195a9d 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -49,6 +49,16 @@ module.exports = class AccessoryRepository { var accessory = await this._createAccessory(instance, accessoryConfig.name, accessoryConfig.accessory, accessoryConfig.uuid_base); // create accessory. this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. + var characteristic = accessory.getService(Service.Switch).getCharacteristic(Characteristic.On) + + console.dir(characteristic); + characteristic.setValue(false) + console.dir(characteristic); + + accessory.on('service-characteristic-change', function(change) { + console.dir(change); + }.bind(this)); + } catch (err) { winston.error(`[ACCESSORY_REPOSITORY] error loading accessory; ${err.stack}`) } From 174fb9b3483c723e15a57cdf913f5d859bda913c Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 02:49:07 +0300 Subject: [PATCH 085/152] first orchestration of plex & philips hue lights done! --- node/.vscode/launch.json | 17 +++ node/config/default.yaml | 20 ++++ node/package-lock.json | 5 + node/package.json | 1 + node/src/homekit/plugin/api/homebridge/api.js | 24 +++++ .../homekit/plugin/api/homebridge/version.js | 2 +- node/src/homekit/plugin/logger.js | 101 ++++++++++++++++++ node/src/homekit/repository/accessory.js | 36 +++---- node/src/homekit/repository/platform.js | 84 +++++++++++++++ node/src/homekit/server.js | 60 ++++++++++- 10 files changed, 329 insertions(+), 21 deletions(-) create mode 100644 node/.vscode/launch.json create mode 100644 node/src/homekit/plugin/logger.js create mode 100644 node/src/homekit/repository/platform.js diff --git a/node/.vscode/launch.json b/node/.vscode/launch.json new file mode 100644 index 0000000..483a908 --- /dev/null +++ b/node/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\src\\app.js" + } + ] +} \ No newline at end of file diff --git a/node/config/default.yaml b/node/config/default.yaml index 3b9339d..cf6b890 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -13,6 +13,26 @@ homekit: - accessory: SamsungTV name: UE42 ip_address: 10.0.0.32 + - accessory: Plex + name: Plex + plex_token: CYjxgRwttBuPjChZH6ty + debug: true + filter: + - user: bonesoul + - player: "TV QE65Q70RATXTK" + platforms: + - platform: Hue + name: Hue + lights: true + forceCt: true + nativeHomeKitLights: false + nativeHomeKitSensors: true + nupnp: true + resource: true + sensors: false + anyOn: true + users: + 001788FFFE4E4B97: iNPI0C1c3B8TRQjYIXWSfGR7umtIPr9gSYhssmp4 ############################ # Logging config. diff --git a/node/package-lock.json b/node/package-lock.json index 6b2dd7d..06eb9a4 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -441,6 +441,11 @@ "object-keys": "^1.0.11" } }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "q": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", diff --git a/node/package.json b/node/package.json index 3ecdcf4..e1eb3c8 100644 --- a/node/package.json +++ b/node/package.json @@ -50,6 +50,7 @@ "moment": "2.24.0", "moment-duration-format": "2.3.2", "node-persist": "0.0.8", + "pify": "4.0.1", "qrcode-terminal": "0.12.0", "semver": "7.1.2", "winston": "2.4.4" diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 518fdc0..8ee1517 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -98,4 +98,28 @@ module.exports = class HomebridgePluginApi { if (dynamic) this._dynamicPlatforms[fullName] = constructor; } + + platform = async (name) => { + if (name.indexOf('.') == -1 ) { // if we got a short name supplied + let matches = []; + + // loop through all accessories and try matching ones. + for(const fullName in this._platforms) { + if (fullName.split(".")[1] == name) + matches.push(fullName); + } + + if (matches.length == 1) // if only found a single match + return this._platforms[matches[0]]; // return it. + else if (matches.length > 1) // if we found multiple matches + throw new Error(`found multiple matches for given platforms name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`); + else + throw new Error(`can't find a matching platforms for given name ${name}`); + } else { // if we got a full name in form of plugin.platforms notation. + if (!this._platforms[name]) + throw new Error(`can't find a matching platforms for given name ${name}`); + + return this._platforms[name]; + } + } } \ No newline at end of file diff --git a/node/src/homekit/plugin/api/homebridge/version.js b/node/src/homekit/plugin/api/homebridge/version.js index bebea6a..2aee3ef 100644 --- a/node/src/homekit/plugin/api/homebridge/version.js +++ b/node/src/homekit/plugin/api/homebridge/version.js @@ -22,6 +22,6 @@ 'use strict'; module.exports = Object.freeze({ - ServerCompatibilityVersion: '0.4.46', + ServerCompatibilityVersion: '0.4.50', ApiCompatibilityVersion: '2.4' }); diff --git a/node/src/homekit/plugin/logger.js b/node/src/homekit/plugin/logger.js new file mode 100644 index 0000000..3517c7a --- /dev/null +++ b/node/src/homekit/plugin/logger.js @@ -0,0 +1,101 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const util = require('util'); +const winston = require('winston'); + +module.exports = { + Logger: Logger, + _system: new Logger() // system logger, for internal use only +} + +// global cache of logger instances by plugin name +var loggerCache = {}; + +/** + * Logger class + */ + +function Logger(prefix) { + this.prefix = prefix; +} + +Logger.prototype.debug = function(msg) { + this.log.apply(this, ['debug'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.info = function(msg) { + this.log.apply(this, ['info'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.warn = function(msg) { + this.log.apply(this, ['warn'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.error = function(msg) { + this.log.apply(this, ['error'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.log = function(level, msg) { + + msg = util.format.apply(util, Array.prototype.slice.call(arguments, 1)); + let func = winston.info; + + if (level == 'debug') { + func = winston.debug; + } + else if (level == 'verbose') { + func = winston.verbose; + } + else if (level == 'warn') { + func = winston.warn; + } + else if (level == 'error') { + func = winston.error; + } + + // prepend prefix if applicable + if (this.prefix) + msg = `[${this.prefix}] ${msg}`; + + func(msg); +} + +Logger.withPrefix = function(prefix) { + + if (!loggerCache[prefix]) { + // create a class-like logger thing that acts as a function as well + // as an instance of Logger. + var logger = new Logger(prefix); + var log = logger.info.bind(logger); + log.debug = logger.debug; + log.info = logger.info; + log.warn = logger.warn; + log.error = logger.error; + log.log = logger.log; + log.prefix = logger.prefix; + loggerCache[prefix] = log; + } + + return loggerCache[prefix]; +} \ No newline at end of file diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index 4195a9d..5bc5a67 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -23,13 +23,15 @@ const winston = require('winston'); const config = require('config'); -var uuid = require("hap-nodejs").uuid; -var Accessory = require("hap-nodejs").Accessory; -var Service = require("hap-nodejs").Service; -var Characteristic = require("hap-nodejs").Characteristic; +const Logger = require('homekit/plugin/logger').Logger; +const uuid = require("hap-nodejs").uuid; +const Accessory = require("hap-nodejs").Accessory; +const Service = require("hap-nodejs").Service; +const Characteristic = require("hap-nodejs").Characteristic; module.exports = class AccessoryRepository { constructor(pluginApi, bridge) { + this.active = {} this._pluginApi = pluginApi; this._bridge = bridge; } @@ -44,29 +46,25 @@ module.exports = class AccessoryRepository { _loadAccessory = async(accessoryConfig) => { try { - var ctor = await this._pluginApi.accessory(accessoryConfig.accessory); // get accessory's ctor. - var instance = new ctor(winston, accessoryConfig); // create an instance. - var accessory = await this._createAccessory(instance, accessoryConfig.name, accessoryConfig.accessory, accessoryConfig.uuid_base); // create accessory. - this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. - - var characteristic = accessory.getService(Service.Switch).getCharacteristic(Characteristic.On) + var type = accessoryConfig.accessory; + var name = accessoryConfig.name; - console.dir(characteristic); - characteristic.setValue(false) - console.dir(characteristic); + var ctor = await this._pluginApi.accessory(type); // get accessory's ctor. + if (!ctor) throw new Error(`[ACCESSORY_REPOSITORY] requested unregistered accessory ${type}`); - accessory.on('service-characteristic-change', function(change) { - console.dir(change); - }.bind(this)); + var logger = Logger.withPrefix(`${type}:${name}`); // create logger for accessory. + var instance = new ctor(logger, accessoryConfig); // create an instance. + var accessory = await this.createAccessory(instance, name, type, accessoryConfig.uuid_base); // create accessory. + this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. } catch (err) { winston.error(`[ACCESSORY_REPOSITORY] error loading accessory; ${err.stack}`) } } - _createAccessory = async(accessoryInstance, displayName, accessoryType, uuid_base) => { + createAccessory = async(accessoryInstance, displayName, accessoryType, uuid_base) => { - winston.verbose(`[ACCESSORY_REPOSITORY] loading accessory: ${accessoryType} => ${displayName}..`); + winston.verbose(`[ACCESSORY_REPOSITORY] creating accessory: ${accessoryType} => ${displayName}..`); var services = accessoryInstance.getServices(); @@ -106,6 +104,8 @@ module.exports = class AccessoryRepository { } } + this.active[`${accessoryType}.${displayName}`] = accessory; + return accessory; } } diff --git a/node/src/homekit/repository/platform.js b/node/src/homekit/repository/platform.js new file mode 100644 index 0000000..4d90e36 --- /dev/null +++ b/node/src/homekit/repository/platform.js @@ -0,0 +1,84 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const winston = require('winston'); +const config = require('config'); +const Logger = require('homekit/plugin/logger').Logger; +const uuid = require("hap-nodejs").uuid; +const Accessory = require("hap-nodejs").Accessory; +const Service = require("hap-nodejs").Service; +const Characteristic = require("hap-nodejs").Characteristic; +const once = require("hap-nodejs").once; + +module.exports = class PlatformRepoistory { + constructor(pluginApi, accessoryRepository, bridge) { + this.active = {} + this._pluginApi = pluginApi; + this._accessoryRepository = accessoryRepository; + this._bridge = bridge; + } + + load = async () => { + winston.verbose('[PLATFORM_REPOSITORY] loading platforms..'); + + for (const entry of config.get('homekit.platforms')) { + await this._loadPlatform(entry); + } + } + + _loadPlatform = async(platformConfig) => { + try { + var type = platformConfig.platform; + var name = platformConfig.name || type; + + var ctor = await this._pluginApi.platform(type); // get platform's ctor. + if (!ctor) throw new Error(`[PLATFORM_REPOSITORY] requested unregistered accessory ${type}`); + + var logger = Logger.withPrefix(`${type}:${name}`); // create logger for platform + var instance = new ctor(logger, platformConfig, this._pluginApi); + + if (instance.configureAccessory == undefined) + this._loadPlatformAccessories(instance, type); + else + winston.warn('implement me!'); + + this.active[`${type}.${name}`] = instance; + + } catch (err) { + winston.error(`[PLATFORM_REPOSITORY] error loading accessory; ${err.stack}`) + } + } + + _loadPlatformAccessories = async (platformInstance, platformType) => { + platformInstance.accessories(once(function(accessories){ + return (async () => { + for(const accessoryInstance of accessories) { + let name = accessoryInstance.name; + var accessory = await this._accessoryRepository.createAccessory(accessoryInstance, name, platformType, accessoryInstance.uuid_base); // create platform supplied accessory. + + this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. + } + })(); + }.bind(this))); + } +}; \ No newline at end of file diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 1e0ea79..0c31e32 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -26,13 +26,16 @@ const Accessory = require("hap-nodejs").Accessory; const Service = require("hap-nodejs").Service; const Characteristic = require("hap-nodejs").Characteristic; const AccessoryLoader = require("hap-nodejs").AccessoryLoader; +const once = require("hap-nodejs").once; const Uuid = require("hap-nodejs").uuid; const winston = require('winston'); const config = require('config'); const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); const user = require('lib/user'); +const pify = require('pify'); const PluginManager = require('homekit/plugin/manager'); +const PlatformRepository = require('homekit/repository/platform'); const AccessoryRepository = require('homekit/repository/accessory'); const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); const accessoryStorage = require('node-persist').create(); @@ -48,6 +51,7 @@ module.exports = class Server { this._pluginApi = new HomebridgePluginApi(); this._pluginManager = new PluginManager(this._pluginApi); this._accessoryRepository = new AccessoryRepository(this._pluginApi, this._bridge); + this._platformRepository = new PlatformRepository(this._pluginApi, this._accessoryRepository, this._bridge); // init accessory storage. winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); @@ -66,10 +70,62 @@ module.exports = class Server { } run = async () => { - if (config.get('homekit.accessories')) - await this._accessoryRepository.load(); + if (config.get('homekit.platforms')) await this._platformRepository.load(); + if (config.get('homekit.accessories')) await this._accessoryRepository.load(); await this._publish(); + + this._orchestrate(); + } + + _orchestrate = async () => { + // get hue bridge. + let huePlatform = this._platformRepository.active['Hue.Hue']; + + // wait for hue bridge to expose the bulbs. + let lights = await this._getLights(huePlatform); + + // start listening for plex events. + this._accessoryRepository.active['Plex.Plex'].getService(Service.OccupancySensor).getCharacteristic(Characteristic.OccupancyDetected).on('change', (data) => { + if (!data.oldValue && data.newValue) { + winston.info('plex started playing media, closing lights..') + this._closeLights(lights); + } + else if (data.oldValue && !data.newValue) { + winston.info('plex stopped playing media, opening lights..') + this._openLights(lights); + } + }); + } + + _getLights = async (hue) => { + return new Promise((resolve, reject) => { + try { + let lights = []; + hue.accessories((accessories) => { + for(const entry of accessories) { + if (entry.constructor.name === 'HueAccessory' && entry.lightService) { + lights.push(entry); + } + } + return resolve(lights); + }); + } catch (err) { + return reject(err); + } + }); + } + + _openLights = (lights) => { + for(const entry of lights) { + entry.lightService.getCharacteristic(Characteristic.On).setValue(true); + } + } + + _closeLights = (lights) => { + for(const entry of lights) { + entry.lightService.getCharacteristic(Characteristic.On).setValue(false); + } } _publish = async () => { From fc94ca57d1767882c7c09f574a0466528805c8ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Wed, 12 Feb 2020 03:08:14 +0300 Subject: [PATCH 086/152] Update README.md --- README.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 862d30f..76e648e 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,63 @@ homer is code-first home & office automation system allowing complex interaction ## why? -As current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. +as current so called "home automation" systems are actually just "home information" system, I needed a real "home automation" system where IoT stuff can interract which each other and respond to stuff happening at your home/office. Even more homer allows you to develop complex virtual orchestrators that can command stuff together. + +The problem is that with current config-first solutions, it's hard to wire off which the main reason I decided to develop a solution with code-first (programmatic) aproach.

homer, orchestrating the office.
+## sample scenarios + +### turn on/off lights based on plex's status + +a very basic scenario that anyone can expect from an so-called home-automation system right? with homer it's just a piece of cake; + +``` + +let orchestrate = async () => { + // get hue bridge. + let huePlatform = this._platformRepository.active['Hue.Hue']; + + // wait for hue bridge to expose the bulbs. + let lights = await getLights(huePlatform); + + // start listening for plex events. + this._accessoryRepository.active['Plex.Plex'].getService(Service.OccupancySensor).getCharacteristic(Characteristic.OccupancyDetected).on('change', (data) => { + for(const entry of lights) { // loop through all lights. + entry.lightService.getCharacteristic(Characteristic.On).setValue(!data.newValue); // if plex started streaming close them, otherwise re-open them. + } + }); + } + +let getLights = async (hue) => { + return new Promise((resolve, reject) => { + try { + let lights = []; + hue.accessories((accessories) => { + for(const entry of accessories) { + if (entry.constructor.name === 'HueAccessory' && entry.lightService) { + lights.push(entry); + } + } + return resolve(lights); + }); + } catch (err) { + return reject(err); + } + }); + } + +await orchestrate(); // let the magic happen! +``` + +here you can see it happening; [youtube](https://www.youtube.com/watch?v=ig6Ax14W_Dg) + + + ## status still in early development stage. From c9105d5f57fc2894e4c288155abca290ca1c66bd Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 03:11:25 +0300 Subject: [PATCH 087/152] tiny change. --- node/src/homekit/server.js | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 0c31e32..27c26f0 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -87,14 +87,9 @@ module.exports = class Server { // start listening for plex events. this._accessoryRepository.active['Plex.Plex'].getService(Service.OccupancySensor).getCharacteristic(Characteristic.OccupancyDetected).on('change', (data) => { - if (!data.oldValue && data.newValue) { - winston.info('plex started playing media, closing lights..') - this._closeLights(lights); - } - else if (data.oldValue && !data.newValue) { - winston.info('plex stopped playing media, opening lights..') - this._openLights(lights); - } + for(const entry of lights) { // loop through all lights. + entry.lightService.getCharacteristic(Characteristic.On).setValue(!data.newValue); // if plex started streaming close them, otherwise re-open them. + } }); } @@ -116,18 +111,6 @@ module.exports = class Server { }); } - _openLights = (lights) => { - for(const entry of lights) { - entry.lightService.getCharacteristic(Characteristic.On).setValue(true); - } - } - - _closeLights = (lights) => { - for(const entry of lights) { - entry.lightService.getCharacteristic(Characteristic.On).setValue(false); - } - } - _publish = async () => { let accessoryInformationService = this._bridge.getService(Service.AccessoryInformation) .setCharacteristic(Characteristic.Manufacturer, packageInfo.author.name) From a06c050b844181de19a4b68695e7e32e566ce290 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 11:43:55 +0300 Subject: [PATCH 088/152] updated node-persist. --- node/package-lock.json | 27 +++++++-------------------- node/package.json | 5 ++--- node/src/homekit/server.js | 7 +++---- 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/node/package-lock.json b/node/package-lock.json index 06eb9a4..7cb844f 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -400,19 +400,11 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node-persist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.8.tgz", - "integrity": "sha1-pWxzm8b/2c7vGcDo2JWXkX8Ikkk=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-3.0.5.tgz", + "integrity": "sha512-zJmBA58kI9QAxXLMc4NLswgzXVIqKfsfQtiySMF6eEQ3kVvoM3YHzcP0//L9u30Fqx3cYe1FL/a+fyB3VwO/oQ==", "requires": { - "mkdirp": "~0.3.5", - "q": "~1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - } + "mkdirp": "~0.5.1" } }, "object-inspect": { @@ -441,11 +433,6 @@ "object-keys": "^1.0.11" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, "q": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", @@ -471,9 +458,9 @@ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, "semver": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.2.tgz", - "integrity": "sha512-BJs9T/H8sEVHbeigqzIEo57Iu/3DG6c4QoqTfbQB3BPA4zgzAomh/Fk9E7QtjWQ8mx2dgA9YCfSF4y9k9bHNpQ==" + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" }, "sprintf-js": { "version": "1.0.3", diff --git a/node/package.json b/node/package.json index e1eb3c8..f375961 100644 --- a/node/package.json +++ b/node/package.json @@ -49,10 +49,9 @@ "lodash": "4.17.15", "moment": "2.24.0", "moment-duration-format": "2.3.2", - "node-persist": "0.0.8", - "pify": "4.0.1", + "node-persist": "3.0.5", "qrcode-terminal": "0.12.0", - "semver": "7.1.2", + "semver": "7.1.3", "winston": "2.4.4" }, "engines": { diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index 27c26f0..d9a747f 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -33,12 +33,11 @@ const config = require('config'); const qrcode = require('qrcode-terminal'); const chalk = require('chalk'); const user = require('lib/user'); -const pify = require('pify'); +const storage = require('node-persist'); const PluginManager = require('homekit/plugin/manager'); const PlatformRepository = require('homekit/repository/platform'); const AccessoryRepository = require('homekit/repository/accessory'); const HomebridgePluginApi = require('homekit/plugin/api/homebridge/api'); -const accessoryStorage = require('node-persist').create(); const packageInfo = require('../../package.json'); module.exports = class Server { @@ -55,7 +54,7 @@ module.exports = class Server { // init accessory storage. winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); - accessoryStorage.initSync({ dir: user.cachedAccessoryPath() }); + await storage.init({ dir: user.cachedAccessoryPath() }); await this._pluginManager.discover(); // discover plugins. await this._pluginManager.load(); // load plugins. @@ -75,7 +74,7 @@ module.exports = class Server { await this._publish(); - this._orchestrate(); + // this._orchestrate(); } _orchestrate = async () => { From d0b2523de2d328c1ca728beec2856c9d4dbcd59a Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 12:47:41 +0300 Subject: [PATCH 089/152] updated to winston3. --- node/package-lock.json | 278 ++++++++++++++++++++++++++++++++++++----- node/package.json | 3 +- node/src/app.js | 2 +- node/src/lib/logger.js | 62 +++++---- node/src/lib/user.js | 4 + 5 files changed, 293 insertions(+), 56 deletions(-) diff --git a/node/package-lock.json b/node/package-lock.json index 7cb844f..8620a5e 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -37,9 +37,12 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } }, "bonjour-hap": { "version": "3.5.4", @@ -68,6 +71,30 @@ "supports-color": "^7.1.0" } }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -81,10 +108,33 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } }, "config": { "version": "3.2.5", @@ -94,10 +144,10 @@ "json5": "^1.0.1" } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "debug": { "version": "2.6.9", @@ -133,6 +183,16 @@ "object-keys": "^1.0.12" } }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -155,6 +215,19 @@ "buffer-indexof": "^1.0.0" } }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" + }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", @@ -188,16 +261,21 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fast-srp-hap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=" }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -274,6 +352,11 @@ "resolved": "https://registry.npmjs.org/hirestime/-/hirestime-4.0.0.tgz", "integrity": "sha512-hC55JfnXRLoCEdmAvwGk1IGXWt0CUox2LJ0WxjRTFjNoTK7Yi8EfOyTM7++9NeCchEW2Vqy0wg0SQddkY8PHYA==" }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", @@ -289,6 +372,11 @@ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", @@ -307,6 +395,11 @@ "has": "^1.0.3" } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -315,10 +408,10 @@ "has-symbols": "^1.0.1" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "js-yaml": { "version": "3.13.1", @@ -352,11 +445,38 @@ "graceful-fs": "^4.1.6" } }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", @@ -433,6 +553,16 @@ "object-keys": "^1.0.11" } }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "q": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", @@ -443,6 +573,16 @@ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==" }, + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -462,6 +602,14 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -490,6 +638,14 @@ "function-bind": "^1.1.1" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -498,11 +654,21 @@ "has-flag": "^4.0.0" } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -513,17 +679,73 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } + }, + "winston-console-format": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/winston-console-format/-/winston-console-format-1.0.5.tgz", + "integrity": "sha512-ZhjS3V91bm8d7PDGe02Dyfh6WJOi+M6gbeKzVqtgXuE+MA1lqKPclpNI05abVMkDBw3lmh6tc3IXkniJRs49CA==", + "requires": { + "colors": "^1.3.3", + "logform": "^2.1.2", + "triple-beam": "^1.3.0" + } + }, + "winston-transport": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", + "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } } } diff --git a/node/package.json b/node/package.json index f375961..98b1f27 100644 --- a/node/package.json +++ b/node/package.json @@ -52,7 +52,8 @@ "node-persist": "3.0.5", "qrcode-terminal": "0.12.0", "semver": "7.1.3", - "winston": "2.4.4" + "winston": "3.2.1", + "winston-console-format": "1.0.5" }, "engines": { "node": ">=13.7.0", diff --git a/node/src/app.js b/node/src/app.js index 641bb4e..652778a 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -42,7 +42,7 @@ const startup = async () => { // ======================================== // initialize log manager. // ======================================== - await logger.processLogger('homer'); + await logger.initialize(); // ======================================== // print startup banner. diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js index 22b1953..9698320 100644 --- a/node/src/lib/logger.js +++ b/node/src/lib/logger.js @@ -26,43 +26,53 @@ const path = require('path'); const config = require('config'); const winston = require('winston'); const moment = require('moment'); +const user = require('lib/user'); +const { format, transports } = require('winston'); +const { combine, cli, colorize, padLevels, timestamp, label, splat, printf } = format; require('moment-duration-format')(moment); const hirestime = require('hirestime'); -module.exports.processLogger = async processName => { +module.exports.initialize = async () => { try { // setup the logging directory and ensure it exists. const logPath = path.join(__dirname, '../../../logs'); fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename - // remove the default console log. - winston.remove(winston.transports.Console); - - if (config.logging.console.enabled) { // re-setup the console log if enabled. - winston.add(winston.transports.Console, { - level: config.logging.console.level, - handleExceptions: true, - humanReadableUnhandledException: true, - colorize: true, - prettyPrint: true, - timestamp: () => { - var date = new Date(); - return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)} [${global.process.pid}]`; - } - }); - } + const masterFormat = printf(({ level, message, label, timestamp }) => { + return `${timestamp} [${global.process.pid}] - ${level}: [${label}] ${message}`; + }); - if (config.logging.file.enabled) { // setup the server log if enabled. - winston.add(winston.transports.File, { - handleExceptions: true, - humanReadableUnhandledException: true, - filename: path.join(logPath, `/${processName}.log`), - level: config.logging.file.level, - json: false - }); + const timeStamp = () => { + var date = new Date(); + return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)}`; } + + winston.configure({ + transports: [ + new winston.transports.Console({ + level: 'verbose', + format: combine( + timestamp({format: timeStamp}), + label({ label: 'right meow!' }), + colorize({ level: true }), + splat(), + masterFormat, + ) + }), + new winston.transports.File({ + level: 'verbose', + format: combine( + timestamp({format: timeStamp}), + label({ label: 'right meow!' }), + splat(), + masterFormat, + ), + filename: user.logPath() + }) + ] + }); } catch (err) { - throw new Error(`Error initiliazing process logger - ${err}.`); + throw new Error(`Error initiliazing logger - ${err}.`); } }; diff --git a/node/src/lib/user.js b/node/src/lib/user.js index 8233845..b9bad56 100644 --- a/node/src/lib/user.js +++ b/node/src/lib/user.js @@ -28,6 +28,10 @@ module.exports.storagePath = () => { return path.join(os.homedir(), ".homer"); }; +module.exports.logPath = () => { + return path.join(module.exports.storagePath(), `/logs/homer.log`) +} + module.exports.persistPath = () => { return path.join(module.exports.storagePath(), "persist"); }; From 95a0325d62832b01ad4066309649e74d3e9602cd Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 13:22:37 +0300 Subject: [PATCH 090/152] added ms support to winston logs. --- node/src/lib/logger.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js index 9698320..bdef037 100644 --- a/node/src/lib/logger.js +++ b/node/src/lib/logger.js @@ -27,8 +27,8 @@ const config = require('config'); const winston = require('winston'); const moment = require('moment'); const user = require('lib/user'); -const { format, transports } = require('winston'); -const { combine, cli, colorize, padLevels, timestamp, label, splat, printf } = format; +const { format, info, transports } = require('winston'); +const { combine, cli, colorize, padLevels, timestamp, ms, label, splat, printf } = format; require('moment-duration-format')(moment); const hirestime = require('hirestime'); @@ -38,8 +38,8 @@ module.exports.initialize = async () => { const logPath = path.join(__dirname, '../../../logs'); fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename - const masterFormat = printf(({ level, message, label, timestamp }) => { - return `${timestamp} [${global.process.pid}] - ${level}: [${label}] ${message}`; + const masterFormat = printf((info) => { + return `${info.timestamp} [${info.ms}] - ${info.level}: [${info.label}] ${info.message}`; }); const timeStamp = () => { @@ -53,6 +53,7 @@ module.exports.initialize = async () => { level: 'verbose', format: combine( timestamp({format: timeStamp}), + ms(), label({ label: 'right meow!' }), colorize({ level: true }), splat(), @@ -63,6 +64,7 @@ module.exports.initialize = async () => { level: 'verbose', format: combine( timestamp({format: timeStamp}), + ms(), label({ label: 'right meow!' }), splat(), masterFormat, From 1065552543cb0d990fe39dd4bbd121b22892cac0 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 13:54:09 +0300 Subject: [PATCH 091/152] added labels to all log-lines. --- node/src/app.js | 16 ++++++------- node/src/homekit/homekit.js | 6 ++--- node/src/homekit/plugin/api/homebridge/api.js | 20 ++++++++-------- node/src/homekit/plugin/manager.js | 18 +++++++------- node/src/homekit/plugin/plugin.js | 22 ++++++++--------- node/src/homekit/repository/accessory.js | 8 +++---- node/src/homekit/repository/platform.js | 6 ++--- node/src/homekit/server.js | 24 +++++++++---------- node/src/lib/logger.js | 12 ++++++---- 9 files changed, 67 insertions(+), 65 deletions(-) diff --git a/node/src/app.js b/node/src/app.js index 652778a..a9340f0 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -65,10 +65,10 @@ const startup = async () => { winston.info(' | \\ '); winston.info(' j Y '); winston.info(''); - winston.info(`[HOMER] starting up homer version: ${packageInfo.version} [${env}]`); // eslint-disable-line no-undef - winston.info(`[HOMER] running on: ${os.platform()}-${os.arch()} [${os.type()} ${os.release()}]`); - winston.info(`[HOMER] node: ${process.versions.node}, v8: ${process.versions.v8}, uv: ${process.versions.uv}, openssl: ${process.versions.openssl}`); - winston.info(`[HOMER] running over ${os.cpus().length} core system.`); + winston.info(`starting up homer version: ${packageInfo.version} [${env}]`, { label: 'app'}); // eslint-disable-line no-undef + winston.info(`running on: ${os.platform()}-${os.arch()} [${os.type()} ${os.release()}]`, { label: 'app'}); + winston.info(`node: ${process.versions.node}, v8: ${process.versions.v8}, uv: ${process.versions.uv}, openssl: ${process.versions.openssl}`, { label: 'app'}); + winston.info(`running over ${os.cpus().length} core system.`, { label: 'app'}); // ======================================== // start homekit support. @@ -84,20 +84,20 @@ const startup = async () => { // ======================================== // broadcast startup event. // ======================================== - winston.info('[HOMER] startup done..'); + winston.info('startup done..', { label: 'app'}); emitter.emit('startup'); } catch (err) { - winston.error(`startup error: ${err}`); + winston.error(`startup error: ${err}`, { label: 'app'}); } }; const gracefulExit = code => { - winston.info(`[HOMER] exiting process with code: ${code}`); + winston.info(`exiting process with code: ${code}`, { label: 'app'}); process.exit(code); }; process.on('unhandledRejection', (reason, promise) => { - winston.error(`Possibly unhandled rejection at promise; ${util.inspect(promise)}`); + winston.error(`possibly unhandled rejection at promise; ${util.inspect(promise)}`, { label: 'app'}); }); startup(); diff --git a/node/src/homekit/homekit.js b/node/src/homekit/homekit.js index 871c3f3..5910843 100644 --- a/node/src/homekit/homekit.js +++ b/node/src/homekit/homekit.js @@ -33,8 +33,8 @@ module.exports = async () => { // ======================================== // init hap-nodejs. // ======================================== - winston.verbose(`[HOMEKIT] initializing hap-nodejs over path ${user.persistPath()}`); - await hap.init(user.persistPath()); + winston.verbose(`initializing hap-nodejs over path ${user.persistPath()}`, { label: 'homekit'}); + hap.init(user.persistPath()); // ======================================== // start homekit server. @@ -42,6 +42,6 @@ module.exports = async () => { var server = await new Server(); await server.run(); } catch (err) { - throw new Error(`[HOMEKIT] error initializing homekit server: ${err.stack}`); + throw new Error(`error initializing homekit server: ${err.stack}`, { label: 'homekit'}); } }; \ No newline at end of file diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 8ee1517..326fac7 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -51,9 +51,9 @@ module.exports = class HomebridgePluginApi { let fullName = `${pluginName}.${accessoryName}`; if (this._accessories[fullName]) - throw new Error(`[API] plugin ${pluginName} attempted to registern an accessory: ${accessoryName} which has been already registered!`); + throw new Error(`plugin ${pluginName} attempted to registern an accessory: ${accessoryName} which has been already registered!`,{ label: 'api'}); - winston.verbose(`[API] registering accessory: ${pluginName}.${accessoryName}..`); + winston.verbose(`registering accessory: ${pluginName}.${accessoryName}..`,{ label: 'api'}); this._accessories[fullName] = constructor; @@ -74,12 +74,12 @@ module.exports = class HomebridgePluginApi { if (matches.length == 1) // if only found a single match return this._accessories[matches[0]]; // return it. else if (matches.length > 1) // if we found multiple matches - throw new Error(`found multiple matches for given accessory name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`); + throw new Error(`found multiple matches for given accessory name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`, { label: 'api'}); else - throw new Error(`can't find a matching accessory for given name ${name}`); + throw new Error(`can't find a matching accessory for given name ${name}`, { label: 'api'}); } else { // if we got a full name in form of plugin.accessory notation. if (!this._accessories[name]) - throw new Error(`can't find a matching accessory for given name ${name}`); + throw new Error(`can't find a matching accessory for given name ${name}`, { label: 'api'}); return this._accessories[name]; } @@ -89,9 +89,9 @@ module.exports = class HomebridgePluginApi { let fullName = `${pluginName}.${platformName}`; if (this._platforms[fullName]) - throw new Error(`[API] plugin ${pluginName} attempted to registern an platform: ${platformName} which has been already registered!`); + throw new Error(`plugin ${pluginName} attempted to registern an platform: ${platformName} which has been already registered!`, { label: 'api'}); - winston.verbose(`[API] registering platform: ${pluginName}.${platformName}..`); + winston.verbose(`registering platform: ${pluginName}.${platformName}..`, { label: 'api'}); this._platforms[fullName] = constructor; @@ -112,12 +112,12 @@ module.exports = class HomebridgePluginApi { if (matches.length == 1) // if only found a single match return this._platforms[matches[0]]; // return it. else if (matches.length > 1) // if we found multiple matches - throw new Error(`found multiple matches for given platforms name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`); + throw new Error(`found multiple matches for given platforms name ${name}. Please expilicitly spesify by writing one of these; ${matches.join(', ')}`, { label: 'api'}); else - throw new Error(`can't find a matching platforms for given name ${name}`); + throw new Error(`can't find a matching platforms for given name ${name}`, { label: 'api'}); } else { // if we got a full name in form of plugin.platforms notation. if (!this._platforms[name]) - throw new Error(`can't find a matching platforms for given name ${name}`); + throw new Error(`can't find a matching platforms for given name ${name}`, { label: 'api'}); return this._platforms[name]; } diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index d0868e6..96ccc2f 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -33,17 +33,17 @@ const HomerVersion = require('homekit/plugin/api/homer/version'); module.exports = class PluginManager { constructor(pluginApi) { this._pluginApi = pluginApi; - winston.info(`[PLUGIN_MANAGER] api compatibilities levels; homer: ${HomerVersion.ServerVersion} api: ${HomerVersion.ApiVersion}, homebridge: ${HomebridgVersion.ServerCompatibilityVersion} api: ${HomebridgVersion.ApiCompatibilityVersion}..`) + winston.info(`api compatibilities levels; homer: ${HomerVersion.ServerVersion} api: ${HomerVersion.ApiVersion}, homebridge: ${HomebridgVersion.ServerCompatibilityVersion} api: ${HomebridgVersion.ApiCompatibilityVersion}..`, { label: 'pluginmanager'}) } discover = async() => { - winston.verbose('[PLUGIN_MANAGER] loading plugins..'); + winston.verbose('loading plugins..', { label: 'pluginmanager'}); this._plugins = await this._discover(); - this._plugins.length > 0 - ? winston.info(`[PLUGIN_MANAGER] discovered a total of ${this._plugins.length} plugins..`) - : winston.warn(`[PLUGIN_MANAGER] no plugins found. See the README for information on installing plugins..`) + this._plugins.length > 0 + ? winston.info(`discovered a total of ${this._plugins.length} plugins..`, { label: 'pluginmanager'}) + : winston.warn(`no plugins found. See the README for information on installing plugins..`, { label: 'pluginmanager'}) } load = async() => { @@ -63,7 +63,7 @@ module.exports = class PluginManager { let searchedPaths = {}; let paths = await this._getPaths(); - winston.verbose(`[PLUGIN_MANAGER] discovering plugins..`); + winston.verbose(`discovering plugins..`, { label: 'pluginmanager'}); for (const path of paths) { if (searchedPaths[path]) @@ -77,7 +77,7 @@ module.exports = class PluginManager { continue; for(const plugin of plugins) { - winston.verbose(`[PLUGIN_MANAGER] discovered plugin: ${plugin.name}..`); + winston.verbose(`discovered plugin: ${plugin.name}..`, { label: 'pluginmanager'}); discovered.push(plugin); } } @@ -87,7 +87,7 @@ module.exports = class PluginManager { _discoverPath = async (dir) => { try { - winston.verbose(`[PLUGIN_MANAGER] checking ${dir} for plugins..`); + winston.verbose(`checking ${dir} for plugins..`, { label: 'pluginmanager'}); let plugins = []; @@ -99,7 +99,7 @@ module.exports = class PluginManager { let names = await fs.readdir(dir); // if this is a module directory with package.json, just skip it. - if (await fs.exists(path.join(dir, "package.json"))) + if (await fs.exists(path.join(dir, 'package.json'))) names = [""]; for (const name of names) { diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js index 30b2b3c..3e37a98 100644 --- a/node/src/homekit/plugin/plugin.js +++ b/node/src/homekit/plugin/plugin.js @@ -36,29 +36,29 @@ module.exports = class Plugin { } load = async() => { - winston.verbose(`[PLUGIN:${this.name}] loading plugin..`); + winston.verbose(`loading plugin..`, { label: `plugin:${this.name}`}); var json = await Plugin.getJson(this.dir); // make sure it has a valid json. if (json === undefined) - throw new Error(`[PLUGIN:${this.name}] plugin does not have a valid package.json..`); + throw new Error(`plugin does not have a valid package.json..`,{ label: `plugin:${this.name}`}); // check if it has homebridge or homer as engine. if (!json.engines || (!json.engines.homebridge && !json.engines.homer)) - throw new Error(`[PLUGIN:${this.name}] plugin does not contain correct engines definitions..`); + throw new Error(`plugin does not contain correct engines definitions..`,{ label: `plugin:${this.name}`}); // check if homer version is satisfied. if (json.engines.homer && !semver.satisfies(HomerVersion.ServerVersion, json.engines.homer) ) - throw new Error(`[PLUGIN:${this.name}] plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${HomerVersion.ServerVersion}. Please consider upgrading your homer installation..`); + throw new Error(`plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${HomerVersion.ServerVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); // check if homebridge version is satisfied. if (json.engines.homebridge && !semver.satisfies(HomebridgVersion.ServerCompatibilityVersion, json.engines.homebridge)) - throw new Error(`[PLUGIN:${this.name}] plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${HomebridgVersion.ServerCompatibilityVersion}. Please consider upgrading your homer installation..`); + throw new Error(`plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${HomebridgVersion.ServerCompatibilityVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); // check node version. if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) - winston.warn(`[PLUGIN:${this.name}] plugin requires node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`); + winston.warn(`plugin requires node version ${json.engines.node} which is not satisfied by current version ${process.version}. Consider upgrading your node installation..`,{ label: `plugin:${this.name}`}); // get plugin entrance let entrance = json.main || "./index.js"; @@ -72,20 +72,20 @@ module.exports = class Plugin { else if (module && typeof module.default === "function") this.initializer = module.default; else - throw new Error(`[PLUGIN:${this.name}] plugin does not export an initializer..`) + throw new Error(`plugin does not export an initializer..`,{ label: `plugin:${this.name}`}) } initialize = async (api) => { try { - winston.verbose(`[PLUGIN:${this.name}] initializing plugin..`); + winston.verbose(`initializing plugin..`,{ label: `plugin:${this.name}`}); this.initializer(api); } catch (err) { - throw new Error(`[PLUGIN:${this.name}] error initializing plugin ${err.stack}`) + throw new Error(`error initializing plugin ${err.stack}`,{ label: `plugin:${this.name}`}) } } static getJson = async (dir) => { - let packageJsonPath = path.join(dir, "package.json"); + let packageJsonPath = path.join(dir, 'package.json'); if (!await fs.exists(packageJsonPath)) return; @@ -99,7 +99,7 @@ module.exports = class Plugin { return; // verify the plugin is correctly tagged with homebridge-plugin or homer-plugin. - if (!json.keywords || (json.keywords.indexOf("homebridge-plugin") == -1 && json.keywords.indexOf("homer-plugin") == -1)) + if (!json.keywords || (json.keywords.indexOf('homebridge-plugin') == -1 && json.keywords.indexOf('homer-plugin') == -1)) return; return json; diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index 5bc5a67..446ecfe 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -37,7 +37,7 @@ module.exports = class AccessoryRepository { } load = async () => { - winston.verbose('[ACCESSORY_REPOSITORY] loading accessories..'); + winston.verbose('loading accessories..', { label: 'accessoryrep'}); for (const entry of config.get('homekit.accessories')) { await this._loadAccessory(entry); @@ -50,7 +50,7 @@ module.exports = class AccessoryRepository { var name = accessoryConfig.name; var ctor = await this._pluginApi.accessory(type); // get accessory's ctor. - if (!ctor) throw new Error(`[ACCESSORY_REPOSITORY] requested unregistered accessory ${type}`); + if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'accessoryrep'}); var logger = Logger.withPrefix(`${type}:${name}`); // create logger for accessory. var instance = new ctor(logger, accessoryConfig); // create an instance. @@ -58,13 +58,13 @@ module.exports = class AccessoryRepository { this._bridge.addBridgedAccessory(accessory); // add accessory to our bridge. } catch (err) { - winston.error(`[ACCESSORY_REPOSITORY] error loading accessory; ${err.stack}`) + winston.error(`error loading accessory; ${err.stack}`, { label: 'accessoryrep'}) } } createAccessory = async(accessoryInstance, displayName, accessoryType, uuid_base) => { - winston.verbose(`[ACCESSORY_REPOSITORY] creating accessory: ${accessoryType} => ${displayName}..`); + winston.verbose(`creating accessory: ${accessoryType} => ${displayName}..`, { label: 'accessoryrep'}); var services = accessoryInstance.getServices(); diff --git a/node/src/homekit/repository/platform.js b/node/src/homekit/repository/platform.js index 4d90e36..e510d7a 100644 --- a/node/src/homekit/repository/platform.js +++ b/node/src/homekit/repository/platform.js @@ -39,7 +39,7 @@ module.exports = class PlatformRepoistory { } load = async () => { - winston.verbose('[PLATFORM_REPOSITORY] loading platforms..'); + winston.verbose('loading platforms..', { label: 'platformrep'}); for (const entry of config.get('homekit.platforms')) { await this._loadPlatform(entry); @@ -52,7 +52,7 @@ module.exports = class PlatformRepoistory { var name = platformConfig.name || type; var ctor = await this._pluginApi.platform(type); // get platform's ctor. - if (!ctor) throw new Error(`[PLATFORM_REPOSITORY] requested unregistered accessory ${type}`); + if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'platformrep'}); var logger = Logger.withPrefix(`${type}:${name}`); // create logger for platform var instance = new ctor(logger, platformConfig, this._pluginApi); @@ -65,7 +65,7 @@ module.exports = class PlatformRepoistory { this.active[`${type}.${name}`] = instance; } catch (err) { - winston.error(`[PLATFORM_REPOSITORY] error loading accessory; ${err.stack}`) + winston.error(`error loading accessory; ${err.stack}`, { label: 'platformrep'}) } } diff --git a/node/src/homekit/server.js b/node/src/homekit/server.js index d9a747f..c4ccc40 100644 --- a/node/src/homekit/server.js +++ b/node/src/homekit/server.js @@ -53,7 +53,7 @@ module.exports = class Server { this._platformRepository = new PlatformRepository(this._pluginApi, this._accessoryRepository, this._bridge); // init accessory storage. - winston.verbose(`[SERVER] initializing accessory storage over path ${user.cachedAccessoryPath()}`); + winston.verbose(`initializing accessory storage over path ${user.cachedAccessoryPath()}`, { label: 'server'}); await storage.init({ dir: user.cachedAccessoryPath() }); await this._pluginManager.discover(); // discover plugins. @@ -61,7 +61,7 @@ module.exports = class Server { await this._pluginManager.initialize(); // initialize plugins. this._bridge.on('listening', function(port) { - winston.info(`[SERVER] homer is running on port ${port}.`); + winston.info(`homer is running on port ${port}.`, { label: 'server'}); }); return this; @@ -124,7 +124,7 @@ module.exports = class Server { category: Accessory.Categories.BRIDGE, } - winston.verbose(`[SERVER] publishing ${publishInfo.username} over port ${publishInfo.port} using pin ${publishInfo.pincode}..`); + winston.verbose(`publishing ${publishInfo.username} over port ${publishInfo.port} using pin ${publishInfo.pincode}..`, { label: 'server'}); await this._bridge.publish(publishInfo, this._allowInsecureAccess); await this._printSetupInfo(); @@ -132,19 +132,19 @@ module.exports = class Server { _createBridge = async () => { var uuid = Uuid.generate('homer'); - winston.verbose(`[SERVER] creating bridge: homer, uuid: ${uuid}`) + winston.verbose(`creating bridge: homer, uuid: ${uuid}`, { label: 'server'}) return new Bridge('homer', uuid); } _printSetupInfo = async () => { - winston.info(`[SERVER] setup payload ${this._bridge.setupURI()}`); - winston.info(`[SERVER] scan this code with your Homekit device to pair..`); + winston.info(`setup payload ${this._bridge.setupURI()}`, { label: 'server'}); + winston.info(`scan this code with your Homekit device to pair..`, { label: 'server'}); qrcode.generate(this._bridge.setupURI()); - winston.info(`[SERVER] or enter this pin on your Homekit device to pair..`); - winston.info(chalk.black.bgYellow(` `)); - winston.info(chalk.black.bgYellow(` ┌────────────┐ `)); - winston.info(chalk.black.bgYellow(` │ ${config.get('homekit.setup.pin')} │ `)); - winston.info(chalk.black.bgYellow(` └────────────┘ `)); - winston.info(chalk.black.bgYellow(` `)); + winston.info(`or enter this pin on your Homekit device to pair..`, { label: 'server'}); + winston.info(chalk.black.bgYellow(` `), { label: 'server'}); + winston.info(chalk.black.bgYellow(` ┌────────────┐ `), { label: 'server'}); + winston.info(chalk.black.bgYellow(` │ ${config.get('homekit.setup.pin')} │ `), { label: 'server'}); + winston.info(chalk.black.bgYellow(` └────────────┘ `), { label: 'server'}); + winston.info(chalk.black.bgYellow(` `), { label: 'server'}); } } diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js index bdef037..74a5da7 100644 --- a/node/src/lib/logger.js +++ b/node/src/lib/logger.js @@ -39,7 +39,8 @@ module.exports.initialize = async () => { fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename const masterFormat = printf((info) => { - return `${info.timestamp} [${info.ms}] - ${info.level}: [${info.label}] ${info.message}`; + let context = info.label ? ` [${info.label}] ` : '' + return `${info.timestamp} [${info.ms}] - ${info.level}:${context}${info.message}`; }); const timeStamp = () => { @@ -50,22 +51,22 @@ module.exports.initialize = async () => { winston.configure({ transports: [ new winston.transports.Console({ - level: 'verbose', + level: 'silly', format: combine( timestamp({format: timeStamp}), ms(), - label({ label: 'right meow!' }), + label({ label: '' }), colorize({ level: true }), splat(), masterFormat, ) }), new winston.transports.File({ - level: 'verbose', + level: 'silly', format: combine( timestamp({format: timeStamp}), ms(), - label({ label: 'right meow!' }), + label({ label: '' }), splat(), masterFormat, ), @@ -73,6 +74,7 @@ module.exports.initialize = async () => { }) ] }); + } catch (err) { throw new Error(`Error initiliazing logger - ${err}.`); } From 089a57f55240249ec761f93b47162b6a0cfb6b5b Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 13:59:27 +0300 Subject: [PATCH 092/152] we have a single version file now. --- node/src/app.js | 2 +- node/src/homekit/plugin/api/homebridge/api.js | 4 +-- .../homekit/plugin/api/homebridge/version.js | 27 ------------------- .../api/{homer/version.js => versions.js} | 12 ++++++--- node/src/homekit/plugin/manager.js | 5 ++-- node/src/homekit/plugin/plugin.js | 11 ++++---- 6 files changed, 19 insertions(+), 42 deletions(-) delete mode 100644 node/src/homekit/plugin/api/homebridge/version.js rename node/src/homekit/plugin/api/{homer/version.js => versions.js} (84%) diff --git a/node/src/app.js b/node/src/app.js index a9340f0..fd17a5b 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -87,7 +87,7 @@ const startup = async () => { winston.info('startup done..', { label: 'app'}); emitter.emit('startup'); } catch (err) { - winston.error(`startup error: ${err}`, { label: 'app'}); + winston.error(`startup error: ${err.stack}`, { label: 'app'}); } }; diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 326fac7..4ee75ef 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -24,7 +24,7 @@ const hap = require("hap-nodejs"); const winston = require('winston'); const user = require('lib/user'); -const HomebridgeApiVersion = require('homekit/plugin/api/homebridge/version'); +const versions = require('homekit/plugin/api/versions'); module.exports = class HomebridgePluginApi { constructor() { @@ -38,7 +38,7 @@ module.exports = class HomebridgePluginApi { this.version = 2.4; // expose the homebridge server version - this.serverVersion = HomebridgeApiVersion.ApiCompatibilityVersion; + this.serverVersion = versions.Homebridge.ApiCompatibilityVersion; // expose the User class methods to plugins to get paths. Example: homebridge.user.storagePath() this.user = user; diff --git a/node/src/homekit/plugin/api/homebridge/version.js b/node/src/homekit/plugin/api/homebridge/version.js deleted file mode 100644 index 2aee3ef..0000000 --- a/node/src/homekit/plugin/api/homebridge/version.js +++ /dev/null @@ -1,27 +0,0 @@ - -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -'use strict'; - -module.exports = Object.freeze({ - ServerCompatibilityVersion: '0.4.50', - ApiCompatibilityVersion: '2.4' -}); diff --git a/node/src/homekit/plugin/api/homer/version.js b/node/src/homekit/plugin/api/versions.js similarity index 84% rename from node/src/homekit/plugin/api/homer/version.js rename to node/src/homekit/plugin/api/versions.js index bbd061f..b97e993 100644 --- a/node/src/homekit/plugin/api/homer/version.js +++ b/node/src/homekit/plugin/api/versions.js @@ -21,9 +21,15 @@ // Licensor: Hüseyin Uslu 'use strict'; -const packageInfo = require('../../../../../package.json'); +const packageInfo = require('../../../../package.json'); module.exports = Object.freeze({ - ServerVersion: packageInfo.version, - ApiVersion: 0.1 + Homebridge: { + ServerCompatibilityVersion: '0.4.50', + ApiCompatibilityVersion: '2.4' + }, + Homer: { + ServerVersion: packageInfo.version, + ApiVersion: 0.1 + } }); diff --git a/node/src/homekit/plugin/manager.js b/node/src/homekit/plugin/manager.js index 96ccc2f..2c75e4c 100644 --- a/node/src/homekit/plugin/manager.js +++ b/node/src/homekit/plugin/manager.js @@ -27,13 +27,12 @@ const fs = require('fs-extra') const globalDirectories = require('global-dirs'); const Plugin = require('homekit/plugin/plugin'); const chalk = require('chalk'); -const HomebridgVersion = require('homekit/plugin/api/homebridge/version'); -const HomerVersion = require('homekit/plugin/api/homer/version'); +const versions = require('homekit/plugin/api/versions'); module.exports = class PluginManager { constructor(pluginApi) { this._pluginApi = pluginApi; - winston.info(`api compatibilities levels; homer: ${HomerVersion.ServerVersion} api: ${HomerVersion.ApiVersion}, homebridge: ${HomebridgVersion.ServerCompatibilityVersion} api: ${HomebridgVersion.ApiCompatibilityVersion}..`, { label: 'pluginmanager'}) + winston.info(`api compatibilities levels; homer: ${versions.Homer.ServerVersion} api: ${versions.Homer.ApiVersion}, homebridge: ${versions.Homebridge.ServerCompatibilityVersion} api: ${versions.Homebridge.ApiCompatibilityVersion}..`, { label: 'pluginmanager'}) } discover = async() => { diff --git a/node/src/homekit/plugin/plugin.js b/node/src/homekit/plugin/plugin.js index 3e37a98..b9d4bd5 100644 --- a/node/src/homekit/plugin/plugin.js +++ b/node/src/homekit/plugin/plugin.js @@ -25,8 +25,7 @@ const path = require('path'); const winston = require('winston'); const fs = require('fs-extra') const semver = require('semver'); -const HomerVersion = require('homekit/plugin/api/homer/version'); -const HomebridgVersion = require('homekit/plugin/api/homebridge/version'); +const versions = require('homekit/plugin/api/versions'); module.exports = class Plugin { constructor(name, dir) { @@ -49,12 +48,12 @@ module.exports = class Plugin { throw new Error(`plugin does not contain correct engines definitions..`,{ label: `plugin:${this.name}`}); // check if homer version is satisfied. - if (json.engines.homer && !semver.satisfies(HomerVersion.ServerVersion, json.engines.homer) ) - throw new Error(`plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${HomerVersion.ServerVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); + if (json.engines.homer && !semver.satisfies(versions.Homer.ServerVersion, json.engines.homer) ) + throw new Error(`plugin requires homer version ${json.engines.homer} which is not satisfied by current version ${versions.Homer.ServerVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); // check if homebridge version is satisfied. - if (json.engines.homebridge && !semver.satisfies(HomebridgVersion.ServerCompatibilityVersion, json.engines.homebridge)) - throw new Error(`plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${HomebridgVersion.ServerCompatibilityVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); + if (json.engines.homebridge && !semver.satisfies(versions.Homebridge.ServerCompatibilityVersion, json.engines.homebridge)) + throw new Error(`plugin requires homebridge compatability version ${json.engines.homebridge} which is not satisfied by current version ${versions.Homebridge.ServerCompatibilityVersion}. Please consider upgrading your homer installation..`,{ label: `plugin:${this.name}`}); // check node version. if (json.engines.node && !semver.satisfies(process.version, json.engines.node)) From d9535d8eace0468e7fe15901accd2a99cb26dcda Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 14:20:17 +0300 Subject: [PATCH 093/152] loggers are configurable again. --- node/src/homekit/plugin/api/homebridge/api.js | 2 +- node/src/lib/logger.js | 54 ++++++++++--------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/node/src/homekit/plugin/api/homebridge/api.js index 4ee75ef..258da9c 100644 --- a/node/src/homekit/plugin/api/homebridge/api.js +++ b/node/src/homekit/plugin/api/homebridge/api.js @@ -38,7 +38,7 @@ module.exports = class HomebridgePluginApi { this.version = 2.4; // expose the homebridge server version - this.serverVersion = versions.Homebridge.ApiCompatibilityVersion; + this.serverVersion = versions.Homebridge.ApiCompatibilityVersion; // expose the User class methods to plugins to get paths. Example: homebridge.user.storagePath() this.user = user; diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js index 74a5da7..352cf46 100644 --- a/node/src/lib/logger.js +++ b/node/src/lib/logger.js @@ -48,33 +48,35 @@ module.exports.initialize = async () => { return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)}`; } - winston.configure({ - transports: [ - new winston.transports.Console({ - level: 'silly', - format: combine( - timestamp({format: timeStamp}), - ms(), - label({ label: '' }), - colorize({ level: true }), - splat(), - masterFormat, - ) - }), - new winston.transports.File({ - level: 'silly', - format: combine( - timestamp({format: timeStamp}), - ms(), - label({ label: '' }), - splat(), - masterFormat, - ), - filename: user.logPath() - }) - ] - }); + // setup the console log if enabled. + if (config.logging.console.enabled) { + winston.add(new winston.transports.Console({ + level: 'silly', + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: '' }), + colorize({ level: true }), + splat(), + masterFormat, + ) + })); + } + // setup the server log if enabled. + if (config.logging.file.enabled) { + winston.add(new winston.transports.File({ + level: 'silly', + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: '' }), + splat(), + masterFormat, + ), + filename: user.logPath() + })); + } } catch (err) { throw new Error(`Error initiliazing logger - ${err}.`); } From 15179916251a04fd415558eb6eebf8328b1bbbd0 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 15:48:25 +0300 Subject: [PATCH 094/152] implemented custom loggers. --- node/config/default.yaml | 26 ++-- node/package-lock.json | 25 ---- node/package.json | 6 +- node/src/app.js | 2 +- node/src/homekit/plugin/logger.js | 101 ---------------- node/src/homekit/repository/accessory.js | 3 +- node/src/homekit/repository/platform.js | 3 +- node/src/lib/logger.js | 148 ----------------------- node/src/lib/logger/custom.js | 55 +++++++++ node/src/lib/logger/logger.js | 143 ++++++++++++++++++++++ node/src/lib/user.js | 2 +- 11 files changed, 217 insertions(+), 297 deletions(-) delete mode 100644 node/src/homekit/plugin/logger.js delete mode 100644 node/src/lib/logger.js create mode 100644 node/src/lib/logger/custom.js create mode 100644 node/src/lib/logger/logger.js diff --git a/node/config/default.yaml b/node/config/default.yaml index cf6b890..ed408eb 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -38,15 +38,17 @@ homekit: # Logging config. ############################ logging: - console: # console logging. - enabled: true # enable console log? - level: debug # minimum log level. - requests: true # log http requests? - file: # file logging. - enabled: true # enable loggin to file? - level: debug # minimum log level. - accesslog: true # enable access.log ? - errorlog: true # enable error.log? - plugin: # task specific logger. - enabled: true # enable the task speciffic loggers? - level: info # minimum log level \ No newline at end of file + master: + console: # console logging. + enabled: true # enable console log? + level: silly # minimum log level. + file: # file logging. + enabled: true # enable logging to file? + level: silly # minimum log level. + plugin: # per-plugin loggers + console: # console logging. + enabled: true # enable console log? + level: silly # minimum log level + file: # file logging. + enabled: true # enable logging to file? + level: silly # minimum log level. \ No newline at end of file diff --git a/node/package-lock.json b/node/package-lock.json index 8620a5e..9e1f740 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -347,11 +347,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, - "hirestime": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hirestime/-/hirestime-4.0.0.tgz", - "integrity": "sha512-hC55JfnXRLoCEdmAvwGk1IGXWt0CUox2LJ0WxjRTFjNoTK7Yi8EfOyTM7++9NeCchEW2Vqy0wg0SQddkY8PHYA==" - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -490,16 +485,6 @@ "minimist": "0.0.8" } }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "moment-duration-format": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", - "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -700,16 +685,6 @@ "winston-transport": "^4.3.0" } }, - "winston-console-format": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/winston-console-format/-/winston-console-format-1.0.5.tgz", - "integrity": "sha512-ZhjS3V91bm8d7PDGe02Dyfh6WJOi+M6gbeKzVqtgXuE+MA1lqKPclpNI05abVMkDBw3lmh6tc3IXkniJRs49CA==", - "requires": { - "colors": "^1.3.3", - "logform": "^2.1.2", - "triple-beam": "^1.3.0" - } - }, "winston-transport": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", diff --git a/node/package.json b/node/package.json index 98b1f27..b1c47cb 100644 --- a/node/package.json +++ b/node/package.json @@ -44,16 +44,12 @@ "fs-extra": "8.1.0", "global-dirs": "2.0.1", "hap-nodejs": "0.5.6", - "hirestime": "4.0.0", "js-yaml": "3.13.1", "lodash": "4.17.15", - "moment": "2.24.0", - "moment-duration-format": "2.3.2", "node-persist": "3.0.5", "qrcode-terminal": "0.12.0", "semver": "7.1.3", - "winston": "3.2.1", - "winston-console-format": "1.0.5" + "winston": "3.2.1" }, "engines": { "node": ">=13.7.0", diff --git a/node/src/app.js b/node/src/app.js index fd17a5b..ad82c56 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -29,7 +29,7 @@ const winston = require('winston'); const util = require('util'); const events = require('events'); const emitter = new events.EventEmitter(); -const logger = require('lib/logger'); +const logger = require('lib/logger/logger'); const packageInfo = require('../package.json'); const startup = async () => { diff --git a/node/src/homekit/plugin/logger.js b/node/src/homekit/plugin/logger.js deleted file mode 100644 index 3517c7a..0000000 --- a/node/src/homekit/plugin/logger.js +++ /dev/null @@ -1,101 +0,0 @@ - -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -'use strict'; - -const util = require('util'); -const winston = require('winston'); - -module.exports = { - Logger: Logger, - _system: new Logger() // system logger, for internal use only -} - -// global cache of logger instances by plugin name -var loggerCache = {}; - -/** - * Logger class - */ - -function Logger(prefix) { - this.prefix = prefix; -} - -Logger.prototype.debug = function(msg) { - this.log.apply(this, ['debug'].concat(Array.prototype.slice.call(arguments))); -} - -Logger.prototype.info = function(msg) { - this.log.apply(this, ['info'].concat(Array.prototype.slice.call(arguments))); -} - -Logger.prototype.warn = function(msg) { - this.log.apply(this, ['warn'].concat(Array.prototype.slice.call(arguments))); -} - -Logger.prototype.error = function(msg) { - this.log.apply(this, ['error'].concat(Array.prototype.slice.call(arguments))); -} - -Logger.prototype.log = function(level, msg) { - - msg = util.format.apply(util, Array.prototype.slice.call(arguments, 1)); - let func = winston.info; - - if (level == 'debug') { - func = winston.debug; - } - else if (level == 'verbose') { - func = winston.verbose; - } - else if (level == 'warn') { - func = winston.warn; - } - else if (level == 'error') { - func = winston.error; - } - - // prepend prefix if applicable - if (this.prefix) - msg = `[${this.prefix}] ${msg}`; - - func(msg); -} - -Logger.withPrefix = function(prefix) { - - if (!loggerCache[prefix]) { - // create a class-like logger thing that acts as a function as well - // as an instance of Logger. - var logger = new Logger(prefix); - var log = logger.info.bind(logger); - log.debug = logger.debug; - log.info = logger.info; - log.warn = logger.warn; - log.error = logger.error; - log.log = logger.log; - log.prefix = logger.prefix; - loggerCache[prefix] = log; - } - - return loggerCache[prefix]; -} \ No newline at end of file diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index 446ecfe..e92c1c9 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -23,7 +23,6 @@ const winston = require('winston'); const config = require('config'); -const Logger = require('homekit/plugin/logger').Logger; const uuid = require("hap-nodejs").uuid; const Accessory = require("hap-nodejs").Accessory; const Service = require("hap-nodejs").Service; @@ -52,7 +51,7 @@ module.exports = class AccessoryRepository { var ctor = await this._pluginApi.accessory(type); // get accessory's ctor. if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'accessoryrep'}); - var logger = Logger.withPrefix(`${type}:${name}`); // create logger for accessory. + const logger = require('lib/logger/logger').customLogger('accessory', type, name); // create custom logger for accessory var instance = new ctor(logger, accessoryConfig); // create an instance. var accessory = await this.createAccessory(instance, name, type, accessoryConfig.uuid_base); // create accessory. diff --git a/node/src/homekit/repository/platform.js b/node/src/homekit/repository/platform.js index e510d7a..ed6a21d 100644 --- a/node/src/homekit/repository/platform.js +++ b/node/src/homekit/repository/platform.js @@ -23,7 +23,6 @@ const winston = require('winston'); const config = require('config'); -const Logger = require('homekit/plugin/logger').Logger; const uuid = require("hap-nodejs").uuid; const Accessory = require("hap-nodejs").Accessory; const Service = require("hap-nodejs").Service; @@ -54,7 +53,7 @@ module.exports = class PlatformRepoistory { var ctor = await this._pluginApi.platform(type); // get platform's ctor. if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'platformrep'}); - var logger = Logger.withPrefix(`${type}:${name}`); // create logger for platform + const logger = require('lib/logger/logger').customLogger('platform', type, name); // create custom logger for platform var instance = new ctor(logger, platformConfig, this._pluginApi); if (instance.configureAccessory == undefined) diff --git a/node/src/lib/logger.js b/node/src/lib/logger.js deleted file mode 100644 index 352cf46..0000000 --- a/node/src/lib/logger.js +++ /dev/null @@ -1,148 +0,0 @@ - -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const config = require('config'); -const winston = require('winston'); -const moment = require('moment'); -const user = require('lib/user'); -const { format, info, transports } = require('winston'); -const { combine, cli, colorize, padLevels, timestamp, ms, label, splat, printf } = format; -require('moment-duration-format')(moment); -const hirestime = require('hirestime'); - -module.exports.initialize = async () => { - try { - // setup the logging directory and ensure it exists. - const logPath = path.join(__dirname, '../../../logs'); - fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename - - const masterFormat = printf((info) => { - let context = info.label ? ` [${info.label}] ` : '' - return `${info.timestamp} [${info.ms}] - ${info.level}:${context}${info.message}`; - }); - - const timeStamp = () => { - var date = new Date(); - return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)}`; - } - - // setup the console log if enabled. - if (config.logging.console.enabled) { - winston.add(new winston.transports.Console({ - level: 'silly', - format: combine( - timestamp({format: timeStamp}), - ms(), - label({ label: '' }), - colorize({ level: true }), - splat(), - masterFormat, - ) - })); - } - - // setup the server log if enabled. - if (config.logging.file.enabled) { - winston.add(new winston.transports.File({ - level: 'silly', - format: combine( - timestamp({format: timeStamp}), - ms(), - label({ label: '' }), - splat(), - masterFormat, - ), - filename: user.logPath() - })); - } - } catch (err) { - throw new Error(`Error initiliazing logger - ${err}.`); - } -}; - -module.exports.taskLogger = taskName => { - try { - const logger = createCustomLogger(taskName); // the custom winston logger. - let profiler = null; // the profiler. - - return { - log: logger, - started: function () { - // commit the start notice. - logger.info('---------------------------------------------'); - logger.info(`starting: ${moment.utc()}`); - logger.info('---------------------------------------------'); - - // start profiling. - profiler = hirestime(); - }, - finished: function (stats, fails = null) { - // end profiling. - const duration = profiler(); - const elapsed = moment.duration(duration).format(); - - // commit the end notice. - logger.info('---------------------------------------------'); - logger.info(`completed: in ${elapsed}..`, stats); - logger.info('---------------------------------------------'); - - // summarize fails if needed. - if (fails && fails.length > 0) { - logger.info('failed:'); - for (const entry of fails) { - logger.info(` - ${entry}`); - } - } - - return elapsed; // also return the elapsed time. - } - }; - } catch (err) { - throw new Error(`Error initiliazing task logger - ${err}.`); - } -}; - -const createCustomLogger = taskName => { - // setup the logging directory and ensure it exists. - const logPath = path.join(__dirname, '../../../logs/tasks'); - fs.existsSync(logPath) || fs.mkdirSync(logPath); // eslint-disable-line security/detect-non-literal-fs-filename - - const transports = []; - if (config.logging.task.enabled) - transports.push(new winston.transports.File({ - name: `${taskName}`, - filename: path.join(logPath, `/${taskName}.log`), - level: config.logging.task.level, - colorize: false, - json: false - })); - - const logger = new winston.Logger({ - transports: transports, - exitOnError: false - }); - - return logger; -}; diff --git a/node/src/lib/logger/custom.js b/node/src/lib/logger/custom.js new file mode 100644 index 0000000..acf8478 --- /dev/null +++ b/node/src/lib/logger/custom.js @@ -0,0 +1,55 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +module.exports = class CustomLogger { + constructor(logger) { + this.logger = logger; + } + + log = (level, msg) => { + if (msg === undefined) { + msg = level; + level = 'debug'; + } + + switch(level) { + default: + case 'debug': + this.logger.debug(msg); + break; + case 'info': + this.logger.info(msg); + break; + case 'warn': + this.logger.warn(msg); + break; + case 'error': + this.logger.error(msg); + break; + } + } + debug = (msg) => { this.logger.debug(msg); } + info = (msg) => { this.logger.info(msg); } + warn = (msg) => { this.logger.warn(msg); } + error = (msg) => { this.logger.error(msg); } +} \ No newline at end of file diff --git a/node/src/lib/logger/logger.js b/node/src/lib/logger/logger.js new file mode 100644 index 0000000..cef8648 --- /dev/null +++ b/node/src/lib/logger/logger.js @@ -0,0 +1,143 @@ + +// +// homer - The complete home automation for Homer Simpson. +// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com +// https://github.com/bonesoul/homer +// +// “Commons Clause” License Condition v1.0 +// +// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. +// +// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License +// does not grant to you, the right to Sell the Software. +// +// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide +// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support +// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality +// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License +// Condition notice. +// +// License: MIT License +// Licensor: Hüseyin Uslu +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const config = require('config'); +const winston = require('winston'); +const util = require('util'); +const user = require('lib/user'); +const CustomLogger = require('lib/logger/custom'); +const { format } = require('winston'); +const { combine, colorize, timestamp, ms, label, splat, printf } = format; + +module.exports.initialize = async () => { + try { + // make sure log path exists. + const logPath = user.logPath(); + fs.existsSync(logPath) || fs.mkdirSync(logPath, { recursive: true }); + + // setup the console log if enabled. + if (config.logging.master.console.enabled) { + winston.add(new winston.transports.Console({ + level: config.logging.master.console.level, + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: '' }), + colorize({ level: true }), + splat(), + logFormat, + ) + })); + } + + // setup the server log if enabled. + if (config.logging.master.file.enabled) { + winston.add(new winston.transports.File({ + level: config.logging.master.file.level, + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: '' }), + splat(), + logFormat, + ), + filename: path.join(logPath, 'homer.log') + })); + } + } catch (err) { + throw new Error(`Error initiliazing logger - ${err}.`); + } +}; + +module.exports.customLogger = (dir, type, name) => { + try { + const logger = createCustomLogger(dir, type, name); // the custom winston logger. + const customLoger = new CustomLogger(logger); + + var log = customLoger.info.bind(customLoger); + log.debug = customLoger.debug; + log.info = customLoger.info; + log.warn = customLoger.warn; + log.error = customLoger.error; + log.log = customLoger.log; + log.logger = customLoger.logger; + console.dir(log.logger) + return log; + } catch (err) { + throw new Error(`error initiliazing custom logger - ${err}.`); + } +}; + +const createCustomLogger = (dir, type, name) => { + // setup the logging directory and ensure it exists. + dir = dir.toLowerCase(); + type = type.toLowerCase(); + name = name.toLowerCase(); + const logPath = path.join(user.logPath(), dir, type); + fs.existsSync(logPath) || fs.mkdirSync(logPath, { recursive: true }); // eslint-disable-line security/detect-non-literal-fs-filename + + const logger = winston.createLogger({}); + + if (config.logging.plugin.console.enabled) { + logger.add(new winston.transports.Console({ + level: config.logging.master.console.level, + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: `${type}:${name}` }), + colorize({ level: true }), + splat(), + logFormat, + ) + })); + } + + if (config.logging.plugin.file.enabled) { + logger.add(new winston.transports.File({ + level: config.logging.master.file.level, + format: combine( + timestamp({format: timeStamp}), + ms(), + label({ label: `${type}:${name}` }), + splat(), + logFormat, + ), + filename: path.join(logPath, `${name}.log`) + })); + } + + return logger; +}; + +const timeStamp = () => { + var date = new Date(); + return `${date.getDate()}/${(date.getMonth() + 1)} ${date.toTimeString().substr(0, 8)}`; +} + +const logFormat = printf((info) => { + let context = info.label ? ` [${info.label}] ` : '' + return `${info.timestamp} [${info.ms}] - ${info.level}:${context}${info.message}`; +}); + diff --git a/node/src/lib/user.js b/node/src/lib/user.js index b9bad56..0259f08 100644 --- a/node/src/lib/user.js +++ b/node/src/lib/user.js @@ -29,7 +29,7 @@ module.exports.storagePath = () => { }; module.exports.logPath = () => { - return path.join(module.exports.storagePath(), `/logs/homer.log`) + return path.join(module.exports.storagePath(), `/logs/`) } module.exports.persistPath = () => { From 0c37893f61cd1eba45ca3aa0f71b3123e60a9ac2 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 16:05:47 +0300 Subject: [PATCH 095/152] improved pluggin loggers. --- node/src/homekit/repository/accessory.js | 2 +- node/src/homekit/repository/platform.js | 2 +- node/src/lib/logger/logger.js | 36 +++++++++++++------- node/src/lib/logger/{custom.js => plugin.js} | 20 +++++------ 4 files changed, 35 insertions(+), 25 deletions(-) rename node/src/lib/logger/{custom.js => plugin.js} (79%) diff --git a/node/src/homekit/repository/accessory.js b/node/src/homekit/repository/accessory.js index e92c1c9..b8ddb4b 100644 --- a/node/src/homekit/repository/accessory.js +++ b/node/src/homekit/repository/accessory.js @@ -51,7 +51,7 @@ module.exports = class AccessoryRepository { var ctor = await this._pluginApi.accessory(type); // get accessory's ctor. if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'accessoryrep'}); - const logger = require('lib/logger/logger').customLogger('accessory', type, name); // create custom logger for accessory + const logger = require('lib/logger/logger').pluginLogger('accessory', type, name); // create custom logger for accessory var instance = new ctor(logger, accessoryConfig); // create an instance. var accessory = await this.createAccessory(instance, name, type, accessoryConfig.uuid_base); // create accessory. diff --git a/node/src/homekit/repository/platform.js b/node/src/homekit/repository/platform.js index ed6a21d..7e93427 100644 --- a/node/src/homekit/repository/platform.js +++ b/node/src/homekit/repository/platform.js @@ -53,7 +53,7 @@ module.exports = class PlatformRepoistory { var ctor = await this._pluginApi.platform(type); // get platform's ctor. if (!ctor) throw new Error(`requested unregistered accessory ${type}`, { label: 'platformrep'}); - const logger = require('lib/logger/logger').customLogger('platform', type, name); // create custom logger for platform + const logger = require('lib/logger/logger').pluginLogger('platform', type, name); // create custom logger for platform var instance = new ctor(logger, platformConfig, this._pluginApi); if (instance.configureAccessory == undefined) diff --git a/node/src/lib/logger/logger.js b/node/src/lib/logger/logger.js index cef8648..0289008 100644 --- a/node/src/lib/logger/logger.js +++ b/node/src/lib/logger/logger.js @@ -27,7 +27,7 @@ const config = require('config'); const winston = require('winston'); const util = require('util'); const user = require('lib/user'); -const CustomLogger = require('lib/logger/custom'); +const PluginLogger = require('lib/logger/plugin'); const { format } = require('winston'); const { combine, colorize, timestamp, ms, label, splat, printf } = format; @@ -73,23 +73,33 @@ module.exports.initialize = async () => { module.exports.customLogger = (dir, type, name) => { try { - const logger = createCustomLogger(dir, type, name); // the custom winston logger. - const customLoger = new CustomLogger(logger); - - var log = customLoger.info.bind(customLoger); - log.debug = customLoger.debug; - log.info = customLoger.info; - log.warn = customLoger.warn; - log.error = customLoger.error; - log.log = customLoger.log; - log.logger = customLoger.logger; - console.dir(log.logger) - return log; + const logger = createCustomLogger(dir, type, name); + return logger; } catch (err) { throw new Error(`error initiliazing custom logger - ${err}.`); } }; +module.exports.pluginLogger = (dir, type, name) => { + try { + const logger = createCustomLogger(dir, type, name); + const pluginLogger = new PluginLogger(logger); + + // custom log api for homebridge plugin api; + var log = pluginLogger.info.bind(pluginLogger); + log.debug = pluginLogger.debug; + log.info = pluginLogger.info; + log.warn = pluginLogger.warn; + log.error = pluginLogger.error; + log.log = pluginLogger.log; + log.logger = pluginLogger.logger; + + return log; + } catch (err) { + throw new Error(`error initiliazing plugin logger - ${err}.`); + } +} + const createCustomLogger = (dir, type, name) => { // setup the logging directory and ensure it exists. dir = dir.toLowerCase(); diff --git a/node/src/lib/logger/custom.js b/node/src/lib/logger/plugin.js similarity index 79% rename from node/src/lib/logger/custom.js rename to node/src/lib/logger/plugin.js index acf8478..0d5d882 100644 --- a/node/src/lib/logger/custom.js +++ b/node/src/lib/logger/plugin.js @@ -21,9 +21,9 @@ // Licensor: Hüseyin Uslu 'use strict'; -module.exports = class CustomLogger { +module.exports = class PluginLogger { constructor(logger) { - this.logger = logger; + this._logger = logger; } log = (level, msg) => { @@ -35,21 +35,21 @@ module.exports = class CustomLogger { switch(level) { default: case 'debug': - this.logger.debug(msg); + this._logger.debug(msg); break; case 'info': - this.logger.info(msg); + this._logger.info(msg); break; case 'warn': - this.logger.warn(msg); + this._logger.warn(msg); break; case 'error': - this.logger.error(msg); + this._logger.error(msg); break; } } - debug = (msg) => { this.logger.debug(msg); } - info = (msg) => { this.logger.info(msg); } - warn = (msg) => { this.logger.warn(msg); } - error = (msg) => { this.logger.error(msg); } + debug = (msg) => { this._logger.debug(msg); } + info = (msg) => { this._logger.info(msg); } + warn = (msg) => { this._logger.warn(msg); } + error = (msg) => { this._logger.error(msg); } } \ No newline at end of file From 17407fd0a740e12963b990d110473498bbb261a8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 16:49:53 +0300 Subject: [PATCH 096/152] fixed plugin's splat logging. --- node/config/development.yaml | 5 ++- node/config/production.yaml | 12 +++--- node/config/test.yaml | 8 +--- node/src/lib/logger/logger.js | 19 +++------- node/src/lib/logger/plugin.js | 69 +++++++++++++++++++---------------- 5 files changed, 53 insertions(+), 60 deletions(-) diff --git a/node/config/development.yaml b/node/config/development.yaml index 0519ecb..49e8a0e 100644 --- a/node/config/development.yaml +++ b/node/config/development.yaml @@ -1 +1,4 @@ - \ No newline at end of file +logging: + plugin: + console: + level: warn \ No newline at end of file diff --git a/node/config/production.yaml b/node/config/production.yaml index ff59289..4ecc5af 100644 --- a/node/config/production.yaml +++ b/node/config/production.yaml @@ -1,8 +1,6 @@ logging: - console: - level: info - requests: false - file: - level: info - task: - level: info \ No newline at end of file + master: + console: + level: info + file: + level: info \ No newline at end of file diff --git a/node/config/test.yaml b/node/config/test.yaml index e3dcafa..0519ecb 100644 --- a/node/config/test.yaml +++ b/node/config/test.yaml @@ -1,7 +1 @@ -logging: - console: - enabled: true - requests: false - file: - enabled: true - level: debug \ No newline at end of file + \ No newline at end of file diff --git a/node/src/lib/logger/logger.js b/node/src/lib/logger/logger.js index 0289008..49ec2bf 100644 --- a/node/src/lib/logger/logger.js +++ b/node/src/lib/logger/logger.js @@ -71,19 +71,10 @@ module.exports.initialize = async () => { } }; -module.exports.customLogger = (dir, type, name) => { - try { - const logger = createCustomLogger(dir, type, name); - return logger; - } catch (err) { - throw new Error(`error initiliazing custom logger - ${err}.`); - } -}; - module.exports.pluginLogger = (dir, type, name) => { try { const logger = createCustomLogger(dir, type, name); - const pluginLogger = new PluginLogger(logger); + const pluginLogger = new PluginLogger.Logger(logger); // custom log api for homebridge plugin api; var log = pluginLogger.info.bind(pluginLogger); @@ -112,11 +103,11 @@ const createCustomLogger = (dir, type, name) => { if (config.logging.plugin.console.enabled) { logger.add(new winston.transports.Console({ - level: config.logging.master.console.level, + level: config.logging.plugin.console.level, format: combine( timestamp({format: timeStamp}), ms(), - label({ label: `${type}:${name}` }), + label({ label: `${dir}:${type}:${name}` }), colorize({ level: true }), splat(), logFormat, @@ -126,11 +117,11 @@ const createCustomLogger = (dir, type, name) => { if (config.logging.plugin.file.enabled) { logger.add(new winston.transports.File({ - level: config.logging.master.file.level, + level: config.logging.plugin.file.level, format: combine( timestamp({format: timeStamp}), ms(), - label({ label: `${type}:${name}` }), + label({ label: `${dir}:${type}:${name}` }), splat(), logFormat, ), diff --git a/node/src/lib/logger/plugin.js b/node/src/lib/logger/plugin.js index 0d5d882..f8d4bc2 100644 --- a/node/src/lib/logger/plugin.js +++ b/node/src/lib/logger/plugin.js @@ -21,35 +21,42 @@ // Licensor: Hüseyin Uslu 'use strict'; -module.exports = class PluginLogger { - constructor(logger) { - this._logger = logger; - } - - log = (level, msg) => { - if (msg === undefined) { - msg = level; - level = 'debug'; - } - - switch(level) { - default: - case 'debug': - this._logger.debug(msg); - break; - case 'info': - this._logger.info(msg); - break; - case 'warn': - this._logger.warn(msg); - break; - case 'error': - this._logger.error(msg); - break; - } - } - debug = (msg) => { this._logger.debug(msg); } - info = (msg) => { this._logger.info(msg); } - warn = (msg) => { this._logger.warn(msg); } - error = (msg) => { this._logger.error(msg); } +const util = require('util'); + +module.exports = { + Logger: Logger +} + +function Logger(logger) { + this.logger = logger; +} + +Logger.prototype.debug = function(msg) { + this.log.apply(this, ['debug'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.info = function(msg) { + this.log.apply(this, ['info'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.warn = function(msg) { + this.log.apply(this, ['warn'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.error = function(msg) { + this.log.apply(this, ['error'].concat(Array.prototype.slice.call(arguments))); +} + +Logger.prototype.log = function(level, msg) { + msg = util.format.apply(util, Array.prototype.slice.call(arguments, 1)); + let func = this.logger.info; + + if (level == 'debug') + func = this.logger.debug; + else if (level == 'warn') + func = this.logger.warn; + else if (level == 'error') + func = this.logger.error; + + func(msg); } \ No newline at end of file From b55a5c4035e05dfb1ccc5dbde8e9a0c52218895d Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 17:06:41 +0300 Subject: [PATCH 097/152] fix vscode internal terminal outputs. --- node/.vscode/launch.json | 10 ++++++++-- node/config/default.yaml | 6 ++++++ node/config/development.yaml | 2 +- node/src/app.js | 6 +++++- node/src/homekit/repository/platform.js | 7 +++---- node/src/lib/user.js | 6 +++++- 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/node/.vscode/launch.json b/node/.vscode/launch.json index 483a908..6254bf5 100644 --- a/node/.vscode/launch.json +++ b/node/.vscode/launch.json @@ -8,10 +8,16 @@ "type": "node", "request": "launch", "name": "Launch Program", + "program": "${workspaceFolder}\\src\\app.js", + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "NODE_ENV": "development" + }, "skipFiles": [ "/**" - ], - "program": "${workspaceFolder}\\src\\app.js" + ] } ] } \ No newline at end of file diff --git a/node/config/default.yaml b/node/config/default.yaml index ed408eb..aa47bf1 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -21,6 +21,12 @@ homekit: - user: bonesoul - player: "TV QE65Q70RATXTK" platforms: + - platform: config + name: Config + port: 8581, + auth: none, + theme: auto, + tempUnits: c - platform: Hue name: Hue lights: true diff --git a/node/config/development.yaml b/node/config/development.yaml index 49e8a0e..69a08fe 100644 --- a/node/config/development.yaml +++ b/node/config/development.yaml @@ -1,4 +1,4 @@ logging: plugin: console: - level: warn \ No newline at end of file + level: silly \ No newline at end of file diff --git a/node/src/app.js b/node/src/app.js index ad82c56..0fe5cd5 100644 --- a/node/src/app.js +++ b/node/src/app.js @@ -96,8 +96,12 @@ const gracefulExit = code => { process.exit(code); }; +process.on('uncaughtException', function(err) { + winston.error(err.stack, { label: 'app'}); +}) + process.on('unhandledRejection', (reason, promise) => { - winston.error(`possibly unhandled rejection at promise; ${util.inspect(promise)}`, { label: 'app'}); + winston.error(`unhandled rejection: ${util.inspect(promise)}`, { label: 'app'}); }); startup(); diff --git a/node/src/homekit/repository/platform.js b/node/src/homekit/repository/platform.js index 7e93427..6c80e8c 100644 --- a/node/src/homekit/repository/platform.js +++ b/node/src/homekit/repository/platform.js @@ -39,10 +39,9 @@ module.exports = class PlatformRepoistory { load = async () => { winston.verbose('loading platforms..', { label: 'platformrep'}); - - for (const entry of config.get('homekit.platforms')) { - await this._loadPlatform(entry); - } + for (const entry of config.get('homekit.platforms')) { + await this._loadPlatform(entry); + } } _loadPlatform = async(platformConfig) => { diff --git a/node/src/lib/user.js b/node/src/lib/user.js index 0259f08..43dbb4d 100644 --- a/node/src/lib/user.js +++ b/node/src/lib/user.js @@ -38,4 +38,8 @@ module.exports.persistPath = () => { module.exports.cachedAccessoryPath = () => { return path.join(module.exports.storagePath(), "accessories"); -}; \ No newline at end of file +}; + +module.exports.configPath = function() { + return path.join(module.exports.storagePath(), "local.json"); +} \ No newline at end of file From f70e7162b2b51e6cd9118325ce6a5e588ed0ca9c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 18:25:54 +0300 Subject: [PATCH 098/152] tiny change on confs. --- node/config/default.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/node/config/default.yaml b/node/config/default.yaml index aa47bf1..710600c 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -27,6 +27,10 @@ homekit: auth: none, theme: auto, tempUnits: c + noFork: true + logs: + method: file + path: C:/Users/shala/.homer/logs/homer.log - platform: Hue name: Hue lights: true From 73b3f5adbec0a85de3dfc572deae945f3cf3eedf Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Wed, 12 Feb 2020 18:37:40 +0300 Subject: [PATCH 099/152] tiny change on default.yaml. --- node/config/default.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/node/config/default.yaml b/node/config/default.yaml index 710600c..2bffe6e 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -27,7 +27,6 @@ homekit: auth: none, theme: auto, tempUnits: c - noFork: true logs: method: file path: C:/Users/shala/.homer/logs/homer.log From be2f71535feabd5b87f5c67559af66d05965a25a Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 21:36:42 +0300 Subject: [PATCH 100/152] moved custom config to local.yaml. --- node/config/default.yaml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/node/config/default.yaml b/node/config/default.yaml index 2bffe6e..e261edb 100644 --- a/node/config/default.yaml +++ b/node/config/default.yaml @@ -9,39 +9,6 @@ homekit: pin: 069-39-561 port: 25777 insecure: true # allow insecure access? - accessories: - - accessory: SamsungTV - name: UE42 - ip_address: 10.0.0.32 - - accessory: Plex - name: Plex - plex_token: CYjxgRwttBuPjChZH6ty - debug: true - filter: - - user: bonesoul - - player: "TV QE65Q70RATXTK" - platforms: - - platform: config - name: Config - port: 8581, - auth: none, - theme: auto, - tempUnits: c - logs: - method: file - path: C:/Users/shala/.homer/logs/homer.log - - platform: Hue - name: Hue - lights: true - forceCt: true - nativeHomeKitLights: false - nativeHomeKitSensors: true - nupnp: true - resource: true - sensors: false - anyOn: true - users: - 001788FFFE4E4B97: iNPI0C1c3B8TRQjYIXWSfGR7umtIPr9gSYhssmp4 ############################ # Logging config. From fef7255ad7dd3bf9f40fed7e6dd72bf4d1898ac1 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 21:37:54 +0300 Subject: [PATCH 101/152] moved node-prototype to contrib/node-prototype. --- {node => contrib/nodejs-prototype}/.eslintrc.yaml | 0 {node => contrib/nodejs-prototype}/.vscode/launch.json | 0 {node => contrib/nodejs-prototype}/config/.gitignore | 0 {node => contrib/nodejs-prototype}/config/default.yaml | 0 {node => contrib/nodejs-prototype}/config/development.yaml | 0 {node => contrib/nodejs-prototype}/config/production.yaml | 0 {node => contrib/nodejs-prototype}/config/test.yaml | 0 {node => contrib/nodejs-prototype}/package-lock.json | 0 {node => contrib/nodejs-prototype}/package.json | 0 {node => contrib/nodejs-prototype}/src/app.js | 0 {node => contrib/nodejs-prototype}/src/homekit/homekit.js | 0 .../nodejs-prototype}/src/homekit/plugin/api/homebridge/api.js | 0 .../nodejs-prototype}/src/homekit/plugin/api/versions.js | 0 {node => contrib/nodejs-prototype}/src/homekit/plugin/manager.js | 0 {node => contrib/nodejs-prototype}/src/homekit/plugin/plugin.js | 0 .../nodejs-prototype}/src/homekit/repository/accessory.js | 0 .../nodejs-prototype}/src/homekit/repository/platform.js | 0 {node => contrib/nodejs-prototype}/src/homekit/server.js | 0 {node => contrib/nodejs-prototype}/src/lib/env.js | 0 {node => contrib/nodejs-prototype}/src/lib/logger/logger.js | 0 {node => contrib/nodejs-prototype}/src/lib/logger/plugin.js | 0 {node => contrib/nodejs-prototype}/src/lib/user.js | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename {node => contrib/nodejs-prototype}/.eslintrc.yaml (100%) rename {node => contrib/nodejs-prototype}/.vscode/launch.json (100%) rename {node => contrib/nodejs-prototype}/config/.gitignore (100%) rename {node => contrib/nodejs-prototype}/config/default.yaml (100%) rename {node => contrib/nodejs-prototype}/config/development.yaml (100%) rename {node => contrib/nodejs-prototype}/config/production.yaml (100%) rename {node => contrib/nodejs-prototype}/config/test.yaml (100%) rename {node => contrib/nodejs-prototype}/package-lock.json (100%) rename {node => contrib/nodejs-prototype}/package.json (100%) rename {node => contrib/nodejs-prototype}/src/app.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/homekit.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/plugin/api/homebridge/api.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/plugin/api/versions.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/plugin/manager.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/plugin/plugin.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/repository/accessory.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/repository/platform.js (100%) rename {node => contrib/nodejs-prototype}/src/homekit/server.js (100%) rename {node => contrib/nodejs-prototype}/src/lib/env.js (100%) rename {node => contrib/nodejs-prototype}/src/lib/logger/logger.js (100%) rename {node => contrib/nodejs-prototype}/src/lib/logger/plugin.js (100%) rename {node => contrib/nodejs-prototype}/src/lib/user.js (100%) diff --git a/node/.eslintrc.yaml b/contrib/nodejs-prototype/.eslintrc.yaml similarity index 100% rename from node/.eslintrc.yaml rename to contrib/nodejs-prototype/.eslintrc.yaml diff --git a/node/.vscode/launch.json b/contrib/nodejs-prototype/.vscode/launch.json similarity index 100% rename from node/.vscode/launch.json rename to contrib/nodejs-prototype/.vscode/launch.json diff --git a/node/config/.gitignore b/contrib/nodejs-prototype/config/.gitignore similarity index 100% rename from node/config/.gitignore rename to contrib/nodejs-prototype/config/.gitignore diff --git a/node/config/default.yaml b/contrib/nodejs-prototype/config/default.yaml similarity index 100% rename from node/config/default.yaml rename to contrib/nodejs-prototype/config/default.yaml diff --git a/node/config/development.yaml b/contrib/nodejs-prototype/config/development.yaml similarity index 100% rename from node/config/development.yaml rename to contrib/nodejs-prototype/config/development.yaml diff --git a/node/config/production.yaml b/contrib/nodejs-prototype/config/production.yaml similarity index 100% rename from node/config/production.yaml rename to contrib/nodejs-prototype/config/production.yaml diff --git a/node/config/test.yaml b/contrib/nodejs-prototype/config/test.yaml similarity index 100% rename from node/config/test.yaml rename to contrib/nodejs-prototype/config/test.yaml diff --git a/node/package-lock.json b/contrib/nodejs-prototype/package-lock.json similarity index 100% rename from node/package-lock.json rename to contrib/nodejs-prototype/package-lock.json diff --git a/node/package.json b/contrib/nodejs-prototype/package.json similarity index 100% rename from node/package.json rename to contrib/nodejs-prototype/package.json diff --git a/node/src/app.js b/contrib/nodejs-prototype/src/app.js similarity index 100% rename from node/src/app.js rename to contrib/nodejs-prototype/src/app.js diff --git a/node/src/homekit/homekit.js b/contrib/nodejs-prototype/src/homekit/homekit.js similarity index 100% rename from node/src/homekit/homekit.js rename to contrib/nodejs-prototype/src/homekit/homekit.js diff --git a/node/src/homekit/plugin/api/homebridge/api.js b/contrib/nodejs-prototype/src/homekit/plugin/api/homebridge/api.js similarity index 100% rename from node/src/homekit/plugin/api/homebridge/api.js rename to contrib/nodejs-prototype/src/homekit/plugin/api/homebridge/api.js diff --git a/node/src/homekit/plugin/api/versions.js b/contrib/nodejs-prototype/src/homekit/plugin/api/versions.js similarity index 100% rename from node/src/homekit/plugin/api/versions.js rename to contrib/nodejs-prototype/src/homekit/plugin/api/versions.js diff --git a/node/src/homekit/plugin/manager.js b/contrib/nodejs-prototype/src/homekit/plugin/manager.js similarity index 100% rename from node/src/homekit/plugin/manager.js rename to contrib/nodejs-prototype/src/homekit/plugin/manager.js diff --git a/node/src/homekit/plugin/plugin.js b/contrib/nodejs-prototype/src/homekit/plugin/plugin.js similarity index 100% rename from node/src/homekit/plugin/plugin.js rename to contrib/nodejs-prototype/src/homekit/plugin/plugin.js diff --git a/node/src/homekit/repository/accessory.js b/contrib/nodejs-prototype/src/homekit/repository/accessory.js similarity index 100% rename from node/src/homekit/repository/accessory.js rename to contrib/nodejs-prototype/src/homekit/repository/accessory.js diff --git a/node/src/homekit/repository/platform.js b/contrib/nodejs-prototype/src/homekit/repository/platform.js similarity index 100% rename from node/src/homekit/repository/platform.js rename to contrib/nodejs-prototype/src/homekit/repository/platform.js diff --git a/node/src/homekit/server.js b/contrib/nodejs-prototype/src/homekit/server.js similarity index 100% rename from node/src/homekit/server.js rename to contrib/nodejs-prototype/src/homekit/server.js diff --git a/node/src/lib/env.js b/contrib/nodejs-prototype/src/lib/env.js similarity index 100% rename from node/src/lib/env.js rename to contrib/nodejs-prototype/src/lib/env.js diff --git a/node/src/lib/logger/logger.js b/contrib/nodejs-prototype/src/lib/logger/logger.js similarity index 100% rename from node/src/lib/logger/logger.js rename to contrib/nodejs-prototype/src/lib/logger/logger.js diff --git a/node/src/lib/logger/plugin.js b/contrib/nodejs-prototype/src/lib/logger/plugin.js similarity index 100% rename from node/src/lib/logger/plugin.js rename to contrib/nodejs-prototype/src/lib/logger/plugin.js diff --git a/node/src/lib/user.js b/contrib/nodejs-prototype/src/lib/user.js similarity index 100% rename from node/src/lib/user.js rename to contrib/nodejs-prototype/src/lib/user.js From 3306a8e545969e5d23d0bd67bf18690a1167a938 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 22:15:02 +0300 Subject: [PATCH 102/152] identifier cache work. --- src/homer/Servers/Server.cs | 4 +- .../homekit/Accessories/AccessoryBase.cs | 14 ++--- .../Caches/Identifiers/IIdentifierCache.cs | 8 +-- .../Caches/Identifiers/IdentifierCache.cs | 53 ++++++++++++++----- .../homekit/Characteristics/Characteristic.cs | 15 +++--- .../Characteristics/ICharacteristic.cs | 2 +- src/platforms/homekit/Services/IService.cs | 2 +- src/platforms/homekit/Services/Service.cs | 15 +++--- 8 files changed, 73 insertions(+), 40 deletions(-) diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 1e5895b..197cce8 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -34,9 +34,9 @@ namespace Homer.Servers { public class Server : IServer { - private IConfigurationService _configurationService; + private readonly IConfigurationService _configurationService; - private ILogger _logger; + private readonly ILogger _logger; public Server(IConfigurationService configurationService) { diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index 225f897..e540d04 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -148,18 +148,18 @@ public void LogAccessorySummary() /// public void AssignIds(IIdentifierCache identifierCache) { - if (!IsBridged && this is IBridge) - { - // as we are the bridge, we must have id = 1. - AccessoryId = 1; - } + if (identifierCache == null) throw new ArgumentNullException(nameof(identifierCache)); + + AccessoryId = this is IBridge + ? 1 // as we are the bridge, we must have id = 1. + : identifierCache.GetInstanceIdForAccessory(this); // as we are bridged, get an id from the identfier cache. foreach (var (_, service) in Services) { if (this is IBridge) - service.AssignIds(IdentifierCache, this, 2000000000); + service.AssignInstanceId(IdentifierCache, this, 2000000000); else - service.AssignIds(identifierCache, this); + service.AssignInstanceId(identifierCache, this); } } } diff --git a/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs b/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs index 4809a8e..834b7a0 100644 --- a/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs +++ b/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs @@ -19,10 +19,12 @@ public interface IIdentifierCache IReadOnlyDictionary Cache { get; } - IReadOnlyDictionary UsedCache { get; } - string SavedCacheHash { get; } - string GetInstanceId(IAccessoryBase accessory, IService service, ICharacteristic characteristic); + int GetInstanceIdForAccessory(IAccessoryBase accessory); + + int GetInstanceIdForService(IAccessoryBase accessory, IService service); + + int GetInstanceIdForCharacteristic(IAccessoryBase accessory, IService service, ICharacteristic characteristic); } } diff --git a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs index fe8d957..b0d794f 100644 --- a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs +++ b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs @@ -13,33 +13,62 @@ public class IdentifierCache : IIdentifierCache public IReadOnlyDictionary Cache { get; } - public IReadOnlyDictionary UsedCache { get; } - public string SavedCacheHash { get; } private Dictionary _cache; - private Dictionary _usedCache; - public IdentifierCache(dynamic info) { _cache = new Dictionary(); - _usedCache = new Dictionary(); - Cache = new ReadOnlyDictionary(_cache); - UsedCache = new ReadOnlyDictionary(_usedCache); Username = info.username; SavedCacheHash = ""; } - public string GetInstanceId(IAccessoryBase accessory, IService service, ICharacteristic characteristic) + public int InstanceIdForAccessory(IAccessoryBase accessory) + { + if (accessory == null) throw new ArgumentNullException(nameof(accessory)); + + var key = accessory.Uuid; + return GetCache(key).HasValue + ? GetCache(key).Value + : SetCache(key, _cache.Count + 1); + } + + public int GetInstanceIdForService(IAccessoryBase accessory, IService service) + { + if (accessory == null) throw new ArgumentNullException(nameof(accessory)); + if (service == null) throw new ArgumentNullException(nameof(service)); + + var key = $"{accessory.Uuid}|{service.Uuid}"; + return GetCache(key).HasValue + ? GetCache(key).Value + : SetCache(key, _cache.Count + 1); + } + + public int GetInstanceIdForCharacteristic(IAccessoryBase accessory, IService service, ICharacteristic characteristic) { - if (accessory == null) throw new ArgumentNullException(nameof(characteristic)); - if (service == null) throw new ArgumentNullException(nameof(characteristic)); + if (accessory == null) throw new ArgumentNullException(nameof(accessory)); + if (service == null) throw new ArgumentNullException(nameof(service)); if (characteristic == null) throw new ArgumentNullException(nameof(characteristic)); - return $"{accessory.Uuid}|{service.Uuid}|{characteristic.Uuid}"; -; } + var key = $"{accessory.Uuid}|{service.Uuid}|{characteristic.Uuid}"; + return GetCache(key).HasValue + ? GetCache(key).Value + : SetCache(key, _cache.Count + 1); + } + + private int? GetCache(string key) + { + if (_cache.ContainsKey(key)) return _cache[key]; + return null; + } + + private int SetCache(string key, int value) + { + _cache[key] = value; + return value; + } } } diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index bdf3b1b..87f156d 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -41,7 +41,7 @@ public class Characteristic : EventEmitter, ICharacteristic, ICharacteristicProp public UUID Uuid { get; } /// - public int InstanceId { get; } + public int InstanceId { get; private set; } /// public string DisplayName { get; } @@ -190,17 +190,16 @@ public string ToHapJson() throw new NotImplementedException(); } - public void AssignId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service) - { - throw new NotImplementedException(); - } - - private void ValidateValue(dynamic value) + public void AssignInstanceId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service) { + if (identifierCache == null) throw new ArgumentNullException(nameof(identifierCache)); + if (accessory == null) throw new ArgumentNullException(nameof(accessory)); + if (service == null) throw new ArgumentNullException(nameof(service)); + InstanceId = identifierCache.GetInstanceIdForCharacteristic(accessory, service, this); } - private void AssignInstanceId() + private void ValidateValue(dynamic value) { } diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index 053da8b..ad43ffb 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -121,6 +121,6 @@ public interface ICharacteristic string ToHapJson(); - void AssignId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service); + void AssignInstanceId(IIdentifierCache identifierCache, IAccessoryBase accessory, IService service); } } diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 5e3bbe1..7ba5372 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -147,6 +147,6 @@ public interface IService: IEntity string ToHapJson(); - void AssignIds(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0); + void AssignInstanceId(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0); } } diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index d3ad30f..ee4a762 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -233,16 +233,19 @@ public string ToHapJson() return ""; } - public void AssignIds(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0) + public void AssignInstanceId(IIdentifierCache identifierCache, IAccessoryBase accessory, int baseInstanceId = 0) { - // Accessory Information service must have a (reserved by IdentifierCache) ID of 1 - if (Uuid == AccessoryInformationService.Uuid) - InstanceId = 1; + if (identifierCache == null) throw new ArgumentNullException(nameof(identifierCache)); + if (accessory == null) throw new ArgumentNullException(nameof(accessory)); - // assign id's to characteristics. + InstanceId = Uuid == AccessoryInformationService.Uuid + ? 1 // Accessory Information service must have a (reserved by IdentifierCache) ID of 1 + : baseInstanceId + identifierCache.GetInstanceIdForService(accessory, this); + + // assign ids to it's characteristics too. foreach (var (_, characteristic) in this.Characteristics) { - characteristic.AssignId(identifierCache, accessory, this); + characteristic.AssignInstanceId(identifierCache, accessory, this); } } } From 175123b5ea9daa08c144ea4b165c1d028f1b1290 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 22:15:29 +0300 Subject: [PATCH 103/152] fixed typo. --- src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs index b0d794f..123682f 100644 --- a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs +++ b/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs @@ -26,7 +26,7 @@ public IdentifierCache(dynamic info) SavedCacheHash = ""; } - public int InstanceIdForAccessory(IAccessoryBase accessory) + public int GetInstanceIdForAccessory(IAccessoryBase accessory) { if (accessory == null) throw new ArgumentNullException(nameof(accessory)); From 771983cd91b84384390772e821a0d5a8e8ae70a8 Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 22:28:28 +0300 Subject: [PATCH 104/152] removed unused bridgesetupmanager for now. --- src/homer/Servers/Server.cs | 4 +- src/platforms/homekit/Bridges/Bridge.cs | 28 ++++++- .../Bridges/Setup/BridgeSetupManager.cs | 84 ------------------- .../ControlPointCharacteristic.cs | 44 ---------- .../Characteristics/StateCharacteristic.cs | 43 ---------- .../Characteristics/VersionCharacteristic.cs | 43 ---------- .../Bridges/Setup/Setup/SetupService.cs | 35 -------- 7 files changed, 28 insertions(+), 253 deletions(-) delete mode 100644 src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs delete mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs delete mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs delete mode 100644 src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs delete mode 100644 src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs diff --git a/src/homer/Servers/Server.cs b/src/homer/Servers/Server.cs index 197cce8..1b26cee 100644 --- a/src/homer/Servers/Server.cs +++ b/src/homer/Servers/Server.cs @@ -25,7 +25,7 @@ using System.Linq; using System.Threading.Tasks; using Homer.Core.Internals.Services.Configuration; -using Homer.Platform.HomeKit.Bridges.Setup; +using Homer.Platform.HomeKit.Bridges; using Makaretu.Dns; using Serilog; using uuid.net.Static_Classes.UUID_Factory; @@ -54,7 +54,7 @@ public async Task RunAsync() var generator = UUIDFactory.CreateGenerator(5, 1); var uuid = generator.Generate("homer"); - var bridge = new BridgeSetupManager(uuid, "homer", _configurationService); + var bridge = new Bridge(uuid, "homer", _configurationService); var mdns = new MulticastService(); diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index b130dc7..972b078 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -21,14 +21,20 @@ // Licensor: Hüseyin Uslu #endregion +using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Dynamic; +using Homer.Core.Internals.Services.Configuration; using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Characteristics.Definitions; +using Homer.Platform.HomeKit.Services.Definitions; namespace Homer.Platform.HomeKit.Bridges { public class Bridge : AccessoryBase, IBridge { + const int MaxAccessories = 149; // Maximum number of bridged accessories per bridge. /// @@ -39,12 +45,30 @@ public class Bridge : AccessoryBase, IBridge ///
private readonly List _accessories; - protected Bridge(string uuid, string displayName, bool isReachable = true) + private IConfigurationService _configurationService; + + public Bridge(string uuid, string displayName, IConfigurationService configurationService, bool isReachable = true) : base(uuid, displayName, false, isReachable, AccessoryCategory.Bridge) { - _accessories = new List(); + _configurationService = configurationService ?? throw new ArgumentNullException(nameof(configurationService)); + _accessories = new List(); Accessories = new ReadOnlyCollection(_accessories); + + // set accessory information service characteristics + GetService(typeof(AccessoryInformationService)) + .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") + .SetCharacteristic(typeof(ModelCharacteristic), "Homer") + .SetCharacteristic(typeof(SerialNumberCharacteristic), _configurationService.Configuration.Platforms.Homekit.Setup.Serial) + .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); + + dynamic info = new ExpandoObject(); + info.username = _configurationService.Configuration.Platforms.Homekit.Setup.Serial; + info.port = _configurationService.Configuration.Platforms.Homekit.Setup.Port; + info.pin = _configurationService.Configuration.Platforms.Homekit.Setup.Pin; + info.category = Category; + + Publish(info, _configurationService.Configuration.Platforms.Homekit.Setup.Insecure); } } } diff --git a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs b/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs deleted file mode 100644 index ead625b..0000000 --- a/src/platforms/homekit/Bridges/Setup/BridgeSetupManager.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - -using System; -using System.Dynamic; -using Homer.Core.Internals.Services.Configuration; -using Homer.Platform.HomeKit.Bridges.Setup.Characteristics; -using Homer.Platform.HomeKit.Bridges.Setup.Setup; -using Homer.Platform.HomeKit.Characteristics.Definitions; -using Homer.Platform.HomeKit.Services.Definitions; -using VersionCharacteristic = Homer.Platform.HomeKit.Bridges.Setup.Characteristics.VersionCharacteristic; - -namespace Homer.Platform.HomeKit.Bridges.Setup -{ - public class BridgeSetupManager : Bridge - { - private IConfigurationService _configurationService; - - public BridgeSetupManager(string uuid, string displayName, IConfigurationService configurationService) - : base(uuid, displayName) - { - _configurationService = configurationService ?? throw new ArgumentNullException(nameof(configurationService)); - - // create handler characteristic. - var controlPointCharacteristic = new ControlPointCharacteristic(); - controlPointCharacteristic.Get += HandleReadRequest; - controlPointCharacteristic.Set += HandleWriteRequest; - - // add characteristics to setup service. - - // create setup service. - AddService(new SetupService()) - .AddCharacteristic(new StateCharacteristic(0)) - .AddCharacteristic(new VersionCharacteristic("1.0")) - .AddCharacteristic(controlPointCharacteristic); - - // set accessory information service characteristics - GetService(typeof(AccessoryInformationService)) - .SetCharacteristic(typeof(ManufacturerCharacteristic), "Hüseyin Uslu") - .SetCharacteristic(typeof(ModelCharacteristic), "Homer") - .SetCharacteristic(typeof(SerialNumberCharacteristic), _configurationService.Configuration.Platforms.Homekit.Setup.Serial) - .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); - - dynamic info = new ExpandoObject(); - info.username = _configurationService.Configuration.Platforms.Homekit.Setup.Serial; - info.port = _configurationService.Configuration.Platforms.Homekit.Setup.Port; - info.pin = _configurationService.Configuration.Platforms.Homekit.Setup.Pin; - info.category = Category; - - Publish(info, _configurationService.Configuration.Platforms.Homekit.Setup.Insecure); - } - - - private void HandleReadRequest(object sender, EventArgs e) - { - throw new NotImplementedException(); - } - - private void HandleWriteRequest(object sender, EventArgs e) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs deleted file mode 100644 index 1db8157..0000000 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/ControlPointCharacteristic.cs +++ /dev/null @@ -1,44 +0,0 @@ -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - -using System.Collections.Generic; -using Homer.Platform.HomeKit.Characteristics; - -namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics -{ - public class ControlPointCharacteristic: Characteristic - { - public ControlPointCharacteristic() : base( - "5819A4C2-E1B0-4C9D-B761-3EB1AFF43073", - "Control Point", - CharacteristicFormat.Data, - new List() - { - CharacteristicPermission.PairedRead, - CharacteristicPermission.WriteResponse, - CharacteristicPermission.Events - }, value: null) - { - } - } -} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs deleted file mode 100644 index f06a8f5..0000000 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/StateCharacteristic.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - -using System.Collections.Generic; -using Homer.Platform.HomeKit.Characteristics; - -namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics -{ - public class StateCharacteristic: Characteristic - { - public StateCharacteristic(byte value) : base( - "77474A2F-FA98-485E-97BE-4762458774D8", - "State", - CharacteristicFormat.Uint8, - new List() - { - CharacteristicPermission.PairedRead, - CharacteristicPermission.Events - }, minValue: 0, maxValue: 1, minStep: 1, value: value) - { - } - } -} diff --git a/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs b/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs deleted file mode 100644 index ed239f8..0000000 --- a/src/platforms/homekit/Bridges/Setup/Characteristics/VersionCharacteristic.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - -using System.Collections.Generic; -using Homer.Platform.HomeKit.Characteristics; - -namespace Homer.Platform.HomeKit.Bridges.Setup.Characteristics -{ - public class VersionCharacteristic : Characteristic - { - public VersionCharacteristic(string value) : base( - "FD9FE4CC-D06F-4FFE-96C6-595D464E1026", - "Version", - CharacteristicFormat.String, - new List() - { - CharacteristicPermission.PairedRead, - CharacteristicPermission.Events - }, value: value) - { - } - } -} diff --git a/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs b/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs deleted file mode 100644 index 992756e..0000000 --- a/src/platforms/homekit/Bridges/Setup/Setup/SetupService.cs +++ /dev/null @@ -1,35 +0,0 @@ -#region license -// -// homer - The complete home automation for Homer Simpson. -// Copyright (C) 2020, Hüseyin Uslu - shalafiraistlin at gmail dot com -// https://github.com/bonesoul/homer -// -// “Commons Clause” License Condition v1.0 -// -// The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. -// -// Without limiting other conditions in the License, the grant of rights under the License will not include, and the License -// does not grant to you, the right to Sell the Software. -// -// For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide -// to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support -// services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality -// of the Software.Any license notice or attribution required by the License must also include this Commons Clause License -// Condition notice. -// -// License: MIT License -// Licensor: Hüseyin Uslu -#endregion - -using Homer.Platform.HomeKit.Services; - -namespace Homer.Platform.HomeKit.Bridges.Setup.Setup -{ - public class SetupService : Service - { - public SetupService() - : base("49FB9D4D-0FEA-4BF1-8FA6-E7B18AB86DCE", "Setup") - { - } - } -} From 7a2620b6abcb32e69547c6d8fe1797aa054bff8c Mon Sep 17 00:00:00 2001 From: bonesoul Date: Wed, 12 Feb 2020 22:44:18 +0300 Subject: [PATCH 105/152] bridge & accessorybase clean-up. --- .../homekit/Accessories/AccessoryBase.cs | 76 ++----------------- .../homekit/Accessories/IAccessoryBase.cs | 15 ---- .../homekit/Accessories/Info/AccessoryInfo.cs | 1 - .../homekit/Accessories/Info/IAcessoryInfo.cs | 4 +- src/platforms/homekit/Bridges/Bridge.cs | 59 ++++++++++++++ src/platforms/homekit/Bridges/IBridge.cs | 9 +++ .../homekit/Characteristics/Characteristic.cs | 1 - .../Characteristics/ICharacteristic.cs | 1 - src/platforms/homekit/Services/IService.cs | 1 - src/platforms/homekit/Services/Service.cs | 1 - 10 files changed, 76 insertions(+), 92 deletions(-) diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/src/platforms/homekit/Accessories/AccessoryBase.cs index e540d04..2a333ce 100644 --- a/src/platforms/homekit/Accessories/AccessoryBase.cs +++ b/src/platforms/homekit/Accessories/AccessoryBase.cs @@ -25,10 +25,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using Homer.Platform.HomeKit.Accessories.Info; -using Homer.Platform.HomeKit.Bridges; -using Homer.Platform.HomeKit.Caches; -using Homer.Platform.HomeKit.Caches.Identifiers; -using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Services; using Homer.Platform.HomeKit.Services.Definitions; @@ -44,7 +40,7 @@ public class AccessoryBase : IAccessoryBase public string DisplayName { get; } - public int? AccessoryId { get; private set; } + public int? AccessoryId { get; protected set; } public bool IsBridged { get; } @@ -54,29 +50,24 @@ public class AccessoryBase : IAccessoryBase public IReadOnlyDictionary Services { get; } - public IAccessoryInfo AccessoryInfo { get; private set; } - - public IIdentifierCache IdentifierCache { get; private set; } + public IAccessoryInfo AccessoryInfo { get; protected set; } public ILogger Logger { get; protected set; } - public ILogger AccessoryLogger { get; protected set; } - /// /// internal list of services. /// - private Dictionary _services; + private readonly Dictionary _services; protected AccessoryBase(string uuid, string displayName, bool isBridged, bool isReachable, AccessoryCategory category) { - Uuid = uuid ?? throw new ArgumentException("Must be created with a valid UUID.", nameof(uuid)); + Uuid = uuid ?? throw new ArgumentNullException(nameof(uuid)); if (!UUIDValidator.IsValidUUID(Uuid)) throw new ArgumentException("Provided UUID is not valid.", nameof(uuid)); - - if (!string.IsNullOrEmpty(displayName)) DisplayName = displayName; - else throw new ArgumentException("Must be created with a non-empty displayName.", nameof(displayName)); + if (string.IsNullOrEmpty(displayName)) throw new ArgumentException(nameof(displayName)); Logger = Log.ForContext(); + DisplayName = displayName; AccessoryId = null; IsBridged = isBridged; IsReachable = isReachable; @@ -92,6 +83,7 @@ protected AccessoryBase(string uuid, string displayName, bool isBridged, bool is .SetCharacteristic(typeof(SerialNumberCharacteristic), "Default-SerialNumber") .SetCharacteristic(typeof(FirmwareRevisionCharacteristic), "0.1"); + // needed for publishing.. AddService(new ProtocolInformationService()) .SetCharacteristic(typeof(VersionCharacteristic), "1.1.0"); } @@ -108,59 +100,5 @@ public IService GetService(Type service) { return _services.ContainsKey(service) ? _services[service] : null; } - - public void Publish(dynamic info, bool allowInsecureAccess = false) - { - AccessoryInfo = new AccessoryInfo(this, info); - IdentifierCache = new IdentifierCache(info); - AssignIds(IdentifierCache); - - LogAccessorySummary(); - } - - public void LogAccessorySummary() - { - Logger.Verbose("[{Type}] name: {Name}", this.GetType().Name, DisplayName); - Logger.Verbose("-------------------------------------------------"); - Logger.Verbose("uuid: {Uuid}", Uuid); - Logger.Verbose("accessory id: {Aid}", AccessoryId); - - foreach (var (key, service) in _services) - { - Logger.Verbose("service: [{Type}]", key.Name); - - foreach (var (type, characteristic) in service.Characteristics) - { - Logger.Verbose("characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); - } - - foreach (var (type, characteristic) in service.OptionalCharacteristics) - { - Logger.Verbose("optional characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); - } - } - } - - /// - /// Assigns aid/iid to ourselves, any Accessories we are bridging, and all associated Services+Characteristics. Uses - /// the provided identifierCache to keep IDs stable. - /// - /// - public void AssignIds(IIdentifierCache identifierCache) - { - if (identifierCache == null) throw new ArgumentNullException(nameof(identifierCache)); - - AccessoryId = this is IBridge - ? 1 // as we are the bridge, we must have id = 1. - : identifierCache.GetInstanceIdForAccessory(this); // as we are bridged, get an id from the identfier cache. - - foreach (var (_, service) in Services) - { - if (this is IBridge) - service.AssignInstanceId(IdentifierCache, this, 2000000000); - else - service.AssignInstanceId(identifierCache, this); - } - } } } diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/src/platforms/homekit/Accessories/IAccessoryBase.cs index ff4f2e7..880b074 100644 --- a/src/platforms/homekit/Accessories/IAccessoryBase.cs +++ b/src/platforms/homekit/Accessories/IAccessoryBase.cs @@ -24,8 +24,6 @@ using System; using System.Collections.Generic; using Homer.Platform.HomeKit.Accessories.Info; -using Homer.Platform.HomeKit.Caches; -using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Entity; using Homer.Platform.HomeKit.Services; using Serilog; @@ -61,18 +59,11 @@ public interface IAccessoryBase : IEntity IAccessoryInfo AccessoryInfo { get; } - IIdentifierCache IdentifierCache { get; } - /// /// Master logger instance. /// ILogger Logger { get; } - /// - /// Accessory logger. - /// - ILogger AccessoryLogger { get; } - /// /// Adds service. /// @@ -81,11 +72,5 @@ public interface IAccessoryBase : IEntity IService AddService(IService service); IService GetService(Type t); - - void Publish(dynamic info, bool allowInsecureAccess = false); - - void LogAccessorySummary(); - - void AssignIds(IIdentifierCache identifierCache); } } diff --git a/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs b/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs index e15bbb1..8174259 100644 --- a/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs +++ b/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Dynamic; using System.Linq; using System.Text; using Nacl; diff --git a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs index 6256476..52a4759 100644 --- a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs +++ b/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; namespace Homer.Platform.HomeKit.Accessories.Info { diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/src/platforms/homekit/Bridges/Bridge.cs index 972b078..23b2428 100644 --- a/src/platforms/homekit/Bridges/Bridge.cs +++ b/src/platforms/homekit/Bridges/Bridge.cs @@ -27,6 +27,9 @@ using System.Dynamic; using Homer.Core.Internals.Services.Configuration; using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Accessories.Info; +using Homer.Platform.HomeKit.Caches.Identifiers; +using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; using Homer.Platform.HomeKit.Services.Definitions; @@ -40,6 +43,8 @@ public class Bridge : AccessoryBase, IBridge /// public IReadOnlyList Accessories { get; } + public IIdentifierCache IdentifierCache { get; private set; } + /// /// internal list of accessories. /// @@ -70,5 +75,59 @@ public Bridge(string uuid, string displayName, IConfigurationService configurati Publish(info, _configurationService.Configuration.Platforms.Homekit.Setup.Insecure); } + + public void Publish(dynamic info, bool allowInsecureAccess = false) + { + AccessoryInfo = new AccessoryInfo(this, info); + IdentifierCache = new IdentifierCache(info); + AssignIds(IdentifierCache); + + LogAccessorySummary(); + } + + public void LogAccessorySummary() + { + Logger.Verbose("[{Type}] name: {Name}", this.GetType().Name, DisplayName); + Logger.Verbose("-------------------------------------------------"); + Logger.Verbose("uuid: {Uuid}", Uuid); + Logger.Verbose("accessory id: {Aid}", AccessoryId); + + foreach (var (key, service) in Services) + { + Logger.Verbose("service: [{Type}]", key.Name); + + foreach (var (type, characteristic) in service.Characteristics) + { + Logger.Verbose("characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); + } + + foreach (var (type, characteristic) in service.OptionalCharacteristics) + { + Logger.Verbose("optional characteristic: [{Type}] => ({Format}) {Value}", type.Name, ((ICharacteristicProps)characteristic).Format, characteristic.Value); + } + } + } + + /// + /// Assigns aid/iid to ourselves, any Accessories we are bridging, and all associated Services+Characteristics. Uses + /// the provided identifierCache to keep IDs stable. + /// + /// + public void AssignIds(IIdentifierCache identifierCache) + { + if (identifierCache == null) throw new ArgumentNullException(nameof(identifierCache)); + + AccessoryId = this is IBridge + ? 1 // as we are the bridge, we must have id = 1. + : identifierCache.GetInstanceIdForAccessory(this); // as we are bridged, get an id from the identfier cache. + + foreach (var (_, service) in Services) + { + if (this is IBridge) + service.AssignInstanceId(IdentifierCache, this, 2000000000); + else + service.AssignInstanceId(identifierCache, this); + } + } } } diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/src/platforms/homekit/Bridges/IBridge.cs index 9b13fc3..cdb74e7 100644 --- a/src/platforms/homekit/Bridges/IBridge.cs +++ b/src/platforms/homekit/Bridges/IBridge.cs @@ -23,6 +23,7 @@ using System.Collections.Generic; using Homer.Platform.HomeKit.Accessories; +using Homer.Platform.HomeKit.Caches.Identifiers; namespace Homer.Platform.HomeKit.Bridges { @@ -35,5 +36,13 @@ public interface IBridge /// List of accessories we are bridging. ///
IReadOnlyList Accessories { get; } + + void Publish(dynamic info, bool allowInsecureAccess = false); + + void LogAccessorySummary(); + + void AssignIds(IIdentifierCache identifierCache); + + IIdentifierCache IdentifierCache { get; } } } diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/src/platforms/homekit/Characteristics/Characteristic.cs index 87f156d..76ada4e 100644 --- a/src/platforms/homekit/Characteristics/Characteristic.cs +++ b/src/platforms/homekit/Characteristics/Characteristic.cs @@ -25,7 +25,6 @@ using System.Collections.Generic; using System.Diagnostics; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Caches; using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Events; using Homer.Platform.HomeKit.Services; diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/src/platforms/homekit/Characteristics/ICharacteristic.cs index ad43ffb..36ea002 100644 --- a/src/platforms/homekit/Characteristics/ICharacteristic.cs +++ b/src/platforms/homekit/Characteristics/ICharacteristic.cs @@ -23,7 +23,6 @@ using System; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Caches; using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Services; using uuid.net.Classes.UUID; diff --git a/src/platforms/homekit/Services/IService.cs b/src/platforms/homekit/Services/IService.cs index 7ba5372..b9b304e 100644 --- a/src/platforms/homekit/Services/IService.cs +++ b/src/platforms/homekit/Services/IService.cs @@ -24,7 +24,6 @@ using System; using System.Collections.Generic; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Caches; using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Entity; diff --git a/src/platforms/homekit/Services/Service.cs b/src/platforms/homekit/Services/Service.cs index ee4a762..7a32f59 100644 --- a/src/platforms/homekit/Services/Service.cs +++ b/src/platforms/homekit/Services/Service.cs @@ -27,7 +27,6 @@ using System.Diagnostics; using System.Linq; using Homer.Platform.HomeKit.Accessories; -using Homer.Platform.HomeKit.Caches; using Homer.Platform.HomeKit.Caches.Identifiers; using Homer.Platform.HomeKit.Characteristics; using Homer.Platform.HomeKit.Characteristics.Definitions; From 0aa3395172d687973c132ff9bc6baa8e3307cece Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 14:54:45 +0300 Subject: [PATCH 106/152] moved dotnet-core project to dotnet-core/. moved back node.js project to node.js/. --- .github/workflows/dotnetcore.yml | 2 +- .../characteristic.html | 0 .../data/default.metadata.plist | Bin .../data/version.plist | 0 contrib/{importer => importer-dotnetcore}/import.js | 4 ++-- .../package-lock.json | 0 .../{importer => importer-dotnetcore}/package.json | 0 .../{importer => importer-dotnetcore}/service.html | 0 GitVersion.yml => dotnet.core/GitVersion.yml | 0 build.cmd => dotnet.core/build.cmd | 0 build.ps1 => dotnet.core/build.ps1 | 0 build.sh => dotnet.core/build.sh | 0 {build => dotnet.core/build}/Build.cs | 0 {build => dotnet.core/build}/Homer.Build.csproj | 0 global.json => dotnet.core/global.json | 0 homer.sln => dotnet.core/homer.sln | 0 {src => dotnet.core/src}/core/Homer.Core.csproj | 0 {src => dotnet.core/src}/core/Host/IServerHost.cs | 0 {src => dotnet.core/src}/core/Host/ServerHost.cs | 0 .../src}/core/Internals/Bootstrap/Bootstrapper.cs | 0 .../src}/core/Internals/Bootstrap/IBootstrapper.cs | 0 {src => dotnet.core/src}/core/Internals/Culture.cs | 0 .../core/Internals/Factories/Core/CoreFactory.cs | 0 .../core/Internals/Factories/Core/ICoreFactory.cs | 0 .../src}/core/Internals/Logging/ILogManager.cs | 0 .../src}/core/Internals/Logging/LogManager.cs | 0 .../src}/core/Internals/Registries/CoreRegistry.cs | 0 .../core/Internals/Registries/FactoryRegistry.cs | 0 .../src}/core/Internals/Registries/IRegistry.cs | 0 .../core/Internals/Registries/ServiceRegistry.cs | 0 .../core/Internals/Registries/StorageRegistry.cs | 0 .../Services/Configuration/ConfigurationService.cs | 0 .../Services/Configuration/IConfigurationService.cs | 0 .../Configuration/Models/ConfigurationModel.cs | 0 .../Configuration/Models/IConfigurationModel.cs | 0 .../Configuration/Models/Logs/AccessoryLogModel.cs | 0 .../Configuration/Models/Logs/ConsoleLogModel.cs | 0 .../Configuration/Models/Logs/FileLogModel.cs | 0 .../Services/Configuration/Models/Logs/LogsModel.cs | 0 .../Configuration/Models/Logs/MasterLogModel.cs | 0 .../Models/Platforms/Homekit/HomekitModel.cs | 0 .../Models/Platforms/Homekit/Setup/SetupModel.cs | 0 .../Models/Platforms/PlatformsModel.cs | 0 .../src}/core/Internals/Services/IService.cs | 0 .../Services/Runtime/IRuntimeInfoService.cs | 0 .../Services/Runtime/RuntimeInfoService.cs | 0 .../src}/core/Utils/IO/FileHelper.cs | 0 .../src/core}/config/.gitignore | 0 {src => dotnet.core/src}/core/config/default.yaml | 0 .../src}/core/config/development.yaml | 0 .../src}/core/config/production.yaml | 0 {src => dotnet.core/src}/core/config/test.yaml | 0 {src => dotnet.core/src}/homer/Homer.csproj | 0 .../src}/homer/Internals/ServerRegistry.cs | 0 {src => dotnet.core/src}/homer/Program.cs | 0 {src => dotnet.core/src}/homer/Servers/IServer.cs | 0 {src => dotnet.core/src}/homer/Servers/Server.cs | 0 .../src}/platforms/homekit/Accessories/Accessory.cs | 0 .../platforms/homekit/Accessories/AccessoryBase.cs | 0 .../homekit/Accessories/AccessoryCategory.cs | 0 .../platforms/homekit/Accessories/IAccessory.cs | 0 .../platforms/homekit/Accessories/IAccessoryBase.cs | 0 .../homekit/Accessories/Info/AccessoryInfo.cs | 0 .../homekit/Accessories/Info/IAcessoryInfo.cs | 0 .../src}/platforms/homekit/Bridges/Bridge.cs | 0 .../src}/platforms/homekit/Bridges/IBridge.cs | 0 .../homekit/Caches/Identifiers/IIdentifierCache.cs | 0 .../homekit/Caches/Identifiers/IdentifierCache.cs | 0 .../homekit/Characteristics/Characteristic.cs | 0 .../homekit/Characteristics/CharacteristicFormat.cs | 0 .../Characteristics/CharacteristicPermission.cs | 0 .../homekit/Characteristics/CharacteristicUnit.cs | 0 .../Definitions/AccessoryFlagsCharacteristic.cs | 0 .../Definitions/ActiveCharacteristic.cs | 0 .../AdministratorOnlyAccessCharacteristic.cs | 0 .../AirParticulateDensityCharacteristic.cs | 0 .../Definitions/AirParticulateSizeCharacteristic.cs | 0 .../Definitions/AirQualityCharacteristic.cs | 0 .../Definitions/AudioFeedbackCharacteristic.cs | 0 .../Definitions/BatteryLevelCharacteristic.cs | 0 .../Definitions/BrightnessCharacteristic.cs | 0 .../CarbonDioxideDetectedCharacteristic.cs | 0 .../Definitions/CarbonDioxideLevelCharacteristic.cs | 0 .../CarbonDioxidePeakLevelCharacteristic.cs | 0 .../CarbonMonoxideDetectedCharacteristic.cs | 0 .../CarbonMonoxideLevelCharacteristic.cs | 0 .../CarbonMonoxidePeakLevelCharacteristic.cs | 0 .../Definitions/ChargingStateCharacteristic.cs | 0 .../Definitions/ColorTemperatureCharacteristic.cs | 0 .../Definitions/ContactSensorStateCharacteristic.cs | 0 .../CoolingThresholdTemperatureCharacteristic.cs | 0 .../CurrentAirPurifierStateCharacteristic.cs | 0 .../CurrentAmbientLightLevelCharacteristic.cs | 0 .../Definitions/CurrentDoorStateCharacteristic.cs | 0 .../Definitions/CurrentFanStateCharacteristic.cs | 0 .../CurrentHeaterCoolerStateCharacteristic.cs | 0 .../CurrentHeatingCoolingStateCharacteristic.cs | 0 .../CurrentHorizontalTiltAngleCharacteristic.cs | 0 ...rentHumidifierDehumidifierStateCharacteristic.cs | 0 .../Definitions/CurrentPositionCharacteristic.cs | 0 .../CurrentRelativeHumidityCharacteristic.cs | 0 .../Definitions/CurrentSlatStateCharacteristic.cs | 0 .../Definitions/CurrentTemperatureCharacteristic.cs | 0 .../Definitions/CurrentTiltAngleCharacteristic.cs | 0 .../CurrentVerticalTiltAngleCharacteristic.cs | 0 .../Definitions/DigitalZoomCharacteristic.cs | 0 .../FilterChangeIndicationCharacteristic.cs | 0 .../Definitions/FilterLifeLevelCharacteristic.cs | 0 .../Definitions/FirmwareRevisionCharacteristic.cs | 0 .../Definitions/HardwareRevisionCharacteristic.cs | 0 .../HeatingThresholdTemperatureCharacteristic.cs | 0 .../Definitions/HoldPositionCharacteristic.cs | 0 .../Definitions/HueCharacteristic.cs | 0 .../Definitions/IdentifyCharacteristic.cs | 0 .../Definitions/ImageMirroringCharacteristic.cs | 0 .../Definitions/ImageRotationCharacteristic.cs | 0 .../Definitions/InUseCharacteristic.cs | 0 .../Definitions/IsConfiguredCharacteristic.cs | 0 .../Definitions/LeakDetectedCharacteristic.cs | 0 .../Definitions/LockControlPointCharacteristic.cs | 0 .../Definitions/LockCurrentStateCharacteristic.cs | 0 .../LockLastKnownActionCharacteristic.cs | 0 ...ckManagementAutoSecurityTimeoutCharacteristic.cs | 0 .../LockPhysicalControlsCharacteristic.cs | 0 .../Definitions/LockTargetStateCharacteristic.cs | 0 .../Definitions/LogsCharacteristic.cs | 0 .../Definitions/ManufacturerCharacteristic.cs | 0 .../Definitions/ModelCharacteristic.cs | 0 .../Definitions/MotionDetectedCharacteristic.cs | 0 .../Definitions/MuteCharacteristic.cs | 0 .../Definitions/NameCharacteristic.cs | 0 .../Definitions/NightVisionCharacteristic.cs | 0 .../NitrogenDioxideDensityCharacteristic.cs | 0 .../ObstructionDetectedCharacteristic.cs | 0 .../Definitions/OccupancyDetectedCharacteristic.cs | 0 .../Characteristics/Definitions/OnCharacteristic.cs | 0 .../Definitions/OpticalZoomCharacteristic.cs | 0 .../Definitions/OutletInUseCharacteristic.cs | 0 .../Definitions/OzoneDensityCharacteristic.cs | 0 .../Definitions/PM10DensityCharacteristic.cs | 0 .../Definitions/PM2_5DensityCharacteristic.cs | 0 .../Definitions/PairSetupCharacteristic.cs | 0 .../Definitions/PairVerifyCharacteristic.cs | 0 .../Definitions/PairingFeaturesCharacteristic.cs | 0 .../Definitions/PairingPairingsCharacteristic.cs | 0 .../Definitions/PositionStateCharacteristic.cs | 0 .../Definitions/ProgramModeCharacteristic.cs | 0 .../ProgrammableSwitchEventCharacteristic.cs | 0 ...veHumidityDehumidifierThresholdCharacteristic.cs | 0 ...tiveHumidityHumidifierThresholdCharacteristic.cs | 0 .../Definitions/RemainingDurationCharacteristic.cs | 0 .../ResetFilterIndicationCharacteristic.cs | 0 .../Definitions/RotationDirectionCharacteristic.cs | 0 .../Definitions/RotationSpeedCharacteristic.cs | 0 .../Definitions/SaturationCharacteristic.cs | 0 .../SecuritySystemAlarmTypeCharacteristic.cs | 0 .../SecuritySystemCurrentStateCharacteristic.cs | 0 .../SecuritySystemTargetStateCharacteristic.cs | 0 .../SelectedRTPStreamConfigurationCharacteristic.cs | 0 .../Definitions/SerialNumberCharacteristic.cs | 0 .../Definitions/ServiceLabelIndexCharacteristic.cs | 0 .../ServiceLabelNamespaceCharacteristic.cs | 0 .../Definitions/SetDurationCharacteristic.cs | 0 .../Definitions/SetupEndpointsCharacteristic.cs | 0 .../Definitions/SlatTypeCharacteristic.cs | 0 .../Definitions/SmokeDetectedCharacteristic.cs | 0 .../Definitions/StatusActiveCharacteristic.cs | 0 .../Definitions/StatusFaultCharacteristic.cs | 0 .../Definitions/StatusJammedCharacteristic.cs | 0 .../Definitions/StatusLowBatteryCharacteristic.cs | 0 .../Definitions/StatusTamperedCharacteristic.cs | 0 .../Definitions/StreamingStatusCharacteristic.cs | 0 .../SulphurDioxideDensityCharacteristic.cs | 0 ...pportedAudioStreamConfigurationCharacteristic.cs | 0 .../SupportedRTPConfigurationCharacteristic.cs | 0 ...pportedVideoStreamConfigurationCharacteristic.cs | 0 .../Definitions/SwingModeCharacteristic.cs | 0 .../TargetAirPurifierStateCharacteristic.cs | 0 .../Definitions/TargetAirQualityCharacteristic.cs | 0 .../Definitions/TargetDoorStateCharacteristic.cs | 0 .../Definitions/TargetFanStateCharacteristic.cs | 0 .../TargetHeaterCoolerStateCharacteristic.cs | 0 .../TargetHeatingCoolingStateCharacteristic.cs | 0 .../TargetHorizontalTiltAngleCharacteristic.cs | 0 ...rgetHumidifierDehumidifierStateCharacteristic.cs | 0 .../Definitions/TargetPositionCharacteristic.cs | 0 .../TargetRelativeHumidityCharacteristic.cs | 0 .../Definitions/TargetSlatStateCharacteristic.cs | 0 .../Definitions/TargetTemperatureCharacteristic.cs | 0 .../Definitions/TargetTiltAngleCharacteristic.cs | 0 .../TargetVerticalTiltAngleCharacteristic.cs | 0 .../TemperatureDisplayUnitsCharacteristic.cs | 0 .../Definitions/VOCDensityCharacteristic.cs | 0 .../Definitions/ValveTypeCharacteristic.cs | 0 .../Definitions/VersionCharacteristic.cs | 0 .../Definitions/VolumeCharacteristic.cs | 0 .../Definitions/WaterLevelCharacteristic.cs | 0 .../homekit/Characteristics/ICharacteristic.cs | 0 .../homekit/Characteristics/ICharacteristicProps.cs | 0 .../src}/platforms/homekit/Entity/IEntity.cs | 0 .../src}/platforms/homekit/Events/EventEmitter.cs | 0 .../src}/platforms/homekit/Events/IEventEmitter.cs | 0 .../platforms/homekit/Homer.Platform.HomeKit.csproj | 0 .../Definitions/AccessoryInformationService.cs | 0 .../Services/Definitions/AirPurifierService.cs | 0 .../Services/Definitions/AirQualitySensorService.cs | 0 .../Services/Definitions/BatteryServiceService.cs | 0 .../Definitions/CameraRTPStreamManagementService.cs | 0 .../Definitions/CarbonDioxideSensorService.cs | 0 .../Definitions/CarbonMonoxideSensorService.cs | 0 .../Services/Definitions/ContactSensorService.cs | 0 .../homekit/Services/Definitions/DoorService.cs | 0 .../homekit/Services/Definitions/DoorbellService.cs | 0 .../homekit/Services/Definitions/FanService.cs | 0 .../homekit/Services/Definitions/Fanv2Service.cs | 0 .../homekit/Services/Definitions/FaucetService.cs | 0 .../Definitions/FilterMaintenanceService.cs | 0 .../Services/Definitions/GarageDoorOpenerService.cs | 0 .../Services/Definitions/HeaterCoolerService.cs | 0 .../Definitions/HumidifierDehumidifierService.cs | 0 .../Services/Definitions/HumiditySensorService.cs | 0 .../Services/Definitions/IrrigationSystemService.cs | 0 .../Services/Definitions/LeakSensorService.cs | 0 .../Services/Definitions/LightSensorService.cs | 0 .../Services/Definitions/LightbulbService.cs | 0 .../Services/Definitions/LockManagementService.cs | 0 .../Services/Definitions/LockMechanismService.cs | 0 .../Services/Definitions/MicrophoneService.cs | 0 .../Services/Definitions/MotionSensorService.cs | 0 .../Services/Definitions/OccupancySensorService.cs | 0 .../homekit/Services/Definitions/OutletService.cs | 0 .../Definitions/ProtocolInformationService.cs | 0 .../Services/Definitions/SecuritySystemService.cs | 0 .../Services/Definitions/ServiceLabelService.cs | 0 .../homekit/Services/Definitions/SlatService.cs | 0 .../Services/Definitions/SmokeSensorService.cs | 0 .../homekit/Services/Definitions/SpeakerService.cs | 0 .../StatelessProgrammableSwitchService.cs | 0 .../homekit/Services/Definitions/SwitchService.cs | 0 .../Definitions/TemperatureSensorService.cs | 0 .../Services/Definitions/ThermostatService.cs | 0 .../homekit/Services/Definitions/ValveService.cs | 0 .../Services/Definitions/WindowCoveringService.cs | 0 .../homekit/Services/Definitions/WindowService.cs | 0 .../src}/platforms/homekit/Services/IService.cs | 0 .../src}/platforms/homekit/Services/Service.cs | 0 .../homekit/config/platforms/homekit}/.gitignore | 0 .../homekit/config/platforms/homekit/default.yaml | 0 .../config/platforms/homekit/development.yaml | 0 .../config/platforms/homekit/production.yaml | 0 .../homekit/config/platforms/homekit/test.yaml | 0 .../nodejs-prototype => node.js}/.eslintrc.yaml | 0 .../.vscode/launch.json | 0 .../platforms/homekit => node.js/config}/.gitignore | 0 .../config/default.yaml | 0 .../config/development.yaml | 0 .../config/production.yaml | 0 .../nodejs-prototype => node.js}/config/test.yaml | 0 .../nodejs-prototype => node.js}/package-lock.json | 0 {contrib/nodejs-prototype => node.js}/package.json | 0 {contrib/nodejs-prototype => node.js}/src/app.js | 0 .../src/homekit/homekit.js | 0 .../src/homekit/plugin/api/homebridge/api.js | 0 .../src/homekit/plugin/api/versions.js | 0 .../src/homekit/plugin/manager.js | 0 .../src/homekit/plugin/plugin.js | 0 .../src/homekit/repository/accessory.js | 0 .../src/homekit/repository/platform.js | 0 .../src/homekit/server.js | 0 .../nodejs-prototype => node.js}/src/lib/env.js | 0 .../src/lib/logger/logger.js | 0 .../src/lib/logger/plugin.js | 0 .../nodejs-prototype => node.js}/src/lib/user.js | 0 273 files changed, 3 insertions(+), 3 deletions(-) rename contrib/{importer => importer-dotnetcore}/characteristic.html (100%) rename contrib/{importer => importer-dotnetcore}/data/default.metadata.plist (100%) rename contrib/{importer => importer-dotnetcore}/data/version.plist (100%) rename contrib/{importer => importer-dotnetcore}/import.js (90%) rename contrib/{importer => importer-dotnetcore}/package-lock.json (100%) rename contrib/{importer => importer-dotnetcore}/package.json (100%) rename contrib/{importer => importer-dotnetcore}/service.html (100%) rename GitVersion.yml => dotnet.core/GitVersion.yml (100%) rename build.cmd => dotnet.core/build.cmd (100%) mode change 100755 => 100644 rename build.ps1 => dotnet.core/build.ps1 (100%) mode change 100755 => 100644 rename build.sh => dotnet.core/build.sh (100%) mode change 100755 => 100644 rename {build => dotnet.core/build}/Build.cs (100%) rename {build => dotnet.core/build}/Homer.Build.csproj (100%) rename global.json => dotnet.core/global.json (100%) rename homer.sln => dotnet.core/homer.sln (100%) rename {src => dotnet.core/src}/core/Homer.Core.csproj (100%) rename {src => dotnet.core/src}/core/Host/IServerHost.cs (100%) rename {src => dotnet.core/src}/core/Host/ServerHost.cs (100%) rename {src => dotnet.core/src}/core/Internals/Bootstrap/Bootstrapper.cs (100%) rename {src => dotnet.core/src}/core/Internals/Bootstrap/IBootstrapper.cs (100%) rename {src => dotnet.core/src}/core/Internals/Culture.cs (100%) rename {src => dotnet.core/src}/core/Internals/Factories/Core/CoreFactory.cs (100%) rename {src => dotnet.core/src}/core/Internals/Factories/Core/ICoreFactory.cs (100%) rename {src => dotnet.core/src}/core/Internals/Logging/ILogManager.cs (100%) rename {src => dotnet.core/src}/core/Internals/Logging/LogManager.cs (100%) rename {src => dotnet.core/src}/core/Internals/Registries/CoreRegistry.cs (100%) rename {src => dotnet.core/src}/core/Internals/Registries/FactoryRegistry.cs (100%) rename {src => dotnet.core/src}/core/Internals/Registries/IRegistry.cs (100%) rename {src => dotnet.core/src}/core/Internals/Registries/ServiceRegistry.cs (100%) rename {src => dotnet.core/src}/core/Internals/Registries/StorageRegistry.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/ConfigurationService.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/IConfigurationService.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/ConfigurationModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/IConfigurationModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/IService.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Runtime/IRuntimeInfoService.cs (100%) rename {src => dotnet.core/src}/core/Internals/Services/Runtime/RuntimeInfoService.cs (100%) rename {src => dotnet.core/src}/core/Utils/IO/FileHelper.cs (100%) rename {contrib/nodejs-prototype => dotnet.core/src/core}/config/.gitignore (100%) rename {src => dotnet.core/src}/core/config/default.yaml (100%) rename {src => dotnet.core/src}/core/config/development.yaml (100%) rename {src => dotnet.core/src}/core/config/production.yaml (100%) rename {src => dotnet.core/src}/core/config/test.yaml (100%) rename {src => dotnet.core/src}/homer/Homer.csproj (100%) rename {src => dotnet.core/src}/homer/Internals/ServerRegistry.cs (100%) rename {src => dotnet.core/src}/homer/Program.cs (100%) rename {src => dotnet.core/src}/homer/Servers/IServer.cs (100%) rename {src => dotnet.core/src}/homer/Servers/Server.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/Accessory.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/AccessoryBase.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/AccessoryCategory.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/IAccessory.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/IAccessoryBase.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/Info/AccessoryInfo.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Accessories/Info/IAcessoryInfo.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Bridges/Bridge.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Bridges/IBridge.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Caches/Identifiers/IdentifierCache.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Characteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/CharacteristicFormat.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/CharacteristicPermission.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/CharacteristicUnit.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/ICharacteristic.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Characteristics/ICharacteristicProps.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Entity/IEntity.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Events/EventEmitter.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Events/IEventEmitter.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Homer.Platform.HomeKit.csproj (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/AccessoryInformationService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/AirPurifierService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/AirQualitySensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/BatteryServiceService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/ContactSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/DoorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/DoorbellService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/FanService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/Fanv2Service.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/FaucetService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/HeaterCoolerService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/HumiditySensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/IrrigationSystemService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/LeakSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/LightSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/LightbulbService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/LockManagementService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/LockMechanismService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/MicrophoneService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/MotionSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/OccupancySensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/OutletService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/ProtocolInformationService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/SecuritySystemService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/ServiceLabelService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/SlatService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/SmokeSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/SpeakerService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/SwitchService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/TemperatureSensorService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/ThermostatService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/ValveService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/WindowCoveringService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Definitions/WindowService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/IService.cs (100%) rename {src => dotnet.core/src}/platforms/homekit/Services/Service.cs (100%) rename {src/core/config => dotnet.core/src/platforms/homekit/config/platforms/homekit}/.gitignore (100%) rename {src => dotnet.core/src}/platforms/homekit/config/platforms/homekit/default.yaml (100%) rename {src => dotnet.core/src}/platforms/homekit/config/platforms/homekit/development.yaml (100%) rename {src => dotnet.core/src}/platforms/homekit/config/platforms/homekit/production.yaml (100%) rename {src => dotnet.core/src}/platforms/homekit/config/platforms/homekit/test.yaml (100%) rename {contrib/nodejs-prototype => node.js}/.eslintrc.yaml (100%) rename {contrib/nodejs-prototype => node.js}/.vscode/launch.json (100%) rename {src/platforms/homekit/config/platforms/homekit => node.js/config}/.gitignore (100%) rename {contrib/nodejs-prototype => node.js}/config/default.yaml (100%) rename {contrib/nodejs-prototype => node.js}/config/development.yaml (100%) rename {contrib/nodejs-prototype => node.js}/config/production.yaml (100%) rename {contrib/nodejs-prototype => node.js}/config/test.yaml (100%) rename {contrib/nodejs-prototype => node.js}/package-lock.json (100%) rename {contrib/nodejs-prototype => node.js}/package.json (100%) rename {contrib/nodejs-prototype => node.js}/src/app.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/homekit.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/plugin/api/homebridge/api.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/plugin/api/versions.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/plugin/manager.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/plugin/plugin.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/repository/accessory.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/repository/platform.js (100%) rename {contrib/nodejs-prototype => node.js}/src/homekit/server.js (100%) rename {contrib/nodejs-prototype => node.js}/src/lib/env.js (100%) rename {contrib/nodejs-prototype => node.js}/src/lib/logger/logger.js (100%) rename {contrib/nodejs-prototype => node.js}/src/lib/logger/plugin.js (100%) rename {contrib/nodejs-prototype => node.js}/src/lib/user.js (100%) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 6310b9d..2dfbea2 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -1,4 +1,4 @@ -name: build +name: dotnet-core on: [push] diff --git a/contrib/importer/characteristic.html b/contrib/importer-dotnetcore/characteristic.html similarity index 100% rename from contrib/importer/characteristic.html rename to contrib/importer-dotnetcore/characteristic.html diff --git a/contrib/importer/data/default.metadata.plist b/contrib/importer-dotnetcore/data/default.metadata.plist similarity index 100% rename from contrib/importer/data/default.metadata.plist rename to contrib/importer-dotnetcore/data/default.metadata.plist diff --git a/contrib/importer/data/version.plist b/contrib/importer-dotnetcore/data/version.plist similarity index 100% rename from contrib/importer/data/version.plist rename to contrib/importer-dotnetcore/data/version.plist diff --git a/contrib/importer/import.js b/contrib/importer-dotnetcore/import.js similarity index 90% rename from contrib/importer/import.js rename to contrib/importer-dotnetcore/import.js index 27af10b..10b66af 100644 --- a/contrib/importer/import.js +++ b/contrib/importer-dotnetcore/import.js @@ -22,7 +22,7 @@ function readCharacteristics(metadata) { classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5" characteristics[characteristic.UUID] = classyName; // build characteristics list for later reference to use in services. - var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); + var outputPath = path.join(__dirname, '..', '..', 'dotnet-core', 'src', 'platforms', 'homekit', 'Characteristics', 'Definitions', `${classyName}Characteristic.cs`); var output = fs.createWriteStream(outputPath); var res = nunjucks.render('characteristic.html', { @@ -47,7 +47,7 @@ function readServices(metadata) { var service = metadata.Services[index]; var classyName = service.Name.replace(/[\s\-]/g, ""); - var outputPath = path.join(__dirname, '..', '..', 'src', 'platforms', 'homekit', 'Services', 'Definitions', `${classyName}Service.cs`); + var outputPath = path.join(__dirname, '..', '..', 'dotnet-core', 'src', 'platforms', 'homekit', 'Services', 'Definitions', `${classyName}Service.cs`); var output = fs.createWriteStream(outputPath); var res = nunjucks.render('service.html', { diff --git a/contrib/importer/package-lock.json b/contrib/importer-dotnetcore/package-lock.json similarity index 100% rename from contrib/importer/package-lock.json rename to contrib/importer-dotnetcore/package-lock.json diff --git a/contrib/importer/package.json b/contrib/importer-dotnetcore/package.json similarity index 100% rename from contrib/importer/package.json rename to contrib/importer-dotnetcore/package.json diff --git a/contrib/importer/service.html b/contrib/importer-dotnetcore/service.html similarity index 100% rename from contrib/importer/service.html rename to contrib/importer-dotnetcore/service.html diff --git a/GitVersion.yml b/dotnet.core/GitVersion.yml similarity index 100% rename from GitVersion.yml rename to dotnet.core/GitVersion.yml diff --git a/build.cmd b/dotnet.core/build.cmd old mode 100755 new mode 100644 similarity index 100% rename from build.cmd rename to dotnet.core/build.cmd diff --git a/build.ps1 b/dotnet.core/build.ps1 old mode 100755 new mode 100644 similarity index 100% rename from build.ps1 rename to dotnet.core/build.ps1 diff --git a/build.sh b/dotnet.core/build.sh old mode 100755 new mode 100644 similarity index 100% rename from build.sh rename to dotnet.core/build.sh diff --git a/build/Build.cs b/dotnet.core/build/Build.cs similarity index 100% rename from build/Build.cs rename to dotnet.core/build/Build.cs diff --git a/build/Homer.Build.csproj b/dotnet.core/build/Homer.Build.csproj similarity index 100% rename from build/Homer.Build.csproj rename to dotnet.core/build/Homer.Build.csproj diff --git a/global.json b/dotnet.core/global.json similarity index 100% rename from global.json rename to dotnet.core/global.json diff --git a/homer.sln b/dotnet.core/homer.sln similarity index 100% rename from homer.sln rename to dotnet.core/homer.sln diff --git a/src/core/Homer.Core.csproj b/dotnet.core/src/core/Homer.Core.csproj similarity index 100% rename from src/core/Homer.Core.csproj rename to dotnet.core/src/core/Homer.Core.csproj diff --git a/src/core/Host/IServerHost.cs b/dotnet.core/src/core/Host/IServerHost.cs similarity index 100% rename from src/core/Host/IServerHost.cs rename to dotnet.core/src/core/Host/IServerHost.cs diff --git a/src/core/Host/ServerHost.cs b/dotnet.core/src/core/Host/ServerHost.cs similarity index 100% rename from src/core/Host/ServerHost.cs rename to dotnet.core/src/core/Host/ServerHost.cs diff --git a/src/core/Internals/Bootstrap/Bootstrapper.cs b/dotnet.core/src/core/Internals/Bootstrap/Bootstrapper.cs similarity index 100% rename from src/core/Internals/Bootstrap/Bootstrapper.cs rename to dotnet.core/src/core/Internals/Bootstrap/Bootstrapper.cs diff --git a/src/core/Internals/Bootstrap/IBootstrapper.cs b/dotnet.core/src/core/Internals/Bootstrap/IBootstrapper.cs similarity index 100% rename from src/core/Internals/Bootstrap/IBootstrapper.cs rename to dotnet.core/src/core/Internals/Bootstrap/IBootstrapper.cs diff --git a/src/core/Internals/Culture.cs b/dotnet.core/src/core/Internals/Culture.cs similarity index 100% rename from src/core/Internals/Culture.cs rename to dotnet.core/src/core/Internals/Culture.cs diff --git a/src/core/Internals/Factories/Core/CoreFactory.cs b/dotnet.core/src/core/Internals/Factories/Core/CoreFactory.cs similarity index 100% rename from src/core/Internals/Factories/Core/CoreFactory.cs rename to dotnet.core/src/core/Internals/Factories/Core/CoreFactory.cs diff --git a/src/core/Internals/Factories/Core/ICoreFactory.cs b/dotnet.core/src/core/Internals/Factories/Core/ICoreFactory.cs similarity index 100% rename from src/core/Internals/Factories/Core/ICoreFactory.cs rename to dotnet.core/src/core/Internals/Factories/Core/ICoreFactory.cs diff --git a/src/core/Internals/Logging/ILogManager.cs b/dotnet.core/src/core/Internals/Logging/ILogManager.cs similarity index 100% rename from src/core/Internals/Logging/ILogManager.cs rename to dotnet.core/src/core/Internals/Logging/ILogManager.cs diff --git a/src/core/Internals/Logging/LogManager.cs b/dotnet.core/src/core/Internals/Logging/LogManager.cs similarity index 100% rename from src/core/Internals/Logging/LogManager.cs rename to dotnet.core/src/core/Internals/Logging/LogManager.cs diff --git a/src/core/Internals/Registries/CoreRegistry.cs b/dotnet.core/src/core/Internals/Registries/CoreRegistry.cs similarity index 100% rename from src/core/Internals/Registries/CoreRegistry.cs rename to dotnet.core/src/core/Internals/Registries/CoreRegistry.cs diff --git a/src/core/Internals/Registries/FactoryRegistry.cs b/dotnet.core/src/core/Internals/Registries/FactoryRegistry.cs similarity index 100% rename from src/core/Internals/Registries/FactoryRegistry.cs rename to dotnet.core/src/core/Internals/Registries/FactoryRegistry.cs diff --git a/src/core/Internals/Registries/IRegistry.cs b/dotnet.core/src/core/Internals/Registries/IRegistry.cs similarity index 100% rename from src/core/Internals/Registries/IRegistry.cs rename to dotnet.core/src/core/Internals/Registries/IRegistry.cs diff --git a/src/core/Internals/Registries/ServiceRegistry.cs b/dotnet.core/src/core/Internals/Registries/ServiceRegistry.cs similarity index 100% rename from src/core/Internals/Registries/ServiceRegistry.cs rename to dotnet.core/src/core/Internals/Registries/ServiceRegistry.cs diff --git a/src/core/Internals/Registries/StorageRegistry.cs b/dotnet.core/src/core/Internals/Registries/StorageRegistry.cs similarity index 100% rename from src/core/Internals/Registries/StorageRegistry.cs rename to dotnet.core/src/core/Internals/Registries/StorageRegistry.cs diff --git a/src/core/Internals/Services/Configuration/ConfigurationService.cs b/dotnet.core/src/core/Internals/Services/Configuration/ConfigurationService.cs similarity index 100% rename from src/core/Internals/Services/Configuration/ConfigurationService.cs rename to dotnet.core/src/core/Internals/Services/Configuration/ConfigurationService.cs diff --git a/src/core/Internals/Services/Configuration/IConfigurationService.cs b/dotnet.core/src/core/Internals/Services/Configuration/IConfigurationService.cs similarity index 100% rename from src/core/Internals/Services/Configuration/IConfigurationService.cs rename to dotnet.core/src/core/Internals/Services/Configuration/IConfigurationService.cs diff --git a/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs diff --git a/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs b/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs similarity index 100% rename from src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs rename to dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs diff --git a/src/core/Internals/Services/IService.cs b/dotnet.core/src/core/Internals/Services/IService.cs similarity index 100% rename from src/core/Internals/Services/IService.cs rename to dotnet.core/src/core/Internals/Services/IService.cs diff --git a/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs b/dotnet.core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs similarity index 100% rename from src/core/Internals/Services/Runtime/IRuntimeInfoService.cs rename to dotnet.core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs diff --git a/src/core/Internals/Services/Runtime/RuntimeInfoService.cs b/dotnet.core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs similarity index 100% rename from src/core/Internals/Services/Runtime/RuntimeInfoService.cs rename to dotnet.core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs diff --git a/src/core/Utils/IO/FileHelper.cs b/dotnet.core/src/core/Utils/IO/FileHelper.cs similarity index 100% rename from src/core/Utils/IO/FileHelper.cs rename to dotnet.core/src/core/Utils/IO/FileHelper.cs diff --git a/contrib/nodejs-prototype/config/.gitignore b/dotnet.core/src/core/config/.gitignore similarity index 100% rename from contrib/nodejs-prototype/config/.gitignore rename to dotnet.core/src/core/config/.gitignore diff --git a/src/core/config/default.yaml b/dotnet.core/src/core/config/default.yaml similarity index 100% rename from src/core/config/default.yaml rename to dotnet.core/src/core/config/default.yaml diff --git a/src/core/config/development.yaml b/dotnet.core/src/core/config/development.yaml similarity index 100% rename from src/core/config/development.yaml rename to dotnet.core/src/core/config/development.yaml diff --git a/src/core/config/production.yaml b/dotnet.core/src/core/config/production.yaml similarity index 100% rename from src/core/config/production.yaml rename to dotnet.core/src/core/config/production.yaml diff --git a/src/core/config/test.yaml b/dotnet.core/src/core/config/test.yaml similarity index 100% rename from src/core/config/test.yaml rename to dotnet.core/src/core/config/test.yaml diff --git a/src/homer/Homer.csproj b/dotnet.core/src/homer/Homer.csproj similarity index 100% rename from src/homer/Homer.csproj rename to dotnet.core/src/homer/Homer.csproj diff --git a/src/homer/Internals/ServerRegistry.cs b/dotnet.core/src/homer/Internals/ServerRegistry.cs similarity index 100% rename from src/homer/Internals/ServerRegistry.cs rename to dotnet.core/src/homer/Internals/ServerRegistry.cs diff --git a/src/homer/Program.cs b/dotnet.core/src/homer/Program.cs similarity index 100% rename from src/homer/Program.cs rename to dotnet.core/src/homer/Program.cs diff --git a/src/homer/Servers/IServer.cs b/dotnet.core/src/homer/Servers/IServer.cs similarity index 100% rename from src/homer/Servers/IServer.cs rename to dotnet.core/src/homer/Servers/IServer.cs diff --git a/src/homer/Servers/Server.cs b/dotnet.core/src/homer/Servers/Server.cs similarity index 100% rename from src/homer/Servers/Server.cs rename to dotnet.core/src/homer/Servers/Server.cs diff --git a/src/platforms/homekit/Accessories/Accessory.cs b/dotnet.core/src/platforms/homekit/Accessories/Accessory.cs similarity index 100% rename from src/platforms/homekit/Accessories/Accessory.cs rename to dotnet.core/src/platforms/homekit/Accessories/Accessory.cs diff --git a/src/platforms/homekit/Accessories/AccessoryBase.cs b/dotnet.core/src/platforms/homekit/Accessories/AccessoryBase.cs similarity index 100% rename from src/platforms/homekit/Accessories/AccessoryBase.cs rename to dotnet.core/src/platforms/homekit/Accessories/AccessoryBase.cs diff --git a/src/platforms/homekit/Accessories/AccessoryCategory.cs b/dotnet.core/src/platforms/homekit/Accessories/AccessoryCategory.cs similarity index 100% rename from src/platforms/homekit/Accessories/AccessoryCategory.cs rename to dotnet.core/src/platforms/homekit/Accessories/AccessoryCategory.cs diff --git a/src/platforms/homekit/Accessories/IAccessory.cs b/dotnet.core/src/platforms/homekit/Accessories/IAccessory.cs similarity index 100% rename from src/platforms/homekit/Accessories/IAccessory.cs rename to dotnet.core/src/platforms/homekit/Accessories/IAccessory.cs diff --git a/src/platforms/homekit/Accessories/IAccessoryBase.cs b/dotnet.core/src/platforms/homekit/Accessories/IAccessoryBase.cs similarity index 100% rename from src/platforms/homekit/Accessories/IAccessoryBase.cs rename to dotnet.core/src/platforms/homekit/Accessories/IAccessoryBase.cs diff --git a/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs b/dotnet.core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs similarity index 100% rename from src/platforms/homekit/Accessories/Info/AccessoryInfo.cs rename to dotnet.core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs diff --git a/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs b/dotnet.core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs similarity index 100% rename from src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs rename to dotnet.core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs diff --git a/src/platforms/homekit/Bridges/Bridge.cs b/dotnet.core/src/platforms/homekit/Bridges/Bridge.cs similarity index 100% rename from src/platforms/homekit/Bridges/Bridge.cs rename to dotnet.core/src/platforms/homekit/Bridges/Bridge.cs diff --git a/src/platforms/homekit/Bridges/IBridge.cs b/dotnet.core/src/platforms/homekit/Bridges/IBridge.cs similarity index 100% rename from src/platforms/homekit/Bridges/IBridge.cs rename to dotnet.core/src/platforms/homekit/Bridges/IBridge.cs diff --git a/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs b/dotnet.core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs similarity index 100% rename from src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs rename to dotnet.core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs diff --git a/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs b/dotnet.core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs similarity index 100% rename from src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs rename to dotnet.core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs diff --git a/src/platforms/homekit/Characteristics/Characteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Characteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Characteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Characteristic.cs diff --git a/src/platforms/homekit/Characteristics/CharacteristicFormat.cs b/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs similarity index 100% rename from src/platforms/homekit/Characteristics/CharacteristicFormat.cs rename to dotnet.core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs diff --git a/src/platforms/homekit/Characteristics/CharacteristicPermission.cs b/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs similarity index 100% rename from src/platforms/homekit/Characteristics/CharacteristicPermission.cs rename to dotnet.core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs diff --git a/src/platforms/homekit/Characteristics/CharacteristicUnit.cs b/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs similarity index 100% rename from src/platforms/homekit/Characteristics/CharacteristicUnit.cs rename to dotnet.core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/ICharacteristic.cs b/dotnet.core/src/platforms/homekit/Characteristics/ICharacteristic.cs similarity index 100% rename from src/platforms/homekit/Characteristics/ICharacteristic.cs rename to dotnet.core/src/platforms/homekit/Characteristics/ICharacteristic.cs diff --git a/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/dotnet.core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs similarity index 100% rename from src/platforms/homekit/Characteristics/ICharacteristicProps.cs rename to dotnet.core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs diff --git a/src/platforms/homekit/Entity/IEntity.cs b/dotnet.core/src/platforms/homekit/Entity/IEntity.cs similarity index 100% rename from src/platforms/homekit/Entity/IEntity.cs rename to dotnet.core/src/platforms/homekit/Entity/IEntity.cs diff --git a/src/platforms/homekit/Events/EventEmitter.cs b/dotnet.core/src/platforms/homekit/Events/EventEmitter.cs similarity index 100% rename from src/platforms/homekit/Events/EventEmitter.cs rename to dotnet.core/src/platforms/homekit/Events/EventEmitter.cs diff --git a/src/platforms/homekit/Events/IEventEmitter.cs b/dotnet.core/src/platforms/homekit/Events/IEventEmitter.cs similarity index 100% rename from src/platforms/homekit/Events/IEventEmitter.cs rename to dotnet.core/src/platforms/homekit/Events/IEventEmitter.cs diff --git a/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/dotnet.core/src/platforms/homekit/Homer.Platform.HomeKit.csproj similarity index 100% rename from src/platforms/homekit/Homer.Platform.HomeKit.csproj rename to dotnet.core/src/platforms/homekit/Homer.Platform.HomeKit.csproj diff --git a/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs diff --git a/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/AirPurifierService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs diff --git a/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/BatteryServiceService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs diff --git a/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs diff --git a/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/ContactSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/DoorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/DoorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/DoorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/DoorService.cs diff --git a/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/DoorbellService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/DoorbellService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/DoorbellService.cs diff --git a/src/platforms/homekit/Services/Definitions/FanService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/FanService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/FanService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/FanService.cs diff --git a/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/Fanv2Service.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs diff --git a/src/platforms/homekit/Services/Definitions/FaucetService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/FaucetService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/FaucetService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/FaucetService.cs diff --git a/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs diff --git a/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs diff --git a/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs diff --git a/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs diff --git a/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/HumiditySensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs diff --git a/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/LeakSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/LightSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/LightSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/LightSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/LightbulbService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/LightbulbService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/LightbulbService.cs diff --git a/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/LockManagementService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/LockManagementService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/LockManagementService.cs diff --git a/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/LockMechanismService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs diff --git a/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/MicrophoneService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs diff --git a/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/MotionSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/OccupancySensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/OutletService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/OutletService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/OutletService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/OutletService.cs diff --git a/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs diff --git a/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/SecuritySystemService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs diff --git a/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/ServiceLabelService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs diff --git a/src/platforms/homekit/Services/Definitions/SlatService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/SlatService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/SlatService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/SlatService.cs diff --git a/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/SmokeSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/SpeakerService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/SpeakerService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/SpeakerService.cs diff --git a/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs diff --git a/src/platforms/homekit/Services/Definitions/SwitchService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/SwitchService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/SwitchService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/SwitchService.cs diff --git a/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs diff --git a/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ThermostatService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/ThermostatService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/ThermostatService.cs diff --git a/src/platforms/homekit/Services/Definitions/ValveService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ValveService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/ValveService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/ValveService.cs diff --git a/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/WindowCoveringService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs diff --git a/src/platforms/homekit/Services/Definitions/WindowService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/WindowService.cs similarity index 100% rename from src/platforms/homekit/Services/Definitions/WindowService.cs rename to dotnet.core/src/platforms/homekit/Services/Definitions/WindowService.cs diff --git a/src/platforms/homekit/Services/IService.cs b/dotnet.core/src/platforms/homekit/Services/IService.cs similarity index 100% rename from src/platforms/homekit/Services/IService.cs rename to dotnet.core/src/platforms/homekit/Services/IService.cs diff --git a/src/platforms/homekit/Services/Service.cs b/dotnet.core/src/platforms/homekit/Services/Service.cs similarity index 100% rename from src/platforms/homekit/Services/Service.cs rename to dotnet.core/src/platforms/homekit/Services/Service.cs diff --git a/src/core/config/.gitignore b/dotnet.core/src/platforms/homekit/config/platforms/homekit/.gitignore similarity index 100% rename from src/core/config/.gitignore rename to dotnet.core/src/platforms/homekit/config/platforms/homekit/.gitignore diff --git a/src/platforms/homekit/config/platforms/homekit/default.yaml b/dotnet.core/src/platforms/homekit/config/platforms/homekit/default.yaml similarity index 100% rename from src/platforms/homekit/config/platforms/homekit/default.yaml rename to dotnet.core/src/platforms/homekit/config/platforms/homekit/default.yaml diff --git a/src/platforms/homekit/config/platforms/homekit/development.yaml b/dotnet.core/src/platforms/homekit/config/platforms/homekit/development.yaml similarity index 100% rename from src/platforms/homekit/config/platforms/homekit/development.yaml rename to dotnet.core/src/platforms/homekit/config/platforms/homekit/development.yaml diff --git a/src/platforms/homekit/config/platforms/homekit/production.yaml b/dotnet.core/src/platforms/homekit/config/platforms/homekit/production.yaml similarity index 100% rename from src/platforms/homekit/config/platforms/homekit/production.yaml rename to dotnet.core/src/platforms/homekit/config/platforms/homekit/production.yaml diff --git a/src/platforms/homekit/config/platforms/homekit/test.yaml b/dotnet.core/src/platforms/homekit/config/platforms/homekit/test.yaml similarity index 100% rename from src/platforms/homekit/config/platforms/homekit/test.yaml rename to dotnet.core/src/platforms/homekit/config/platforms/homekit/test.yaml diff --git a/contrib/nodejs-prototype/.eslintrc.yaml b/node.js/.eslintrc.yaml similarity index 100% rename from contrib/nodejs-prototype/.eslintrc.yaml rename to node.js/.eslintrc.yaml diff --git a/contrib/nodejs-prototype/.vscode/launch.json b/node.js/.vscode/launch.json similarity index 100% rename from contrib/nodejs-prototype/.vscode/launch.json rename to node.js/.vscode/launch.json diff --git a/src/platforms/homekit/config/platforms/homekit/.gitignore b/node.js/config/.gitignore similarity index 100% rename from src/platforms/homekit/config/platforms/homekit/.gitignore rename to node.js/config/.gitignore diff --git a/contrib/nodejs-prototype/config/default.yaml b/node.js/config/default.yaml similarity index 100% rename from contrib/nodejs-prototype/config/default.yaml rename to node.js/config/default.yaml diff --git a/contrib/nodejs-prototype/config/development.yaml b/node.js/config/development.yaml similarity index 100% rename from contrib/nodejs-prototype/config/development.yaml rename to node.js/config/development.yaml diff --git a/contrib/nodejs-prototype/config/production.yaml b/node.js/config/production.yaml similarity index 100% rename from contrib/nodejs-prototype/config/production.yaml rename to node.js/config/production.yaml diff --git a/contrib/nodejs-prototype/config/test.yaml b/node.js/config/test.yaml similarity index 100% rename from contrib/nodejs-prototype/config/test.yaml rename to node.js/config/test.yaml diff --git a/contrib/nodejs-prototype/package-lock.json b/node.js/package-lock.json similarity index 100% rename from contrib/nodejs-prototype/package-lock.json rename to node.js/package-lock.json diff --git a/contrib/nodejs-prototype/package.json b/node.js/package.json similarity index 100% rename from contrib/nodejs-prototype/package.json rename to node.js/package.json diff --git a/contrib/nodejs-prototype/src/app.js b/node.js/src/app.js similarity index 100% rename from contrib/nodejs-prototype/src/app.js rename to node.js/src/app.js diff --git a/contrib/nodejs-prototype/src/homekit/homekit.js b/node.js/src/homekit/homekit.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/homekit.js rename to node.js/src/homekit/homekit.js diff --git a/contrib/nodejs-prototype/src/homekit/plugin/api/homebridge/api.js b/node.js/src/homekit/plugin/api/homebridge/api.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/plugin/api/homebridge/api.js rename to node.js/src/homekit/plugin/api/homebridge/api.js diff --git a/contrib/nodejs-prototype/src/homekit/plugin/api/versions.js b/node.js/src/homekit/plugin/api/versions.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/plugin/api/versions.js rename to node.js/src/homekit/plugin/api/versions.js diff --git a/contrib/nodejs-prototype/src/homekit/plugin/manager.js b/node.js/src/homekit/plugin/manager.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/plugin/manager.js rename to node.js/src/homekit/plugin/manager.js diff --git a/contrib/nodejs-prototype/src/homekit/plugin/plugin.js b/node.js/src/homekit/plugin/plugin.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/plugin/plugin.js rename to node.js/src/homekit/plugin/plugin.js diff --git a/contrib/nodejs-prototype/src/homekit/repository/accessory.js b/node.js/src/homekit/repository/accessory.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/repository/accessory.js rename to node.js/src/homekit/repository/accessory.js diff --git a/contrib/nodejs-prototype/src/homekit/repository/platform.js b/node.js/src/homekit/repository/platform.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/repository/platform.js rename to node.js/src/homekit/repository/platform.js diff --git a/contrib/nodejs-prototype/src/homekit/server.js b/node.js/src/homekit/server.js similarity index 100% rename from contrib/nodejs-prototype/src/homekit/server.js rename to node.js/src/homekit/server.js diff --git a/contrib/nodejs-prototype/src/lib/env.js b/node.js/src/lib/env.js similarity index 100% rename from contrib/nodejs-prototype/src/lib/env.js rename to node.js/src/lib/env.js diff --git a/contrib/nodejs-prototype/src/lib/logger/logger.js b/node.js/src/lib/logger/logger.js similarity index 100% rename from contrib/nodejs-prototype/src/lib/logger/logger.js rename to node.js/src/lib/logger/logger.js diff --git a/contrib/nodejs-prototype/src/lib/logger/plugin.js b/node.js/src/lib/logger/plugin.js similarity index 100% rename from contrib/nodejs-prototype/src/lib/logger/plugin.js rename to node.js/src/lib/logger/plugin.js diff --git a/contrib/nodejs-prototype/src/lib/user.js b/node.js/src/lib/user.js similarity index 100% rename from contrib/nodejs-prototype/src/lib/user.js rename to node.js/src/lib/user.js From 6a3c32f3a6f89ca277c3a6674ba579fa71abc569 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 14:57:29 +0300 Subject: [PATCH 107/152] fix dotnet-core folder name. --- {dotnet.core => dotnet-core}/GitVersion.yml | 0 {dotnet.core => dotnet-core}/build.cmd | 0 {dotnet.core => dotnet-core}/build.ps1 | 0 {dotnet.core => dotnet-core}/build.sh | 0 {dotnet.core => dotnet-core}/build/Build.cs | 0 .../build/Homer.Build.csproj | 0 {dotnet.core => dotnet-core}/global.json | 0 {dotnet.core => dotnet-core}/homer.sln | 0 .../src/core/Homer.Core.csproj | 0 .../src/core/Host/IServerHost.cs | 0 .../src/core/Host/ServerHost.cs | 0 .../src/core/Internals/Bootstrap/Bootstrapper.cs | 0 .../src/core/Internals/Bootstrap/IBootstrapper.cs | 0 .../src/core/Internals/Culture.cs | 0 .../core/Internals/Factories/Core/CoreFactory.cs | 0 .../core/Internals/Factories/Core/ICoreFactory.cs | 0 .../src/core/Internals/Logging/ILogManager.cs | 0 .../src/core/Internals/Logging/LogManager.cs | 0 .../src/core/Internals/Registries/CoreRegistry.cs | 0 .../core/Internals/Registries/FactoryRegistry.cs | 0 .../src/core/Internals/Registries/IRegistry.cs | 0 .../core/Internals/Registries/ServiceRegistry.cs | 0 .../core/Internals/Registries/StorageRegistry.cs | 0 .../Services/Configuration/ConfigurationService.cs | 0 .../Configuration/IConfigurationService.cs | 0 .../Configuration/Models/ConfigurationModel.cs | 0 .../Configuration/Models/IConfigurationModel.cs | 0 .../Configuration/Models/Logs/AccessoryLogModel.cs | 0 .../Configuration/Models/Logs/ConsoleLogModel.cs | 0 .../Configuration/Models/Logs/FileLogModel.cs | 0 .../Configuration/Models/Logs/LogsModel.cs | 0 .../Configuration/Models/Logs/MasterLogModel.cs | 0 .../Models/Platforms/Homekit/HomekitModel.cs | 0 .../Models/Platforms/Homekit/Setup/SetupModel.cs | 0 .../Models/Platforms/PlatformsModel.cs | 0 .../src/core/Internals/Services/IService.cs | 0 .../Services/Runtime/IRuntimeInfoService.cs | 0 .../Services/Runtime/RuntimeInfoService.cs | 0 .../src/core/Utils/IO/FileHelper.cs | 0 .../src/core/config/.gitignore | 0 .../src/core/config/default.yaml | 0 .../src/core/config/development.yaml | 0 .../src/core/config/production.yaml | 0 .../src/core/config/test.yaml | 0 .../src/homer/Homer.csproj | 0 .../src/homer/Internals/ServerRegistry.cs | 0 {dotnet.core => dotnet-core}/src/homer/Program.cs | 0 .../src/homer/Servers/IServer.cs | 0 .../src/homer/Servers/Server.cs | 0 .../src/platforms/homekit/Accessories/Accessory.cs | 0 .../platforms/homekit/Accessories/AccessoryBase.cs | 0 .../homekit/Accessories/AccessoryCategory.cs | 0 .../platforms/homekit/Accessories/IAccessory.cs | 0 .../homekit/Accessories/IAccessoryBase.cs | 0 .../homekit/Accessories/Info/AccessoryInfo.cs | 0 .../homekit/Accessories/Info/IAcessoryInfo.cs | 0 .../src/platforms/homekit/Bridges/Bridge.cs | 0 .../src/platforms/homekit/Bridges/IBridge.cs | 0 .../homekit/Caches/Identifiers/IIdentifierCache.cs | 0 .../homekit/Caches/Identifiers/IdentifierCache.cs | 0 .../homekit/Characteristics/Characteristic.cs | 0 .../Characteristics/CharacteristicFormat.cs | 0 .../Characteristics/CharacteristicPermission.cs | 0 .../homekit/Characteristics/CharacteristicUnit.cs | 0 .../Definitions/AccessoryFlagsCharacteristic.cs | 0 .../Definitions/ActiveCharacteristic.cs | 0 .../AdministratorOnlyAccessCharacteristic.cs | 0 .../AirParticulateDensityCharacteristic.cs | 0 .../AirParticulateSizeCharacteristic.cs | 0 .../Definitions/AirQualityCharacteristic.cs | 0 .../Definitions/AudioFeedbackCharacteristic.cs | 0 .../Definitions/BatteryLevelCharacteristic.cs | 0 .../Definitions/BrightnessCharacteristic.cs | 0 .../CarbonDioxideDetectedCharacteristic.cs | 0 .../CarbonDioxideLevelCharacteristic.cs | 0 .../CarbonDioxidePeakLevelCharacteristic.cs | 0 .../CarbonMonoxideDetectedCharacteristic.cs | 0 .../CarbonMonoxideLevelCharacteristic.cs | 0 .../CarbonMonoxidePeakLevelCharacteristic.cs | 0 .../Definitions/ChargingStateCharacteristic.cs | 0 .../Definitions/ColorTemperatureCharacteristic.cs | 0 .../ContactSensorStateCharacteristic.cs | 0 .../CoolingThresholdTemperatureCharacteristic.cs | 0 .../CurrentAirPurifierStateCharacteristic.cs | 0 .../CurrentAmbientLightLevelCharacteristic.cs | 0 .../Definitions/CurrentDoorStateCharacteristic.cs | 0 .../Definitions/CurrentFanStateCharacteristic.cs | 0 .../CurrentHeaterCoolerStateCharacteristic.cs | 0 .../CurrentHeatingCoolingStateCharacteristic.cs | 0 .../CurrentHorizontalTiltAngleCharacteristic.cs | 0 ...entHumidifierDehumidifierStateCharacteristic.cs | 0 .../Definitions/CurrentPositionCharacteristic.cs | 0 .../CurrentRelativeHumidityCharacteristic.cs | 0 .../Definitions/CurrentSlatStateCharacteristic.cs | 0 .../CurrentTemperatureCharacteristic.cs | 0 .../Definitions/CurrentTiltAngleCharacteristic.cs | 0 .../CurrentVerticalTiltAngleCharacteristic.cs | 0 .../Definitions/DigitalZoomCharacteristic.cs | 0 .../FilterChangeIndicationCharacteristic.cs | 0 .../Definitions/FilterLifeLevelCharacteristic.cs | 0 .../Definitions/FirmwareRevisionCharacteristic.cs | 0 .../Definitions/HardwareRevisionCharacteristic.cs | 0 .../HeatingThresholdTemperatureCharacteristic.cs | 0 .../Definitions/HoldPositionCharacteristic.cs | 0 .../Definitions/HueCharacteristic.cs | 0 .../Definitions/IdentifyCharacteristic.cs | 0 .../Definitions/ImageMirroringCharacteristic.cs | 0 .../Definitions/ImageRotationCharacteristic.cs | 0 .../Definitions/InUseCharacteristic.cs | 0 .../Definitions/IsConfiguredCharacteristic.cs | 0 .../Definitions/LeakDetectedCharacteristic.cs | 0 .../Definitions/LockControlPointCharacteristic.cs | 0 .../Definitions/LockCurrentStateCharacteristic.cs | 0 .../LockLastKnownActionCharacteristic.cs | 0 ...kManagementAutoSecurityTimeoutCharacteristic.cs | 0 .../LockPhysicalControlsCharacteristic.cs | 0 .../Definitions/LockTargetStateCharacteristic.cs | 0 .../Definitions/LogsCharacteristic.cs | 0 .../Definitions/ManufacturerCharacteristic.cs | 0 .../Definitions/ModelCharacteristic.cs | 0 .../Definitions/MotionDetectedCharacteristic.cs | 0 .../Definitions/MuteCharacteristic.cs | 0 .../Definitions/NameCharacteristic.cs | 0 .../Definitions/NightVisionCharacteristic.cs | 0 .../NitrogenDioxideDensityCharacteristic.cs | 0 .../ObstructionDetectedCharacteristic.cs | 0 .../Definitions/OccupancyDetectedCharacteristic.cs | 0 .../Definitions/OnCharacteristic.cs | 0 .../Definitions/OpticalZoomCharacteristic.cs | 0 .../Definitions/OutletInUseCharacteristic.cs | 0 .../Definitions/OzoneDensityCharacteristic.cs | 0 .../Definitions/PM10DensityCharacteristic.cs | 0 .../Definitions/PM2_5DensityCharacteristic.cs | 0 .../Definitions/PairSetupCharacteristic.cs | 0 .../Definitions/PairVerifyCharacteristic.cs | 0 .../Definitions/PairingFeaturesCharacteristic.cs | 0 .../Definitions/PairingPairingsCharacteristic.cs | 0 .../Definitions/PositionStateCharacteristic.cs | 0 .../Definitions/ProgramModeCharacteristic.cs | 0 .../ProgrammableSwitchEventCharacteristic.cs | 0 ...eHumidityDehumidifierThresholdCharacteristic.cs | 0 ...iveHumidityHumidifierThresholdCharacteristic.cs | 0 .../Definitions/RemainingDurationCharacteristic.cs | 0 .../ResetFilterIndicationCharacteristic.cs | 0 .../Definitions/RotationDirectionCharacteristic.cs | 0 .../Definitions/RotationSpeedCharacteristic.cs | 0 .../Definitions/SaturationCharacteristic.cs | 0 .../SecuritySystemAlarmTypeCharacteristic.cs | 0 .../SecuritySystemCurrentStateCharacteristic.cs | 0 .../SecuritySystemTargetStateCharacteristic.cs | 0 ...SelectedRTPStreamConfigurationCharacteristic.cs | 0 .../Definitions/SerialNumberCharacteristic.cs | 0 .../Definitions/ServiceLabelIndexCharacteristic.cs | 0 .../ServiceLabelNamespaceCharacteristic.cs | 0 .../Definitions/SetDurationCharacteristic.cs | 0 .../Definitions/SetupEndpointsCharacteristic.cs | 0 .../Definitions/SlatTypeCharacteristic.cs | 0 .../Definitions/SmokeDetectedCharacteristic.cs | 0 .../Definitions/StatusActiveCharacteristic.cs | 0 .../Definitions/StatusFaultCharacteristic.cs | 0 .../Definitions/StatusJammedCharacteristic.cs | 0 .../Definitions/StatusLowBatteryCharacteristic.cs | 0 .../Definitions/StatusTamperedCharacteristic.cs | 0 .../Definitions/StreamingStatusCharacteristic.cs | 0 .../SulphurDioxideDensityCharacteristic.cs | 0 ...portedAudioStreamConfigurationCharacteristic.cs | 0 .../SupportedRTPConfigurationCharacteristic.cs | 0 ...portedVideoStreamConfigurationCharacteristic.cs | 0 .../Definitions/SwingModeCharacteristic.cs | 0 .../TargetAirPurifierStateCharacteristic.cs | 0 .../Definitions/TargetAirQualityCharacteristic.cs | 0 .../Definitions/TargetDoorStateCharacteristic.cs | 0 .../Definitions/TargetFanStateCharacteristic.cs | 0 .../TargetHeaterCoolerStateCharacteristic.cs | 0 .../TargetHeatingCoolingStateCharacteristic.cs | 0 .../TargetHorizontalTiltAngleCharacteristic.cs | 0 ...getHumidifierDehumidifierStateCharacteristic.cs | 0 .../Definitions/TargetPositionCharacteristic.cs | 0 .../TargetRelativeHumidityCharacteristic.cs | 0 .../Definitions/TargetSlatStateCharacteristic.cs | 0 .../Definitions/TargetTemperatureCharacteristic.cs | 0 .../Definitions/TargetTiltAngleCharacteristic.cs | 0 .../TargetVerticalTiltAngleCharacteristic.cs | 0 .../TemperatureDisplayUnitsCharacteristic.cs | 0 .../Definitions/VOCDensityCharacteristic.cs | 0 .../Definitions/ValveTypeCharacteristic.cs | 0 .../Definitions/VersionCharacteristic.cs | 0 .../Definitions/VolumeCharacteristic.cs | 0 .../Definitions/WaterLevelCharacteristic.cs | 0 .../homekit/Characteristics/ICharacteristic.cs | 0 .../Characteristics/ICharacteristicProps.cs | 0 .../src/platforms/homekit/Entity/IEntity.cs | 0 .../src/platforms/homekit/Events/EventEmitter.cs | 0 .../src/platforms/homekit/Events/IEventEmitter.cs | 0 .../homekit/Homer.Platform.HomeKit.csproj | 0 .../Definitions/AccessoryInformationService.cs | 0 .../Services/Definitions/AirPurifierService.cs | 0 .../Definitions/AirQualitySensorService.cs | 0 .../Services/Definitions/BatteryServiceService.cs | 0 .../CameraRTPStreamManagementService.cs | 0 .../Definitions/CarbonDioxideSensorService.cs | 0 .../Definitions/CarbonMonoxideSensorService.cs | 0 .../Services/Definitions/ContactSensorService.cs | 0 .../homekit/Services/Definitions/DoorService.cs | 0 .../Services/Definitions/DoorbellService.cs | 0 .../homekit/Services/Definitions/FanService.cs | 0 .../homekit/Services/Definitions/Fanv2Service.cs | 0 .../homekit/Services/Definitions/FaucetService.cs | 0 .../Definitions/FilterMaintenanceService.cs | 0 .../Definitions/GarageDoorOpenerService.cs | 0 .../Services/Definitions/HeaterCoolerService.cs | 0 .../Definitions/HumidifierDehumidifierService.cs | 0 .../Services/Definitions/HumiditySensorService.cs | 0 .../Definitions/IrrigationSystemService.cs | 0 .../Services/Definitions/LeakSensorService.cs | 0 .../Services/Definitions/LightSensorService.cs | 0 .../Services/Definitions/LightbulbService.cs | 0 .../Services/Definitions/LockManagementService.cs | 0 .../Services/Definitions/LockMechanismService.cs | 0 .../Services/Definitions/MicrophoneService.cs | 0 .../Services/Definitions/MotionSensorService.cs | 0 .../Services/Definitions/OccupancySensorService.cs | 0 .../homekit/Services/Definitions/OutletService.cs | 0 .../Services/Definitions/SecuritySystemService.cs | 0 .../Services/Definitions/ServiceLabelService.cs | 0 .../homekit/Services/Definitions/SlatService.cs | 0 .../Services/Definitions/SmokeSensorService.cs | 0 .../homekit/Services/Definitions/SpeakerService.cs | 0 .../StatelessProgrammableSwitchService.cs | 0 .../homekit/Services/Definitions/SwitchService.cs | 0 .../Definitions/TemperatureSensorService.cs | 0 .../Services/Definitions/ThermostatService.cs | 0 .../homekit/Services/Definitions/ValveService.cs | 0 .../Services/Definitions/WindowCoveringService.cs | 0 .../homekit/Services/Definitions/WindowService.cs | 0 .../src/platforms/homekit/Services/IService.cs | 0 .../src/platforms/homekit/Services/Service.cs | 0 .../homekit/config/platforms/homekit/.gitignore | 0 .../homekit/config/platforms/homekit/default.yaml | 0 .../config/platforms/homekit/development.yaml | 0 .../config/platforms/homekit/production.yaml | 0 .../homekit/config/platforms/homekit/test.yaml | 0 .../Definitions/ProtocolInformationService.cs | 14 -------------- 243 files changed, 14 deletions(-) rename {dotnet.core => dotnet-core}/GitVersion.yml (100%) rename {dotnet.core => dotnet-core}/build.cmd (100%) rename {dotnet.core => dotnet-core}/build.ps1 (100%) rename {dotnet.core => dotnet-core}/build.sh (100%) rename {dotnet.core => dotnet-core}/build/Build.cs (100%) rename {dotnet.core => dotnet-core}/build/Homer.Build.csproj (100%) rename {dotnet.core => dotnet-core}/global.json (100%) rename {dotnet.core => dotnet-core}/homer.sln (100%) rename {dotnet.core => dotnet-core}/src/core/Homer.Core.csproj (100%) rename {dotnet.core => dotnet-core}/src/core/Host/IServerHost.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Host/ServerHost.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Bootstrap/Bootstrapper.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Bootstrap/IBootstrapper.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Culture.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Factories/Core/CoreFactory.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Factories/Core/ICoreFactory.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Logging/ILogManager.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Logging/LogManager.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Registries/CoreRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Registries/FactoryRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Registries/IRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Registries/ServiceRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Registries/StorageRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/ConfigurationService.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/IConfigurationService.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/IService.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Internals/Services/Runtime/RuntimeInfoService.cs (100%) rename {dotnet.core => dotnet-core}/src/core/Utils/IO/FileHelper.cs (100%) rename {dotnet.core => dotnet-core}/src/core/config/.gitignore (100%) rename {dotnet.core => dotnet-core}/src/core/config/default.yaml (100%) rename {dotnet.core => dotnet-core}/src/core/config/development.yaml (100%) rename {dotnet.core => dotnet-core}/src/core/config/production.yaml (100%) rename {dotnet.core => dotnet-core}/src/core/config/test.yaml (100%) rename {dotnet.core => dotnet-core}/src/homer/Homer.csproj (100%) rename {dotnet.core => dotnet-core}/src/homer/Internals/ServerRegistry.cs (100%) rename {dotnet.core => dotnet-core}/src/homer/Program.cs (100%) rename {dotnet.core => dotnet-core}/src/homer/Servers/IServer.cs (100%) rename {dotnet.core => dotnet-core}/src/homer/Servers/Server.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/Accessory.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/AccessoryBase.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/AccessoryCategory.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/IAccessory.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/IAccessoryBase.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Bridges/Bridge.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Bridges/IBridge.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Characteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/CharacteristicFormat.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/CharacteristicPermission.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/CharacteristicUnit.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/ICharacteristic.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Characteristics/ICharacteristicProps.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Entity/IEntity.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Events/EventEmitter.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Events/IEventEmitter.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Homer.Platform.HomeKit.csproj (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/AirPurifierService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/ContactSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/DoorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/DoorbellService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/FanService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/Fanv2Service.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/FaucetService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/LeakSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/LightSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/LightbulbService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/LockManagementService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/LockMechanismService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/MicrophoneService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/MotionSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/OutletService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/SlatService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/SpeakerService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/SwitchService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/ThermostatService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/ValveService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Definitions/WindowService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/IService.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/Services/Service.cs (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/config/platforms/homekit/.gitignore (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/config/platforms/homekit/default.yaml (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/config/platforms/homekit/development.yaml (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/config/platforms/homekit/production.yaml (100%) rename {dotnet.core => dotnet-core}/src/platforms/homekit/config/platforms/homekit/test.yaml (100%) delete mode 100644 dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs diff --git a/dotnet.core/GitVersion.yml b/dotnet-core/GitVersion.yml similarity index 100% rename from dotnet.core/GitVersion.yml rename to dotnet-core/GitVersion.yml diff --git a/dotnet.core/build.cmd b/dotnet-core/build.cmd similarity index 100% rename from dotnet.core/build.cmd rename to dotnet-core/build.cmd diff --git a/dotnet.core/build.ps1 b/dotnet-core/build.ps1 similarity index 100% rename from dotnet.core/build.ps1 rename to dotnet-core/build.ps1 diff --git a/dotnet.core/build.sh b/dotnet-core/build.sh similarity index 100% rename from dotnet.core/build.sh rename to dotnet-core/build.sh diff --git a/dotnet.core/build/Build.cs b/dotnet-core/build/Build.cs similarity index 100% rename from dotnet.core/build/Build.cs rename to dotnet-core/build/Build.cs diff --git a/dotnet.core/build/Homer.Build.csproj b/dotnet-core/build/Homer.Build.csproj similarity index 100% rename from dotnet.core/build/Homer.Build.csproj rename to dotnet-core/build/Homer.Build.csproj diff --git a/dotnet.core/global.json b/dotnet-core/global.json similarity index 100% rename from dotnet.core/global.json rename to dotnet-core/global.json diff --git a/dotnet.core/homer.sln b/dotnet-core/homer.sln similarity index 100% rename from dotnet.core/homer.sln rename to dotnet-core/homer.sln diff --git a/dotnet.core/src/core/Homer.Core.csproj b/dotnet-core/src/core/Homer.Core.csproj similarity index 100% rename from dotnet.core/src/core/Homer.Core.csproj rename to dotnet-core/src/core/Homer.Core.csproj diff --git a/dotnet.core/src/core/Host/IServerHost.cs b/dotnet-core/src/core/Host/IServerHost.cs similarity index 100% rename from dotnet.core/src/core/Host/IServerHost.cs rename to dotnet-core/src/core/Host/IServerHost.cs diff --git a/dotnet.core/src/core/Host/ServerHost.cs b/dotnet-core/src/core/Host/ServerHost.cs similarity index 100% rename from dotnet.core/src/core/Host/ServerHost.cs rename to dotnet-core/src/core/Host/ServerHost.cs diff --git a/dotnet.core/src/core/Internals/Bootstrap/Bootstrapper.cs b/dotnet-core/src/core/Internals/Bootstrap/Bootstrapper.cs similarity index 100% rename from dotnet.core/src/core/Internals/Bootstrap/Bootstrapper.cs rename to dotnet-core/src/core/Internals/Bootstrap/Bootstrapper.cs diff --git a/dotnet.core/src/core/Internals/Bootstrap/IBootstrapper.cs b/dotnet-core/src/core/Internals/Bootstrap/IBootstrapper.cs similarity index 100% rename from dotnet.core/src/core/Internals/Bootstrap/IBootstrapper.cs rename to dotnet-core/src/core/Internals/Bootstrap/IBootstrapper.cs diff --git a/dotnet.core/src/core/Internals/Culture.cs b/dotnet-core/src/core/Internals/Culture.cs similarity index 100% rename from dotnet.core/src/core/Internals/Culture.cs rename to dotnet-core/src/core/Internals/Culture.cs diff --git a/dotnet.core/src/core/Internals/Factories/Core/CoreFactory.cs b/dotnet-core/src/core/Internals/Factories/Core/CoreFactory.cs similarity index 100% rename from dotnet.core/src/core/Internals/Factories/Core/CoreFactory.cs rename to dotnet-core/src/core/Internals/Factories/Core/CoreFactory.cs diff --git a/dotnet.core/src/core/Internals/Factories/Core/ICoreFactory.cs b/dotnet-core/src/core/Internals/Factories/Core/ICoreFactory.cs similarity index 100% rename from dotnet.core/src/core/Internals/Factories/Core/ICoreFactory.cs rename to dotnet-core/src/core/Internals/Factories/Core/ICoreFactory.cs diff --git a/dotnet.core/src/core/Internals/Logging/ILogManager.cs b/dotnet-core/src/core/Internals/Logging/ILogManager.cs similarity index 100% rename from dotnet.core/src/core/Internals/Logging/ILogManager.cs rename to dotnet-core/src/core/Internals/Logging/ILogManager.cs diff --git a/dotnet.core/src/core/Internals/Logging/LogManager.cs b/dotnet-core/src/core/Internals/Logging/LogManager.cs similarity index 100% rename from dotnet.core/src/core/Internals/Logging/LogManager.cs rename to dotnet-core/src/core/Internals/Logging/LogManager.cs diff --git a/dotnet.core/src/core/Internals/Registries/CoreRegistry.cs b/dotnet-core/src/core/Internals/Registries/CoreRegistry.cs similarity index 100% rename from dotnet.core/src/core/Internals/Registries/CoreRegistry.cs rename to dotnet-core/src/core/Internals/Registries/CoreRegistry.cs diff --git a/dotnet.core/src/core/Internals/Registries/FactoryRegistry.cs b/dotnet-core/src/core/Internals/Registries/FactoryRegistry.cs similarity index 100% rename from dotnet.core/src/core/Internals/Registries/FactoryRegistry.cs rename to dotnet-core/src/core/Internals/Registries/FactoryRegistry.cs diff --git a/dotnet.core/src/core/Internals/Registries/IRegistry.cs b/dotnet-core/src/core/Internals/Registries/IRegistry.cs similarity index 100% rename from dotnet.core/src/core/Internals/Registries/IRegistry.cs rename to dotnet-core/src/core/Internals/Registries/IRegistry.cs diff --git a/dotnet.core/src/core/Internals/Registries/ServiceRegistry.cs b/dotnet-core/src/core/Internals/Registries/ServiceRegistry.cs similarity index 100% rename from dotnet.core/src/core/Internals/Registries/ServiceRegistry.cs rename to dotnet-core/src/core/Internals/Registries/ServiceRegistry.cs diff --git a/dotnet.core/src/core/Internals/Registries/StorageRegistry.cs b/dotnet-core/src/core/Internals/Registries/StorageRegistry.cs similarity index 100% rename from dotnet.core/src/core/Internals/Registries/StorageRegistry.cs rename to dotnet-core/src/core/Internals/Registries/StorageRegistry.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/ConfigurationService.cs b/dotnet-core/src/core/Internals/Services/Configuration/ConfigurationService.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/ConfigurationService.cs rename to dotnet-core/src/core/Internals/Services/Configuration/ConfigurationService.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/IConfigurationService.cs b/dotnet-core/src/core/Internals/Services/Configuration/IConfigurationService.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/IConfigurationService.cs rename to dotnet-core/src/core/Internals/Services/Configuration/IConfigurationService.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/ConfigurationModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/IConfigurationModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/AccessoryLogModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/ConsoleLogModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/FileLogModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/LogsModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Logs/MasterLogModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/HomekitModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/Homekit/Setup/SetupModel.cs diff --git a/dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs b/dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs rename to dotnet-core/src/core/Internals/Services/Configuration/Models/Platforms/PlatformsModel.cs diff --git a/dotnet.core/src/core/Internals/Services/IService.cs b/dotnet-core/src/core/Internals/Services/IService.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/IService.cs rename to dotnet-core/src/core/Internals/Services/IService.cs diff --git a/dotnet.core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs b/dotnet-core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs rename to dotnet-core/src/core/Internals/Services/Runtime/IRuntimeInfoService.cs diff --git a/dotnet.core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs b/dotnet-core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs similarity index 100% rename from dotnet.core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs rename to dotnet-core/src/core/Internals/Services/Runtime/RuntimeInfoService.cs diff --git a/dotnet.core/src/core/Utils/IO/FileHelper.cs b/dotnet-core/src/core/Utils/IO/FileHelper.cs similarity index 100% rename from dotnet.core/src/core/Utils/IO/FileHelper.cs rename to dotnet-core/src/core/Utils/IO/FileHelper.cs diff --git a/dotnet.core/src/core/config/.gitignore b/dotnet-core/src/core/config/.gitignore similarity index 100% rename from dotnet.core/src/core/config/.gitignore rename to dotnet-core/src/core/config/.gitignore diff --git a/dotnet.core/src/core/config/default.yaml b/dotnet-core/src/core/config/default.yaml similarity index 100% rename from dotnet.core/src/core/config/default.yaml rename to dotnet-core/src/core/config/default.yaml diff --git a/dotnet.core/src/core/config/development.yaml b/dotnet-core/src/core/config/development.yaml similarity index 100% rename from dotnet.core/src/core/config/development.yaml rename to dotnet-core/src/core/config/development.yaml diff --git a/dotnet.core/src/core/config/production.yaml b/dotnet-core/src/core/config/production.yaml similarity index 100% rename from dotnet.core/src/core/config/production.yaml rename to dotnet-core/src/core/config/production.yaml diff --git a/dotnet.core/src/core/config/test.yaml b/dotnet-core/src/core/config/test.yaml similarity index 100% rename from dotnet.core/src/core/config/test.yaml rename to dotnet-core/src/core/config/test.yaml diff --git a/dotnet.core/src/homer/Homer.csproj b/dotnet-core/src/homer/Homer.csproj similarity index 100% rename from dotnet.core/src/homer/Homer.csproj rename to dotnet-core/src/homer/Homer.csproj diff --git a/dotnet.core/src/homer/Internals/ServerRegistry.cs b/dotnet-core/src/homer/Internals/ServerRegistry.cs similarity index 100% rename from dotnet.core/src/homer/Internals/ServerRegistry.cs rename to dotnet-core/src/homer/Internals/ServerRegistry.cs diff --git a/dotnet.core/src/homer/Program.cs b/dotnet-core/src/homer/Program.cs similarity index 100% rename from dotnet.core/src/homer/Program.cs rename to dotnet-core/src/homer/Program.cs diff --git a/dotnet.core/src/homer/Servers/IServer.cs b/dotnet-core/src/homer/Servers/IServer.cs similarity index 100% rename from dotnet.core/src/homer/Servers/IServer.cs rename to dotnet-core/src/homer/Servers/IServer.cs diff --git a/dotnet.core/src/homer/Servers/Server.cs b/dotnet-core/src/homer/Servers/Server.cs similarity index 100% rename from dotnet.core/src/homer/Servers/Server.cs rename to dotnet-core/src/homer/Servers/Server.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/Accessory.cs b/dotnet-core/src/platforms/homekit/Accessories/Accessory.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/Accessory.cs rename to dotnet-core/src/platforms/homekit/Accessories/Accessory.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/AccessoryBase.cs b/dotnet-core/src/platforms/homekit/Accessories/AccessoryBase.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/AccessoryBase.cs rename to dotnet-core/src/platforms/homekit/Accessories/AccessoryBase.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/AccessoryCategory.cs b/dotnet-core/src/platforms/homekit/Accessories/AccessoryCategory.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/AccessoryCategory.cs rename to dotnet-core/src/platforms/homekit/Accessories/AccessoryCategory.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/IAccessory.cs b/dotnet-core/src/platforms/homekit/Accessories/IAccessory.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/IAccessory.cs rename to dotnet-core/src/platforms/homekit/Accessories/IAccessory.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/IAccessoryBase.cs b/dotnet-core/src/platforms/homekit/Accessories/IAccessoryBase.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/IAccessoryBase.cs rename to dotnet-core/src/platforms/homekit/Accessories/IAccessoryBase.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs b/dotnet-core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs rename to dotnet-core/src/platforms/homekit/Accessories/Info/AccessoryInfo.cs diff --git a/dotnet.core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs b/dotnet-core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs rename to dotnet-core/src/platforms/homekit/Accessories/Info/IAcessoryInfo.cs diff --git a/dotnet.core/src/platforms/homekit/Bridges/Bridge.cs b/dotnet-core/src/platforms/homekit/Bridges/Bridge.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Bridges/Bridge.cs rename to dotnet-core/src/platforms/homekit/Bridges/Bridge.cs diff --git a/dotnet.core/src/platforms/homekit/Bridges/IBridge.cs b/dotnet-core/src/platforms/homekit/Bridges/IBridge.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Bridges/IBridge.cs rename to dotnet-core/src/platforms/homekit/Bridges/IBridge.cs diff --git a/dotnet.core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs b/dotnet-core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs rename to dotnet-core/src/platforms/homekit/Caches/Identifiers/IIdentifierCache.cs diff --git a/dotnet.core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs b/dotnet-core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs rename to dotnet-core/src/platforms/homekit/Caches/Identifiers/IdentifierCache.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Characteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Characteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Characteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Characteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs b/dotnet-core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs rename to dotnet-core/src/platforms/homekit/Characteristics/CharacteristicFormat.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs b/dotnet-core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs rename to dotnet-core/src/platforms/homekit/Characteristics/CharacteristicPermission.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs b/dotnet-core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs rename to dotnet-core/src/platforms/homekit/Characteristics/CharacteristicUnit.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AccessoryFlagsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ActiveCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AdministratorOnlyAccessCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirParticulateDensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirParticulateSizeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AirQualityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/AudioFeedbackCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/BatteryLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/BrightnessCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxideLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonDioxidePeakLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxideLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CarbonMonoxidePeakLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ChargingStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ColorTemperatureCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ContactSensorStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CoolingThresholdTemperatureCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentAirPurifierStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentAmbientLightLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentDoorStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentFanStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHeaterCoolerStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHeatingCoolingStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHorizontalTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentHumidifierDehumidifierStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentPositionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentRelativeHumidityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentSlatStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentTemperatureCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/CurrentVerticalTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/DigitalZoomCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/FilterChangeIndicationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/FilterLifeLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/FirmwareRevisionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/HardwareRevisionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/HeatingThresholdTemperatureCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/HoldPositionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/HueCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/IdentifyCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ImageMirroringCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ImageRotationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/InUseCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/IsConfiguredCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LeakDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockControlPointCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockCurrentStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockLastKnownActionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockManagementAutoSecurityTimeoutCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockPhysicalControlsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LockTargetStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/LogsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ManufacturerCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ModelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/MotionDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/MuteCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/NameCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/NightVisionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/NitrogenDioxideDensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ObstructionDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/OccupancyDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/OnCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/OpticalZoomCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/OutletInUseCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/OzoneDensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PM10DensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PM2_5DensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairSetupCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairVerifyCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairingFeaturesCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PairingPairingsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/PositionStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ProgramModeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ProgrammableSwitchEventCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityDehumidifierThresholdCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/RelativeHumidityHumidifierThresholdCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/RemainingDurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ResetFilterIndicationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/RotationDirectionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/RotationSpeedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SaturationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemAlarmTypeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemCurrentStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SecuritySystemTargetStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SelectedRTPStreamConfigurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SerialNumberCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelIndexCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ServiceLabelNamespaceCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SetDurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SetupEndpointsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SlatTypeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SmokeDetectedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusActiveCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusFaultCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusJammedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusLowBatteryCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StatusTamperedCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/StreamingStatusCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SulphurDioxideDensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedAudioStreamConfigurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedRTPConfigurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SupportedVideoStreamConfigurationCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/SwingModeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetAirPurifierStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetAirQualityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetDoorStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetFanStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHeaterCoolerStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHeatingCoolingStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHorizontalTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetHumidifierDehumidifierStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetPositionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetRelativeHumidityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetSlatStateCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetTemperatureCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TargetVerticalTiltAngleCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/TemperatureDisplayUnitsCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/VOCDensityCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/ValveTypeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/VersionCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/VolumeCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/Definitions/WaterLevelCharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/ICharacteristic.cs b/dotnet-core/src/platforms/homekit/Characteristics/ICharacteristic.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/ICharacteristic.cs rename to dotnet-core/src/platforms/homekit/Characteristics/ICharacteristic.cs diff --git a/dotnet.core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs b/dotnet-core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs rename to dotnet-core/src/platforms/homekit/Characteristics/ICharacteristicProps.cs diff --git a/dotnet.core/src/platforms/homekit/Entity/IEntity.cs b/dotnet-core/src/platforms/homekit/Entity/IEntity.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Entity/IEntity.cs rename to dotnet-core/src/platforms/homekit/Entity/IEntity.cs diff --git a/dotnet.core/src/platforms/homekit/Events/EventEmitter.cs b/dotnet-core/src/platforms/homekit/Events/EventEmitter.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Events/EventEmitter.cs rename to dotnet-core/src/platforms/homekit/Events/EventEmitter.cs diff --git a/dotnet.core/src/platforms/homekit/Events/IEventEmitter.cs b/dotnet-core/src/platforms/homekit/Events/IEventEmitter.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Events/IEventEmitter.cs rename to dotnet-core/src/platforms/homekit/Events/IEventEmitter.cs diff --git a/dotnet.core/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj similarity index 100% rename from dotnet.core/src/platforms/homekit/Homer.Platform.HomeKit.csproj rename to dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/AccessoryInformationService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/AirPurifierService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/AirQualitySensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/BatteryServiceService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/CameraRTPStreamManagementService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/CarbonDioxideSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/CarbonMonoxideSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/ContactSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/DoorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/DoorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/DoorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/DoorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/DoorbellService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/DoorbellService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/DoorbellService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/DoorbellService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/FanService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/FanService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/FanService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/FanService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/Fanv2Service.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/FaucetService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/FaucetService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/FaucetService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/FaucetService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/FilterMaintenanceService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/GarageDoorOpenerService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/HeaterCoolerService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/HumidifierDehumidifierService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/HumiditySensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/IrrigationSystemService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/LeakSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/LightSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/LightSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/LightSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/LightSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/LightbulbService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/LightbulbService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/LightbulbService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/LightbulbService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/LockManagementService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/LockManagementService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/LockManagementService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/LockManagementService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/LockMechanismService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/MicrophoneService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/MotionSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/OccupancySensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/OutletService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/OutletService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/OutletService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/OutletService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/SecuritySystemService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/ServiceLabelService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/SlatService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/SlatService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/SlatService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/SlatService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/SmokeSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/SpeakerService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/SpeakerService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/SpeakerService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/SpeakerService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/StatelessProgrammableSwitchService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/SwitchService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/SwitchService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/SwitchService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/SwitchService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/TemperatureSensorService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/ThermostatService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/ThermostatService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/ThermostatService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/ThermostatService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/ValveService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/ValveService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/ValveService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/ValveService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/WindowCoveringService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/WindowService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/WindowService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Definitions/WindowService.cs rename to dotnet-core/src/platforms/homekit/Services/Definitions/WindowService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/IService.cs b/dotnet-core/src/platforms/homekit/Services/IService.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/IService.cs rename to dotnet-core/src/platforms/homekit/Services/IService.cs diff --git a/dotnet.core/src/platforms/homekit/Services/Service.cs b/dotnet-core/src/platforms/homekit/Services/Service.cs similarity index 100% rename from dotnet.core/src/platforms/homekit/Services/Service.cs rename to dotnet-core/src/platforms/homekit/Services/Service.cs diff --git a/dotnet.core/src/platforms/homekit/config/platforms/homekit/.gitignore b/dotnet-core/src/platforms/homekit/config/platforms/homekit/.gitignore similarity index 100% rename from dotnet.core/src/platforms/homekit/config/platforms/homekit/.gitignore rename to dotnet-core/src/platforms/homekit/config/platforms/homekit/.gitignore diff --git a/dotnet.core/src/platforms/homekit/config/platforms/homekit/default.yaml b/dotnet-core/src/platforms/homekit/config/platforms/homekit/default.yaml similarity index 100% rename from dotnet.core/src/platforms/homekit/config/platforms/homekit/default.yaml rename to dotnet-core/src/platforms/homekit/config/platforms/homekit/default.yaml diff --git a/dotnet.core/src/platforms/homekit/config/platforms/homekit/development.yaml b/dotnet-core/src/platforms/homekit/config/platforms/homekit/development.yaml similarity index 100% rename from dotnet.core/src/platforms/homekit/config/platforms/homekit/development.yaml rename to dotnet-core/src/platforms/homekit/config/platforms/homekit/development.yaml diff --git a/dotnet.core/src/platforms/homekit/config/platforms/homekit/production.yaml b/dotnet-core/src/platforms/homekit/config/platforms/homekit/production.yaml similarity index 100% rename from dotnet.core/src/platforms/homekit/config/platforms/homekit/production.yaml rename to dotnet-core/src/platforms/homekit/config/platforms/homekit/production.yaml diff --git a/dotnet.core/src/platforms/homekit/config/platforms/homekit/test.yaml b/dotnet-core/src/platforms/homekit/config/platforms/homekit/test.yaml similarity index 100% rename from dotnet.core/src/platforms/homekit/config/platforms/homekit/test.yaml rename to dotnet-core/src/platforms/homekit/config/platforms/homekit/test.yaml diff --git a/dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs b/dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs deleted file mode 100644 index df31804..0000000 --- a/dotnet.core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Homer.Platform.HomeKit.Characteristics.Definitions; - -namespace Homer.Platform.HomeKit.Services.Definitions -{ - public class ProtocolInformationService: Service - { - public ProtocolInformationService() - : base("000000A2-0000-1000-8000-0026BB765291", "Protocol Information") - { - // required characteristics. - AddCharacteristic(typeof(VersionCharacteristic)); - } - } -} From 08a4c9d6e239eb97c22a9e392a79dee44a8a54e4 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 14:58:50 +0300 Subject: [PATCH 108/152] fix github actions dotnet-core builds. --- .github/workflows/dotnetcore.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 2dfbea2..217fb91 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -16,6 +16,6 @@ jobs: #- name: run mongodb # run: sudo docker run --name mongo -d -p 27017:27017 mongo - name: build - run: ./build.sh + run: ./dotnet-core/build.sh - name: test run: dotnet test From 42a6c57da88d9f710efeb11e658082c0725f7d70 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 14:59:18 +0300 Subject: [PATCH 109/152] another fix for github builds. --- .github/workflows/dotnetcore.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 217fb91..2ee8a55 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -1,9 +1,7 @@ -name: dotnet-core - +name: build on: [push] - jobs: - build: + dotnetcore: runs-on: ubuntu-latest From b9d5ee4e0b0b818bae595f8c4bdb908f71fc20b3 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:00:53 +0300 Subject: [PATCH 110/152] fix github builds. --- dotnet-core/build.cmd | 0 dotnet-core/build.ps1 | 0 dotnet-core/build.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 dotnet-core/build.cmd mode change 100644 => 100755 dotnet-core/build.ps1 mode change 100644 => 100755 dotnet-core/build.sh diff --git a/dotnet-core/build.cmd b/dotnet-core/build.cmd old mode 100644 new mode 100755 diff --git a/dotnet-core/build.ps1 b/dotnet-core/build.ps1 old mode 100644 new mode 100755 diff --git a/dotnet-core/build.sh b/dotnet-core/build.sh old mode 100644 new mode 100755 From c80852d8739cb3c87873c32315b0dc2d4771234c Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:02:14 +0300 Subject: [PATCH 111/152] another fix for github builds. --- dotnet-core/build/Build.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet-core/build/Build.cs b/dotnet-core/build/Build.cs index e30e6d3..ff98e0f 100644 --- a/dotnet-core/build/Build.cs +++ b/dotnet-core/build/Build.cs @@ -70,9 +70,9 @@ public void OnExecute(CommandLineApplication app) var projects = new [] { "contrib/uuid.net/uuid.net.csproj", - "src/platforms/homekit/Homer.Platform.HomeKit.csproj", - "src/core/Homer.Core.csproj", - "src/homer/Homer.csproj" + "dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj", + "dotnet-core/src/core/Homer.Core.csproj", + "dotnet-core/src/homer/Homer.csproj" }; var testProjects = new string[] From e5335383d84a145f5b4e7a4d4840f23bcaf43e19 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:12:52 +0300 Subject: [PATCH 112/152] fixed dotnet-core project's builds. added artifacts support to github ci builds. --- .github/workflows/dotnetcore.yml | 4 +++ dotnet-core/build/Build.cs | 8 ++--- dotnet-core/homer.sln | 30 +++++++++---------- dotnet-core/src/homer/Homer.csproj | 2 +- .../homekit/Homer.Platform.HomeKit.csproj | 2 +- .../Definitions/ProtocolInformationService.cs | 14 +++++++++ 6 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 dotnet-core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 2ee8a55..be66c6d 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -17,3 +17,7 @@ jobs: run: ./dotnet-core/build.sh - name: test run: dotnet test + - uses: actions/upload-artifact@v1 + with: + name: artifacts + path: dotnet-core/bin diff --git a/dotnet-core/build/Build.cs b/dotnet-core/build/Build.cs index ff98e0f..896517a 100644 --- a/dotnet-core/build/Build.cs +++ b/dotnet-core/build/Build.cs @@ -69,10 +69,10 @@ public void OnExecute(CommandLineApplication app) var projects = new [] { - "contrib/uuid.net/uuid.net.csproj", - "dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj", - "dotnet-core/src/core/Homer.Core.csproj", - "dotnet-core/src/homer/Homer.csproj" + "../contrib/uuid.net/uuid.net.csproj", + "src/platforms/homekit/Homer.Platform.HomeKit.csproj", + "src/core/Homer.Core.csproj", + "src/homer/Homer.csproj" }; var testProjects = new string[] diff --git a/dotnet-core/homer.sln b/dotnet-core/homer.sln index 12c152e..16770d0 100644 --- a/dotnet-core/homer.sln +++ b/dotnet-core/homer.sln @@ -11,12 +11,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Platform.HomeKit", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Build", "build\Homer.Build.csproj", "{270DC829-5D6A-4A10-AADF-1C5302651C19}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "contrib\uuid.net\uuid.net.csproj", "{A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer.Core", "src\core\Homer.Core.csproj", "{DE52E76D-1044-4EFC-974A-30389D2AE72D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Homer", "src\homer\Homer.csproj", "{D362FFFD-D370-41BF-AA7B-596D0540A8C1}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "uuid.net", "..\contrib\uuid.net\uuid.net.csproj", "{916ECD21-AD24-4F05-8819-B8478F825A89}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,18 +51,6 @@ Global {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x64.Build.0 = Release|x64 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.ActiveCfg = Release|x86 {270DC829-5D6A-4A10-AADF-1C5302651C19}.Release|x86.Build.0 = Release|x86 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.ActiveCfg = Debug|x64 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x64.Build.0 = Debug|x64 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.ActiveCfg = Debug|x86 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Debug|x86.Build.0 = Debug|x86 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|Any CPU.Build.0 = Release|Any CPU - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.ActiveCfg = Release|x64 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x64.Build.0 = Release|x64 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.ActiveCfg = Release|x86 - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25}.Release|x86.Build.0 = Release|x86 {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE52E76D-1044-4EFC-974A-30389D2AE72D}.Debug|x64.ActiveCfg = Debug|x64 @@ -87,13 +75,25 @@ Global {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x64.Build.0 = Release|x64 {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x86.ActiveCfg = Release|x86 {D362FFFD-D370-41BF-AA7B-596D0540A8C1}.Release|x86.Build.0 = Release|x86 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|x64.ActiveCfg = Debug|x64 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|x64.Build.0 = Debug|x64 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|x86.ActiveCfg = Debug|x86 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Debug|x86.Build.0 = Debug|x86 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|Any CPU.Build.0 = Release|Any CPU + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|x64.ActiveCfg = Release|x64 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|x64.Build.0 = Release|x64 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|x86.ActiveCfg = Release|x86 + {916ECD21-AD24-4F05-8819-B8478F825A89}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {75D7361A-EEC0-489C-AA21-3B0511668D9D} = {ED96F7FE-6FF3-4C84-9976-46D2C8557E8A} - {A7F57E76-2DD1-4E29-97E0-BBB27DAB3F25} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} + {916ECD21-AD24-4F05-8819-B8478F825A89} = {EA45AF70-3539-4CB4-9DC5-49CCCAD21A9A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AFE6693E-8F99-43D6-8CAA-B27A77B81AF6} diff --git a/dotnet-core/src/homer/Homer.csproj b/dotnet-core/src/homer/Homer.csproj index 13cc815..1e5e03b 100644 --- a/dotnet-core/src/homer/Homer.csproj +++ b/dotnet-core/src/homer/Homer.csproj @@ -31,7 +31,7 @@ - + diff --git a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj index e479d4e..c67172c 100644 --- a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -29,7 +29,7 @@ - + diff --git a/dotnet-core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs b/dotnet-core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs new file mode 100644 index 0000000..371fe2b --- /dev/null +++ b/dotnet-core/src/platforms/homekit/Services/Definitions/ProtocolInformationService.cs @@ -0,0 +1,14 @@ +using Homer.Platform.HomeKit.Characteristics.Definitions; + +namespace Homer.Platform.HomeKit.Services.Definitions +{ + public class ProtocolInformationService : Service + { + public ProtocolInformationService() + : base("000000A2-0000-1000-8000-0026BB765291", "Protocol Information") + { + // required characteristics. + AddCharacteristic(typeof(VersionCharacteristic)); + } + } +} \ No newline at end of file From 034ee4564ada9056ea3139f689bff665e6f3befd Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:13:53 +0300 Subject: [PATCH 113/152] fix github builds. --- .github/workflows/dotnetcore.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index be66c6d..68d0d15 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -14,7 +14,7 @@ jobs: #- name: run mongodb # run: sudo docker run --name mongo -d -p 27017:27017 mongo - name: build - run: ./dotnet-core/build.sh + run: dotnet-core/build.sh - name: test run: dotnet test - uses: actions/upload-artifact@v1 From e0cb10e08440a23baabf46fbf03705a2d9a909ad Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:18:36 +0300 Subject: [PATCH 114/152] updated dotnetcore-sdk version. --- dotnet-core/global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet-core/global.json b/dotnet-core/global.json index 7c33201..f1c2b2b 100644 --- a/dotnet-core/global.json +++ b/dotnet-core/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.1.100" + "version": "3.1.101" } } \ No newline at end of file From b33f7847439c08168c7c94acf0ac717bbf9e8d0e Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:21:15 +0300 Subject: [PATCH 115/152] aonther github ci fix. --- .github/workflows/{dotnetcore.yml => build.yml} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename .github/workflows/{dotnetcore.yml => build.yml} (79%) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/build.yml similarity index 79% rename from .github/workflows/dotnetcore.yml rename to .github/workflows/build.yml index 68d0d15..cad4061 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/build.yml @@ -10,13 +10,13 @@ jobs: - name: install dotnet core 3.1 uses: actions/setup-dotnet@v1 with: - dotnet-version: 3.1.100 + dotnet-version: 3.1.101 #- name: run mongodb # run: sudo docker run --name mongo -d -p 27017:27017 mongo - name: build - run: dotnet-core/build.sh + run: cd dotnet-core && ./build.sh - name: test - run: dotnet test + run: cd dotnet-core && dotnet test - uses: actions/upload-artifact@v1 with: name: artifacts From 1ea652c8016d62d54d0983e408356da8d997bd44 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:29:58 +0300 Subject: [PATCH 116/152] test gitversion. --- .github/workflows/build.yml | 47 +++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cad4061..6f57064 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,17 +2,54 @@ name: build on: [push] jobs: dotnetcore: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 + - name: Checkout + uses: actions/checkout@v2 + - name: Fetch all history for all tags and branches + run: git fetch --prune --unshallow + - name: Install GitVersion + uses: gittools/actions/gitversion/setup@v0.9 + with: + versionSpec: '5.1.x' - name: install dotnet core 3.1 uses: actions/setup-dotnet@v1 with: dotnet-version: 3.1.101 - #- name: run mongodb - # run: sudo docker run --name mongo -d -p 27017:27017 mongo + - name: Use GitVersion + id: gitversion # step id used as reference for output values + uses: gittools/actions/gitversion/execute@v0.9 + - run: | + echo "Major: ${{ steps.gitversion.outputs.major }}" + echo "Minor: ${{ steps.gitversion.outputs.minor }}" + echo "Patch: ${{ steps.gitversion.outputs.patch }}" + echo "PreReleaseTag: ${{ steps.gitversion.outputs.preReleaseTag }}" + echo "PreReleaseTagWithDash: ${{ steps.gitversion.outputs.preReleaseTagWithDash }}" + echo "PreReleaseLabel: ${{ steps.gitversion.outputs.preReleaseLabel }}" + echo "PreReleaseNumber: ${{ steps.gitversion.outputs.preReleaseNumber }}" + echo "WeightedPreReleaseNumber: ${{ steps.gitversion.outputs.weightedPreReleaseNumber }}" + echo "BuildMetaData: ${{ steps.gitversion.outputs.buildMetaData }}" + echo "BuildMetaDataPadded: ${{ steps.gitversion.outputs.buildMetaDataPadded }}" + echo "FullBuildMetaData: ${{ steps.gitversion.outputs.fullBuildMetaData }}" + echo "MajorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }}" + echo "SemVer: ${{ steps.gitversion.outputs.semVer }}" + echo "LegacySemVer: ${{ steps.gitversion.outputs.legacySemVer }}" + echo "LegacySemVerPadded: ${{ steps.gitversion.outputs.legacySemVerPadded }}" + echo "AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}" + echo "AssemblySemFileVer: ${{ steps.gitversion.outputs.assemblySemFileVer }}" + echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" + echo "InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}" + echo "BranchName: ${{ steps.gitversion.outputs.branchName }}" + echo "Sha: ${{ steps.gitversion.outputs.sha }}" + echo "ShortSha: ${{ steps.gitversion.outputs.shortSha }}" + echo "NuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }}" + echo "NuGetVersion: ${{ steps.gitversion.outputs.nuGetVersion }}" + echo "NuGetPreReleaseTagV2: ${{ steps.gitversion.outputs.nuGetPreReleaseTagV2 }}" + echo "NuGetPreReleaseTag: ${{ steps.gitversion.outputs.nuGetPreReleaseTag }}" + echo "VersionSourceSha: ${{ steps.gitversion.outputs.versionSourceSha }}" + echo "CommitsSinceVersionSource: ${{ steps.gitversion.outputs.commitsSinceVersionSource }}" + echo "CommitsSinceVersionSourcePadded: ${{ steps.gitversion.outputs.commitsSinceVersionSourcePadded }}" + echo "CommitDate: ${{ steps.gitversion.outputs.commitDate }}" - name: build run: cd dotnet-core && ./build.sh - name: test From 4090f770fbc3eb720d71e89ab5b0da5f035755a6 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:33:11 +0300 Subject: [PATCH 117/152] fix artifact names --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6f57064..22ab51e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,14 +8,14 @@ jobs: uses: actions/checkout@v2 - name: Fetch all history for all tags and branches run: git fetch --prune --unshallow - - name: Install GitVersion - uses: gittools/actions/gitversion/setup@v0.9 - with: - versionSpec: '5.1.x' - name: install dotnet core 3.1 uses: actions/setup-dotnet@v1 with: dotnet-version: 3.1.101 + - name: Install GitVersion + uses: gittools/actions/gitversion/setup@v0.9 + with: + versionSpec: '5.1.x' - name: Use GitVersion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 @@ -56,5 +56,5 @@ jobs: run: cd dotnet-core && dotnet test - uses: actions/upload-artifact@v1 with: - name: artifacts + name: ${{ steps.gitversion.outputs.fullSemVer }}-artifacts path: dotnet-core/bin From 37b3facb5a56aca99e7a2ef1b3aad924822aef03 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:34:30 +0300 Subject: [PATCH 118/152] another ci fix. --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22ab51e..1142c20 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,14 +8,14 @@ jobs: uses: actions/checkout@v2 - name: Fetch all history for all tags and branches run: git fetch --prune --unshallow - - name: install dotnet core 3.1 - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 3.1.101 - name: Install GitVersion uses: gittools/actions/gitversion/setup@v0.9 with: versionSpec: '5.1.x' + - name: install dotnet core 3.1 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.101 - name: Use GitVersion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 From 7a38c8d1547c512949f755052287c9d8bc02826a Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:38:55 +0300 Subject: [PATCH 119/152] tiny change on ci builds. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1142c20..c76ab6a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,7 @@ jobs: id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 - run: | + echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" echo "Major: ${{ steps.gitversion.outputs.major }}" echo "Minor: ${{ steps.gitversion.outputs.minor }}" echo "Patch: ${{ steps.gitversion.outputs.patch }}" @@ -37,7 +38,6 @@ jobs: echo "LegacySemVerPadded: ${{ steps.gitversion.outputs.legacySemVerPadded }}" echo "AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}" echo "AssemblySemFileVer: ${{ steps.gitversion.outputs.assemblySemFileVer }}" - echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" echo "InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}" echo "BranchName: ${{ steps.gitversion.outputs.branchName }}" echo "Sha: ${{ steps.gitversion.outputs.sha }}" From 79cd25d606cd6025f3482110d6f91c244849bb67 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:44:25 +0300 Subject: [PATCH 120/152] tiny fix on ci builds. --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c76ab6a..20e8e5e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,7 @@ jobs: - name: Use GitVersion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 + - name: build info - run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" echo "Major: ${{ steps.gitversion.outputs.major }}" From 5afbe1938545755bb5621dd2251d33ea31332105 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:47:32 +0300 Subject: [PATCH 121/152] ci builds fix. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20e8e5e..6756456 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,8 +19,8 @@ jobs: - name: Use GitVersion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 - - name: build info - - run: | + - name: build info + run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" echo "Major: ${{ steps.gitversion.outputs.major }}" echo "Minor: ${{ steps.gitversion.outputs.minor }}" From 29acdec5c97f85e2dc2fbb21d9520ab764d4acbc Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:57:52 +0300 Subject: [PATCH 122/152] ci improvements. --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6756456..5cc39c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,19 +4,19 @@ jobs: dotnetcore: runs-on: ubuntu-latest steps: - - name: Checkout + - name: checkout uses: actions/checkout@v2 - - name: Fetch all history for all tags and branches + - name: fetch all git history run: git fetch --prune --unshallow - - name: Install GitVersion + - name: install gitversion uses: gittools/actions/gitversion/setup@v0.9 with: versionSpec: '5.1.x' - - name: install dotnet core 3.1 - uses: actions/setup-dotnet@v1 + - name: setup dotnet core + uses: actions/setup-dotnet@v1.4.0 with: dotnet-version: 3.1.101 - - name: Use GitVersion + - name: gitversion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 - name: build info From 07bd5f511aaff8660e2b671025919358529214f5 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 15:59:27 +0300 Subject: [PATCH 123/152] ci fix. --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5cc39c8..da8580d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,7 +55,8 @@ jobs: run: cd dotnet-core && ./build.sh - name: test run: cd dotnet-core && dotnet test - - uses: actions/upload-artifact@v1 + - name: upload artifacts + uses: actions/upload-artifact@v1 with: name: ${{ steps.gitversion.outputs.fullSemVer }}-artifacts path: dotnet-core/bin From 1fabefa30543e6f9b6a5ebf8bd360a2c1cfd2d81 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:03:50 +0300 Subject: [PATCH 124/152] test ci matrix. --- .github/workflows/build.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index da8580d..5c17dcf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,12 @@ name: build on: [push] jobs: dotnetcore: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + dotnetcore: ['3.1.101'] + name: ${{ matrix.os }} - dotnet core ${{ matrix.dotnetcore }} steps: - name: checkout uses: actions/checkout@v2 @@ -11,11 +16,11 @@ jobs: - name: install gitversion uses: gittools/actions/gitversion/setup@v0.9 with: - versionSpec: '5.1.x' + versionSpec: '5.1.x' - name: setup dotnet core uses: actions/setup-dotnet@v1.4.0 with: - dotnet-version: 3.1.101 + dotnet-version: ${{ matrix.dotnetcore }} - name: gitversion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 @@ -58,5 +63,5 @@ jobs: - name: upload artifacts uses: actions/upload-artifact@v1 with: - name: ${{ steps.gitversion.outputs.fullSemVer }}-artifacts + name: ${{ steps.gitversion.outputs.fullSemVer }}-${{ matrix.os }}-${{ matrix.dotnetcore }}-artifacts path: dotnet-core/bin From 1a5259d7ee847083097ac5fa6fb88d97a7ca7fd8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:13:42 +0300 Subject: [PATCH 125/152] ci test. --- .github/workflows/build.yml | 41 ++++++++----------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c17dcf..c0a779d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,45 +21,20 @@ jobs: uses: actions/setup-dotnet@v1.4.0 with: dotnet-version: ${{ matrix.dotnetcore }} - - name: gitversion + - name: setup gitversion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 - name: build info run: | - echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - echo "Major: ${{ steps.gitversion.outputs.major }}" - echo "Minor: ${{ steps.gitversion.outputs.minor }}" - echo "Patch: ${{ steps.gitversion.outputs.patch }}" - echo "PreReleaseTag: ${{ steps.gitversion.outputs.preReleaseTag }}" - echo "PreReleaseTagWithDash: ${{ steps.gitversion.outputs.preReleaseTagWithDash }}" - echo "PreReleaseLabel: ${{ steps.gitversion.outputs.preReleaseLabel }}" - echo "PreReleaseNumber: ${{ steps.gitversion.outputs.preReleaseNumber }}" - echo "WeightedPreReleaseNumber: ${{ steps.gitversion.outputs.weightedPreReleaseNumber }}" - echo "BuildMetaData: ${{ steps.gitversion.outputs.buildMetaData }}" - echo "BuildMetaDataPadded: ${{ steps.gitversion.outputs.buildMetaDataPadded }}" - echo "FullBuildMetaData: ${{ steps.gitversion.outputs.fullBuildMetaData }}" - echo "MajorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }}" - echo "SemVer: ${{ steps.gitversion.outputs.semVer }}" - echo "LegacySemVer: ${{ steps.gitversion.outputs.legacySemVer }}" - echo "LegacySemVerPadded: ${{ steps.gitversion.outputs.legacySemVerPadded }}" - echo "AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}" - echo "AssemblySemFileVer: ${{ steps.gitversion.outputs.assemblySemFileVer }}" - echo "InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}" - echo "BranchName: ${{ steps.gitversion.outputs.branchName }}" - echo "Sha: ${{ steps.gitversion.outputs.sha }}" - echo "ShortSha: ${{ steps.gitversion.outputs.shortSha }}" - echo "NuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }}" - echo "NuGetVersion: ${{ steps.gitversion.outputs.nuGetVersion }}" - echo "NuGetPreReleaseTagV2: ${{ steps.gitversion.outputs.nuGetPreReleaseTagV2 }}" - echo "NuGetPreReleaseTag: ${{ steps.gitversion.outputs.nuGetPreReleaseTag }}" - echo "VersionSourceSha: ${{ steps.gitversion.outputs.versionSourceSha }}" - echo "CommitsSinceVersionSource: ${{ steps.gitversion.outputs.commitsSinceVersionSource }}" - echo "CommitsSinceVersionSourcePadded: ${{ steps.gitversion.outputs.commitsSinceVersionSourcePadded }}" - echo "CommitDate: ${{ steps.gitversion.outputs.commitDate }}" + echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - name: build - run: cd dotnet-core && ./build.sh + run: | + cd dotnet-core + ./build.sh - name: test - run: cd dotnet-core && dotnet test + run: | + cd dotnet-core + dotnet test - name: upload artifacts uses: actions/upload-artifact@v1 with: From 669581a7cd976f299e0f963d042ec5ccc81bd27a Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:23:28 +0300 Subject: [PATCH 126/152] ubuntu-latest --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c0a779d..d39ac47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,6 +31,7 @@ jobs: run: | cd dotnet-core ./build.sh + if: matrix.os == macos-latest || matrix.os == ubuntu-latest - name: test run: | cd dotnet-core From b3ab5c5d5023d2b56fa2c4174a3ecfe07c559a16 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:24:35 +0300 Subject: [PATCH 127/152] test ci --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d39ac47..b4660f7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: run: | cd dotnet-core ./build.sh - if: matrix.os == macos-latest || matrix.os == ubuntu-latest + if: ${{ matrix.os }} == macos-latest || ${{ matrix.os }} == ubuntu-latest - name: test run: | cd dotnet-core From fe87fd5d1135ae9d57e1f41cd55ae49bc31ccbe8 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:27:52 +0300 Subject: [PATCH 128/152] another ci test. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4660f7..2eba63c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: run: | cd dotnet-core ./build.sh - if: ${{ matrix.os }} == macos-latest || ${{ matrix.os }} == ubuntu-latest + if: ${{ matrix.os }} == 'macos-latest' || ${{ matrix.os }} == 'ubuntu-latest' - name: test run: | cd dotnet-core From 84d70c0980b5ccae50a2a08f54d807b9da6d1945 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:34:22 +0300 Subject: [PATCH 129/152] ci test --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2eba63c..2f3863c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,10 +28,10 @@ jobs: run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - name: build + if: ${{ matrix.os }} == 'macos-latest' || ${{ matrix.os }} == 'ubuntu-latest' run: | cd dotnet-core ./build.sh - if: ${{ matrix.os }} == 'macos-latest' || ${{ matrix.os }} == 'ubuntu-latest' - name: test run: | cd dotnet-core From 14d0922ed30b98f3d1856469229fabb1ba6eca2e Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:36:20 +0300 Subject: [PATCH 130/152] test ci. --- .github/workflows/build.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2f3863c..1421b5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,10 +28,18 @@ jobs: run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - name: build - if: ${{ matrix.os }} == 'macos-latest' || ${{ matrix.os }} == 'ubuntu-latest' + - if: matrix.os == 'macos-latest' run: | cd dotnet-core ./build.sh + - if: matrix.os == 'linux-latest' + run: | + cd dotnet-core + ./build.sh + - if: matrix.os == 'windows-latest' + run: | + cd dotnet-core + ./build.cmd - name: test run: | cd dotnet-core From 2bb71fdfe58531b7d7120bbb0c6b8ed440de4a82 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:38:00 +0300 Subject: [PATCH 131/152] test ci --- .github/workflows/build.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1421b5c..0ee75d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,16 +27,18 @@ jobs: - name: build info run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - - name: build - - if: matrix.os == 'macos-latest' + - name: macos build + if: matrix.os == 'macos-latest' run: | cd dotnet-core ./build.sh - - if: matrix.os == 'linux-latest' + - name: linux build + if: matrix.os == 'linux-latest' run: | cd dotnet-core ./build.sh - - if: matrix.os == 'windows-latest' + - name: windows build + if: matrix.os == 'windows-latest' run: | cd dotnet-core ./build.cmd From e32303c41f95d5d827590278070f033020ee1425 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:45:17 +0300 Subject: [PATCH 132/152] ci test --- .github/workflows/build.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0ee75d3..a03910a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,15 +33,15 @@ jobs: cd dotnet-core ./build.sh - name: linux build - if: matrix.os == 'linux-latest' - run: | - cd dotnet-core - ./build.sh + if: matrix.os == 'linux-latest' + run: | + cd dotnet-core + ./build.sh - name: windows build - if: matrix.os == 'windows-latest' - run: | - cd dotnet-core - ./build.cmd + if: matrix.os == 'windows-latest' + run: | + cd dotnet-core + ./build.cmd - name: test run: | cd dotnet-core From c622177476bb64a479d7ce7132407e50c40ca357 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:46:38 +0300 Subject: [PATCH 133/152] another test. --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a03910a..dfd3c10 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,12 +33,12 @@ jobs: cd dotnet-core ./build.sh - name: linux build - if: matrix.os == 'linux-latest' - run: | + if: matrix.os == 'linux-latest' + run: | cd dotnet-core ./build.sh - name: windows build - if: matrix.os == 'windows-latest' + if: matrix.os == 'windows-latest' run: | cd dotnet-core ./build.cmd From ac1a6c00c4af4f8784cc414e208d9c07d58a0415 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:48:43 +0300 Subject: [PATCH 134/152] test ci --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dfd3c10..6d5609c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,12 +29,12 @@ jobs: echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - name: macos build if: matrix.os == 'macos-latest' - run: | + run: | cd dotnet-core ./build.sh - name: linux build - if: matrix.os == 'linux-latest' - run: | + if: matrix.os == 'linux-latest' + run: | cd dotnet-core ./build.sh - name: windows build From 2257774715a451f6a0700ec5375b1d92d2f9bf6a Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:50:07 +0300 Subject: [PATCH 135/152] test ci --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6d5609c..0952a80 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,13 +35,13 @@ jobs: - name: linux build if: matrix.os == 'linux-latest' run: | - cd dotnet-core - ./build.sh + cd dotnet-core + ./build.sh - name: windows build if: matrix.os == 'windows-latest' run: | - cd dotnet-core - ./build.cmd + cd dotnet-core + ./build.cmd - name: test run: | cd dotnet-core From e3c9b69ad0e25cc1917508c64a576b0e35ca186d Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:50:51 +0300 Subject: [PATCH 136/152] test ci --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0952a80..8e83db4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,18 +30,18 @@ jobs: - name: macos build if: matrix.os == 'macos-latest' run: | - cd dotnet-core - ./build.sh + cd dotnet-core + ./build.sh - name: linux build if: matrix.os == 'linux-latest' run: | - cd dotnet-core - ./build.sh + cd dotnet-core + ./build.sh - name: windows build if: matrix.os == 'windows-latest' run: | - cd dotnet-core - ./build.cmd + cd dotnet-core + ./build.cmd - name: test run: | cd dotnet-core From 67a1fe4422b0b959274e14b7f75a0f4380f9b6df Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:51:51 +0300 Subject: [PATCH 137/152] test ci --- .github/workflows/build.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e83db4..0ee75d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,19 +29,19 @@ jobs: echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - name: macos build if: matrix.os == 'macos-latest' - run: | - cd dotnet-core - ./build.sh + run: | + cd dotnet-core + ./build.sh - name: linux build if: matrix.os == 'linux-latest' - run: | - cd dotnet-core - ./build.sh + run: | + cd dotnet-core + ./build.sh - name: windows build if: matrix.os == 'windows-latest' - run: | - cd dotnet-core - ./build.cmd + run: | + cd dotnet-core + ./build.cmd - name: test run: | cd dotnet-core From 3227628654e1f7ec36890be4e11b616050a9eacc Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:53:34 +0300 Subject: [PATCH 138/152] fixed ci --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0ee75d3..f195a27 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: cd dotnet-core ./build.sh - name: linux build - if: matrix.os == 'linux-latest' + if: matrix.os == 'ubuntu-latest' run: | cd dotnet-core ./build.sh From be98816cadc34c3f836e834a4922a21884eb60ab Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 17:58:11 +0300 Subject: [PATCH 139/152] fix ci. --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f195a27..bfb9d83 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,13 +17,13 @@ jobs: uses: gittools/actions/gitversion/setup@v0.9 with: versionSpec: '5.1.x' - - name: setup dotnet core - uses: actions/setup-dotnet@v1.4.0 - with: - dotnet-version: ${{ matrix.dotnetcore }} - name: setup gitversion id: gitversion # step id used as reference for output values uses: gittools/actions/gitversion/execute@v0.9 + - name: setup dotnet core + uses: actions/setup-dotnet@v1.4.0 + with: + dotnet-version: ${{ matrix.dotnetcore }} - name: build info run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" From 98afebfec8b8025ab60fd43be063424879af9480 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 18:00:40 +0300 Subject: [PATCH 140/152] test ci --- .github/workflows/build.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfb9d83..520e9fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,13 +27,8 @@ jobs: - name: build info run: | echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}" - - name: macos build - if: matrix.os == 'macos-latest' - run: | - cd dotnet-core - ./build.sh - - name: linux build - if: matrix.os == 'ubuntu-latest' + - name: unix build + if: matrix.os == 'macos-latest' || matrix.os == 'ubuntu-latest' run: | cd dotnet-core ./build.sh From da6f5255f774ddefac752f49aca87dc666b30cf5 Mon Sep 17 00:00:00 2001 From: huseyin uslu Date: Fri, 14 Feb 2020 18:02:00 +0300 Subject: [PATCH 141/152] tiny fix. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 520e9fa..e69673d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,5 +44,5 @@ jobs: - name: upload artifacts uses: actions/upload-artifact@v1 with: - name: ${{ steps.gitversion.outputs.fullSemVer }}-${{ matrix.os }}-${{ matrix.dotnetcore }}-artifacts + name: ${{ steps.gitversion.outputs.fullSemVer }}-${{ matrix.os }}-dotnetcore-${{ matrix.dotnetcore }}-artifacts path: dotnet-core/bin From 91883d21284f29a1d7d6e2e7b61eea87e27c1c1d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 18 Feb 2020 17:16:41 +0000 Subject: [PATCH 142/152] Update aspnet Extensions monorepo to v3.1.2 --- dotnet-core/src/core/Homer.Core.csproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dotnet-core/src/core/Homer.Core.csproj b/dotnet-core/src/core/Homer.Core.csproj index 49b7412..bea3cf9 100644 --- a/dotnet-core/src/core/Homer.Core.csproj +++ b/dotnet-core/src/core/Homer.Core.csproj @@ -16,12 +16,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + + + all From 79daa49ef43246c91b21d4a13bbff5767af99860 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 20 Feb 2020 17:19:51 +0000 Subject: [PATCH 143/152] Update dependency Bullseye to v3.2.0 --- dotnet-core/build/Homer.Build.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet-core/build/Homer.Build.csproj b/dotnet-core/build/Homer.Build.csproj index d06341b..3de602c 100644 --- a/dotnet-core/build/Homer.Build.csproj +++ b/dotnet-core/build/Homer.Build.csproj @@ -31,7 +31,7 @@ - + From bbb79a22696afeae7cb4fc2edfd397b0f768fcb9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 21 Feb 2020 12:24:34 +0000 Subject: [PATCH 144/152] Update dependency config to v3.2.6 --- node.js/package-lock.json | 6 +++--- node.js/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/node.js/package-lock.json b/node.js/package-lock.json index 9e1f740..a02f19c 100644 --- a/node.js/package-lock.json +++ b/node.js/package-lock.json @@ -137,9 +137,9 @@ } }, "config": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/config/-/config-3.2.5.tgz", - "integrity": "sha512-8itpjyR01lAJanhAlPncBngYRZez/LoRLW8wnGi+6SEcsUyA1wvHvbpIrAJYDJT+W9BScnj4mYoUgbtp9I+0+Q==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/config/-/config-3.2.6.tgz", + "integrity": "sha512-oDHjuBD4w4qrG/Rb0ghDeELz6u/NR0Jb0hP6tEEKWTC6e/mD+rXmPTdPPQMAjtgyo+p7ILb8MvTX/erbDuGzqA==", "requires": { "json5": "^1.0.1" } diff --git a/node.js/package.json b/node.js/package.json index b1c47cb..dd1b791 100644 --- a/node.js/package.json +++ b/node.js/package.json @@ -40,7 +40,7 @@ "dependencies": { "app-module-path": "2.2.0", "chalk": "3.0.0", - "config": "3.2.5", + "config": "3.2.6", "fs-extra": "8.1.0", "global-dirs": "2.0.1", "hap-nodejs": "0.5.6", From f425482b160b3df3061924bef6d434f7d64dccd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Uslu?= Date: Wed, 26 Feb 2020 15:53:33 +0300 Subject: [PATCH 145/152] Update build.yml --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e69673d..6739970 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,8 +41,3 @@ jobs: run: | cd dotnet-core dotnet test - - name: upload artifacts - uses: actions/upload-artifact@v1 - with: - name: ${{ steps.gitversion.outputs.fullSemVer }}-${{ matrix.os }}-dotnetcore-${{ matrix.dotnetcore }}-artifacts - path: dotnet-core/bin From cd714cafe6ae17c952bbad6ee6c2ade54b2ace0e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 27 Feb 2020 03:18:29 +0000 Subject: [PATCH 146/152] Update dependency config to v3.3.0 --- node.js/package-lock.json | 6 +++--- node.js/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/node.js/package-lock.json b/node.js/package-lock.json index a02f19c..0bf94f8 100644 --- a/node.js/package-lock.json +++ b/node.js/package-lock.json @@ -137,9 +137,9 @@ } }, "config": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/config/-/config-3.2.6.tgz", - "integrity": "sha512-oDHjuBD4w4qrG/Rb0ghDeELz6u/NR0Jb0hP6tEEKWTC6e/mD+rXmPTdPPQMAjtgyo+p7ILb8MvTX/erbDuGzqA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.0.tgz", + "integrity": "sha512-Xw++JjmYOLLX2HaYpySAveO8a9o+Af0jpDdEt1st8xtLeZI0bDfNsI90DGFyE/7mNnEjHiI8ivp/PieM6ODtdw==", "requires": { "json5": "^1.0.1" } diff --git a/node.js/package.json b/node.js/package.json index dd1b791..0a5515d 100644 --- a/node.js/package.json +++ b/node.js/package.json @@ -40,7 +40,7 @@ "dependencies": { "app-module-path": "2.2.0", "chalk": "3.0.0", - "config": "3.2.6", + "config": "3.3.0", "fs-extra": "8.1.0", "global-dirs": "2.0.1", "hap-nodejs": "0.5.6", From 18e5c44776172408a2e87f0f466d90f9b2ec001c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 7 Mar 2020 22:19:19 +0000 Subject: [PATCH 147/152] Update dependency GitVersionTask to v5.2.0 --- dotnet-core/src/core/Homer.Core.csproj | 2 +- dotnet-core/src/homer/Homer.csproj | 2 +- dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet-core/src/core/Homer.Core.csproj b/dotnet-core/src/core/Homer.Core.csproj index bea3cf9..8bd8a80 100644 --- a/dotnet-core/src/core/Homer.Core.csproj +++ b/dotnet-core/src/core/Homer.Core.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/dotnet-core/src/homer/Homer.csproj b/dotnet-core/src/homer/Homer.csproj index 1e5e03b..1e7f01f 100644 --- a/dotnet-core/src/homer/Homer.csproj +++ b/dotnet-core/src/homer/Homer.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj index c67172c..19f488b 100644 --- a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -6,7 +6,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From fdb9ef335c931e504a4247ca8ca0a555db2cb0c7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 8 Mar 2020 19:25:12 +0000 Subject: [PATCH 148/152] Update dependency McMaster.Extensions.CommandLineUtils to v2.6.0 --- dotnet-core/build/Homer.Build.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet-core/build/Homer.Build.csproj b/dotnet-core/build/Homer.Build.csproj index 3de602c..acfebf1 100644 --- a/dotnet-core/build/Homer.Build.csproj +++ b/dotnet-core/build/Homer.Build.csproj @@ -32,7 +32,7 @@ - + From d5adc976b4881a71e776a5af6ad47698f1a0f5ec Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 11 Mar 2020 15:37:32 +0000 Subject: [PATCH 149/152] Update dependency hap-nodejs to v0.5.7 --- node.js/package-lock.json | 12 ++++++------ node.js/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/node.js/package-lock.json b/node.js/package-lock.json index 0bf94f8..8d03ea8 100644 --- a/node.js/package-lock.json +++ b/node.js/package-lock.json @@ -305,9 +305,9 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "hap-nodejs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.5.6.tgz", - "integrity": "sha512-hK6HaRUKhO948roA/SF9+5t61qyAWsTCj9SeR3qTt9uQIyIWUpKIAiJlNQADMTb4LcJwC0yaVexw8cU5z2wxNw==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.5.7.tgz", + "integrity": "sha512-SQJ0Fq+yImvwVWYb8U3hZbwnB+8OeTBLewBU70DTUmujzkrUSQVv+fZG/hjuyHWD03TU8/Y/8fyHQ1y57NkXoA==", "requires": { "bonjour-hap": "^3.5.1", "debug": "^2.2.0", @@ -491,9 +491,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.0.tgz", - "integrity": "sha512-Tu2QORGOFANB124NWQ/JTRhMf/ODouVLEuvu5Dz8YWEU55zQgRgFGnBHfIh5PbfNDAuaRl7yLB+pgWhSqVxi2Q==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.1.tgz", + "integrity": "sha512-qJaNecNV4wV5FqZ+aBHOgUcHaJXpEMZhiERmuu7CM0YrCyIsgevVLZJGXeyxMAiofN+jby8oAGr8BpQk6xmptw==", "requires": { "dns-packet": "^4.0.0", "thunky": "^1.0.2" diff --git a/node.js/package.json b/node.js/package.json index 0a5515d..901f670 100644 --- a/node.js/package.json +++ b/node.js/package.json @@ -43,7 +43,7 @@ "config": "3.3.0", "fs-extra": "8.1.0", "global-dirs": "2.0.1", - "hap-nodejs": "0.5.6", + "hap-nodejs": "0.5.7", "js-yaml": "3.13.1", "lodash": "4.17.15", "node-persist": "3.0.5", From c67b56edb6f05b7ca7c25243b3fce23f4b9cbc17 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 17 Mar 2020 09:15:57 +0000 Subject: [PATCH 150/152] Update dependency GitVersionTask to v5.2.4 --- dotnet-core/src/core/Homer.Core.csproj | 2 +- dotnet-core/src/homer/Homer.csproj | 2 +- dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet-core/src/core/Homer.Core.csproj b/dotnet-core/src/core/Homer.Core.csproj index 8bd8a80..e2b8be7 100644 --- a/dotnet-core/src/core/Homer.Core.csproj +++ b/dotnet-core/src/core/Homer.Core.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/dotnet-core/src/homer/Homer.csproj b/dotnet-core/src/homer/Homer.csproj index 1e7f01f..57b4f0b 100644 --- a/dotnet-core/src/homer/Homer.csproj +++ b/dotnet-core/src/homer/Homer.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj index 19f488b..3772c59 100644 --- a/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj +++ b/dotnet-core/src/platforms/homekit/Homer.Platform.HomeKit.csproj @@ -6,7 +6,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From fd6f91c1751fdcf8b42a3c93fd4051f4a80ab031 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 24 Mar 2020 17:34:23 +0000 Subject: [PATCH 151/152] Update aspnet Extensions monorepo to v3.1.3 --- dotnet-core/src/core/Homer.Core.csproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dotnet-core/src/core/Homer.Core.csproj b/dotnet-core/src/core/Homer.Core.csproj index e2b8be7..dc71c9e 100644 --- a/dotnet-core/src/core/Homer.Core.csproj +++ b/dotnet-core/src/core/Homer.Core.csproj @@ -16,12 +16,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + + + all From b4234e08208ed0fcc4e6088717604cec394faa20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2020 14:16:21 +0000 Subject: [PATCH 152/152] Bump lodash from 4.17.15 to 4.17.19 in /node.js Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- node.js/package-lock.json | 6 +++--- node.js/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/node.js/package-lock.json b/node.js/package-lock.json index 8d03ea8..3f84ca9 100644 --- a/node.js/package-lock.json +++ b/node.js/package-lock.json @@ -449,9 +449,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "logform": { "version": "2.1.2", diff --git a/node.js/package.json b/node.js/package.json index 901f670..17ab1ed 100644 --- a/node.js/package.json +++ b/node.js/package.json @@ -45,7 +45,7 @@ "global-dirs": "2.0.1", "hap-nodejs": "0.5.7", "js-yaml": "3.13.1", - "lodash": "4.17.15", + "lodash": "4.17.19", "node-persist": "3.0.5", "qrcode-terminal": "0.12.0", "semver": "7.1.3",