diff --git a/.azuredevops/policies/branchClassification.yml b/.azuredevops/policies/branchClassification.yml
new file mode 100644
index 000000000000..ab2a78548d2a
--- /dev/null
+++ b/.azuredevops/policies/branchClassification.yml
@@ -0,0 +1,14 @@
+description: Branch classification configuration for repository
+resource: repository
+configuration:
+ branchClassificationSettings:
+ defaultClassification: nonproduction
+ ruleset:
+ - name: prod-branches
+ branchNames:
+ - main
+ - release/*
+ - net10.0
+ - net9.0
+ - inflight/current
+ classification: production
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 7a2f69ae60c4..613b8c80f68e 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -42,6 +42,7 @@ body:
label: Version with bug
description: In what version do you see this issue? Run `dotnet workload list` to find your version.
options:
+ - 10.0.0-rc.1
- 10.0.0-preview.7
- 10.0.0-preview.6
- 10.0.0-preview.5
@@ -49,6 +50,7 @@ body:
- 10.0.0-preview.3
- 10.0.0-preview.2
- 10.0.0-preview.1
+ - 9.0.110 SR11
- 9.0.100 SR10
- 9.0.90 SR9
- 9.0.82 SR8.2
@@ -130,6 +132,7 @@ body:
- 9.0.82 SR8.2
- 9.0.90 SR9
- 9.0.100 SR10
+ - 9.0.110 SR11
- 10.0.0-preview.1
- 10.0.0-preview.2
- 10.0.0-preview.3
@@ -137,6 +140,7 @@ body:
- 10.0.0-preview.5
- 10.0.0-preview.6
- 10.0.0-preview.7
+ - 10.0.0-rc.1
validations:
required: true
- type: dropdown
diff --git a/Directory.Build.props b/Directory.Build.props
index f3f7b152b802..7b7cb9895e75 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -230,6 +230,17 @@
net$(_MauiDotNetVersion)-maccatalyst;$(MauiEmbeddingPlatforms)
net$(_MauiDotNetVersion)-ios;$(MauiEmbeddingPlatforms)
+
+ $(WindowsMauiPlatforms);$(MauiDeviceTestsPlatforms)
+ net$(_MauiDotNetVersion)-android;$(MauiDeviceTestsPlatforms)
+ net$(_MauiDotNetVersion)-maccatalyst;$(MauiDeviceTestsPlatforms)
+ net$(_MauiDotNetVersion)-ios;$(MauiDeviceTestsPlatforms)
+ net$(_MauiPreviousDotNetVersion)-tizen;$(MauiManualTestsPreviousPlatforms)
+ $(WindowsMauiPreviousPlatforms);$(MauiManualTestsPreviousPlatforms)
+ net$(_MauiPreviousDotNetVersion)-android;$(MauiManualTestsPreviousPlatforms)
+ net$(_MauiPreviousDotNetVersion)-maccatalyst;$(MauiManualTestsPreviousPlatforms)
+ net$(_MauiPreviousDotNetVersion)-ios;$(MauiManualTestsPreviousPlatforms)
+
$(MauiPlatforms)
$(MauiGraphicsPlatforms);net$(_MauiDotNetVersion)-macos$(MacosTargetFrameworkVersion)
diff --git a/Microsoft.Maui-dev.sln b/Microsoft.Maui-dev.sln
index 537ab42bd738..50107d813ac8 100644
--- a/Microsoft.Maui-dev.sln
+++ b/Microsoft.Maui-dev.sln
@@ -240,6 +240,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITest.Analyzers", "src\Tes
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maui.Controls.Sample.Embedding", "src\Controls\samples\Controls.Sample.Embedding\Maui.Controls.Sample.Embedding.csproj", "{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.ManualTests", "src\Controls\tests\ManualTests\Controls.ManualTests.csproj", "{E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -617,6 +619,10 @@ Global
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Build.0 = Release|Any CPU
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -727,6 +733,7 @@ Global
{23FEFC89-5D2F-491C-BBE0-0E73AFD8BA47} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
{55905937-1399-46DB-BA38-E426801CB759} = {7AC28763-9C68-4BF9-A1BA-25CBFFD2D15C}
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55}
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50}
diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln
index fc9770cbfcf6..a3ae37181947 100644
--- a/Microsoft.Maui.sln
+++ b/Microsoft.Maui.sln
@@ -245,6 +245,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UITest.Analyzers", "src\Tes
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maui.Controls.Sample.Embedding", "src\Controls\samples\Controls.Sample.Embedding\Maui.Controls.Sample.Embedding.csproj", "{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.ManualTests", "src\Controls\tests\ManualTests\Controls.ManualTests.csproj", "{E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -630,6 +632,10 @@ Global
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Build.0 = Release|Any CPU
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -743,6 +749,7 @@ Global
{6AEE83CC-08CA-466A-BA86-774BE88A541B} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
{F1BC506B-3A9E-4779-994E-339AFB21C9B9} = {7AC28763-9C68-4BF9-A1BA-25CBFFD2D15C}
{4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55}
+ {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50}
diff --git a/eng/BannedSymbols.txt b/eng/BannedSymbols.txt
index 9adcf5a06bf3..12123bcfc629 100644
--- a/eng/BannedSymbols.txt
+++ b/eng/BannedSymbols.txt
@@ -1,5 +1,6 @@
M:Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions.TryAddSingleton`2(Microsoft.Extensions.DependencyInjection.IServiceCollection);Use a Factory method to create the service instead
M:Android.Content.Res.ColorStateList.#ctor(System.Int32[][],System.Int32[]);Use Microsoft.Maui.PlatformInterop.Get*ColorStateList() Java methods instead
+M:Android.Widget.ImageView.GetScaleType();Use PlatformInterop.IsImageViewCenterCrop instead (or add a new method)
P:Microsoft.Maui.MauiWinUIApplication.Services;Use the IPlatformApplication.Current.Services instead
P:Microsoft.Maui.MauiWinUIApplication.Application;Use the IPlatformApplication.Current.Application instead
P:Microsoft.UI.Xaml.Window.AppWindow;This API doesn't have null safety. Use GetAppWindow() and make sure to account for the possibility that GetAppWindow() might be null.
diff --git a/eng/pipelines/azure-pipelines-public.yml b/eng/pipelines/azure-pipelines-public.yml
new file mode 100644
index 000000000000..11a989a6e35a
--- /dev/null
+++ b/eng/pipelines/azure-pipelines-public.yml
@@ -0,0 +1,226 @@
+trigger:
+ batch: true
+ branches:
+ include:
+ - main
+ - net10.0
+ - release/*
+ - inflight/*
+ paths:
+ include:
+ - '*'
+ exclude:
+ - '**.md'
+ - eng/Version.Details.xml
+ - .github/*
+ - docs/*
+ - LICENSE.TXT
+ - PATENTS.TXT
+ - THIRD-PARTY-NOTICES.TXT
+
+pr:
+ branches:
+ include:
+ - main
+ - net10.0
+ - release/*
+ - inflight/*
+ paths:
+ include:
+ - '*'
+ exclude:
+ - '**.md'
+ - eng/Version.Details.xml
+ - .github/*
+ - docs/*
+ - LICENSE.TXT
+ - PATENTS.TXT
+ - THIRD-PARTY-NOTICES.TXT
+
+variables:
+- template: /eng/common/templates/variables/pool-providers.yml@self
+- template: /eng/pipelines/common/variables.yml@self
+- template: /eng/pipelines/arcade/variables.yml@self
+
+parameters:
+- name: PackPlatform
+ type: object
+ default:
+ name: NetCore-Public
+ image: 1es-windows-2022
+ os: windows
+
+- name: BuildConfigurations
+ type: object
+ default:
+ - Debug
+ - Release
+
+- name: BuildPlatforms
+ type: object
+ default:
+ - name: NetCore-Public
+ image: 1es-windows-2022
+ os: Windows
+ buildScript: $(_buildScript)
+ sln: '$(Build.SourcesDirectory)/Microsoft.Maui.sln'
+ - name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ buildScript: $(_buildScriptMacOS)
+ sln: '$(Build.SourcesDirectory)/Microsoft.Maui-mac.slnf'
+
+stages:
+
+- template: /eng/pipelines/arcade/stage-helix-tests.yml@self
+ parameters:
+ runAsPublic: true
+ prepareSteps:
+ - template: /eng/pipelines/common/provision.yml@self
+ parameters:
+ checkoutDirectory: '$(System.DefaultWorkingDirectory)'
+ skipJdk: false
+ skipAndroidCommonSdks: false
+ skipAndroidPlatformApis: false
+ onlyAndroidPlatformDefaultApis: true
+ skipAndroidEmulatorImages: true
+ skipAndroidCreateAvds: true
+ skipProvisioning: true
+ skipXcode: true
+
+- template: /eng/pipelines/arcade/stage-pack.yml@self
+ parameters:
+ pool: ${{ parameters.PackPlatform }}
+ runAsPublic: true
+ prepareSteps:
+ - template: /eng/pipelines/common/provision.yml@self
+ parameters:
+ checkoutDirectory: '$(System.DefaultWorkingDirectory)'
+ skipJdk: false
+ skipAndroidCommonSdks: false
+ skipAndroidPlatformApis: false
+ onlyAndroidPlatformDefaultApis: true
+ skipAndroidEmulatorImages: true
+ skipAndroidCreateAvds: true
+ skipProvisioning: true
+ skipXcode: true
+
+- template: /eng/pipelines/arcade/stage-build.yml@self
+ parameters:
+ buildConfigurations: ${{ parameters.BuildConfigurations }}
+ buildPlatforms: ${{ parameters.BuildPlatforms }}
+ runAsPublic: ${{ eq(variables['_RunAsPublic'], 'true') }}
+ prepareSteps:
+ - template: /eng/pipelines/common/provision.yml@self
+ parameters:
+ checkoutDirectory: '$(System.DefaultWorkingDirectory)'
+ skipJdk: false
+ skipAndroidCommonSdks: false
+ skipAndroidPlatformApis: false
+ onlyAndroidPlatformDefaultApis: true
+ skipAndroidEmulatorImages: true
+ skipAndroidCreateAvds: true
+ skipProvisioning: true
+ skipXcode: true
+
+- template: /eng/pipelines/arcade/stage-unit-tests.yml@self
+ parameters:
+ jobMatrix:
+ - name: win_unit_tests
+ displayName: Windows Unit Tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 90
+ testOS: Windows
+ - name: mac_unit_tests
+ displayName: macOS Unit Tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 90
+ testOS: macOS
+ publishTaskPrefix: ''
+
+- template: /eng/pipelines/arcade/stage-integration-tests.yml@self
+ parameters:
+ stageDependsOn: Pack
+ publishTaskPrefix: ''
+ jobMatrix:
+ - name: win_sample_tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 120
+ testCategory: Samples
+ - name: mac_sample_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 120
+ testCategory: Samples
+
+ - name: win_wintemplate_tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 120
+ testCategory: WindowsTemplates
+
+ # - name: mac_wintemplate_tests
+ # pool:
+ # name: Azure Pipelines
+ # vmImage: $(HostedMacImage)
+ # os: macOS
+ # timeout: 120
+ # testCategory: WindowsTemplates
+
+ - name: win_buildtemplate_tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 120
+ testCategory: Build
+ - name: mac_buildtemplate_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 240
+ testCategory: Build
+
+ - name: win_blazortemplate_tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 120
+ testCategory: Blazor
+ - name: mac_blazortemplate_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 120
+ testCategory: Blazor
+
+ - name: win_multitemplate_tests
+ pool: ${{ parameters.PackPlatform }}
+ timeout: 120
+ testCategory: MultiProject
+ - name: mac_multitemplate_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 120
+ testCategory: MultiProject
+
+ # TODO: macOSTemplates and AOT template categories
+
+ - name: mac_runandroid_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 180
+ testCategory: RunOnAndroid
+
+ - name: mac_runios_tests
+ pool:
+ name: Azure Pipelines
+ vmImage: $(HostedMacImage)
+ os: macOS
+ timeout: 180
+ testCategory: RunOniOS
diff --git a/eng/pipelines/common/device-tests-jobs.yml b/eng/pipelines/common/device-tests-jobs.yml
index eb93d5fd3868..0fc0aed412ed 100644
--- a/eng/pipelines/common/device-tests-jobs.yml
+++ b/eng/pipelines/common/device-tests-jobs.yml
@@ -4,7 +4,6 @@ parameters:
versions: []
provisionatorChannel: 'latest'
skipProvisioning: true
- agentPoolAccessToken: ''
artifactName: 'nuget'
artifactItemPattern: '**/*.nupkg'
checkoutDirectory: $(System.DefaultWorkingDirectory)
@@ -41,7 +40,6 @@ jobs:
targetFrameworkVersion: ${{ parameters.targetFrameworkVersion.tfm }}
packageid: ${{ parameters.project.packageid }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
checkoutDirectory: ${{ parameters.checkoutDirectory }}
@@ -95,7 +93,6 @@ jobs:
targetFrameworkVersion: ${{ parameters.targetFrameworkVersion.tfm }}
packageid: ${{ parameters.project.packageid }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
checkoutDirectory: ${{ parameters.checkoutDirectory }}
diff --git a/eng/pipelines/common/device-tests-steps.yml b/eng/pipelines/common/device-tests-steps.yml
index 05539e366504..60139e6a682a 100644
--- a/eng/pipelines/common/device-tests-steps.yml
+++ b/eng/pipelines/common/device-tests-steps.yml
@@ -6,7 +6,6 @@ parameters:
cakeArgs: '' # additional cake args
deviceTestConfiguration: '' # Indicates the configuration to use for Android. We're slowly enabling this for all projects
provisionatorChannel: 'latest'
- agentPoolAccessToken: ''
artifactName: 'nuget'
artifactItemPattern: '**/*.nupkg'
checkoutDirectory: $(System.DefaultWorkingDirectory)
diff --git a/eng/pipelines/common/device-tests.yml b/eng/pipelines/common/device-tests.yml
index 8b426a7e7dc4..24c8e89d8435 100644
--- a/eng/pipelines/common/device-tests.yml
+++ b/eng/pipelines/common/device-tests.yml
@@ -1,15 +1,14 @@
parameters:
- androidPool: { }
- iosPool: { }
- catalystPool: { }
- windowsPool: { }
+ androidPool: {}
+ iosPool: {}
+ catalystPool: {}
+ windowsPool: {}
androidApiLevels: [ 33 ]
iosVersions: [ 'latest' ]
iosDeviceVersions: [ '15' ]
catalystVersions: [ 'latest' ]
provisionatorChannel: 'latest'
skipProvisioning: true
- agentPoolAccessToken: ''
artifactName: 'nuget'
artifactItemPattern: '**/*.nupkg'
checkoutDirectory: $(System.DefaultWorkingDirectory)
@@ -19,16 +18,16 @@ parameters:
tfm: ''
dependsOn: ''
projects:
- - name: name
- desc: Human Description
- android: /optional/path/to/android.csproj
- ios: /optional/path/to/ios.csproj
- catalyst: /optional/path/to/catalyst.csproj
+ - name: name
+ desc: Human Description
+ android: /optional/path/to/android.csproj
+ ios: /optional/path/to/ios.csproj
+ catalyst: /optional/path/to/catalyst.csproj
platforms:
- - android
- - ios
- - catalyst
- - windows
+ - android
+ - ios
+ - catalyst
+ - windows
stages:
@@ -39,7 +38,7 @@ stages:
dependsOn: []
${{ else }}:
dependsOn:
- - ${{ platform }}_device_tests_${{ replace(parameters.targetFrameworkVersion.dependsOn, '.', '') }}
+ - ${{ platform }}_device_tests_${{ replace(parameters.targetFrameworkVersion.dependsOn, '.', '') }}
jobs:
- ${{ if eq(platform, 'android') }}:
@@ -62,7 +61,6 @@ stages:
configuration: ${{ project.androidConfiguration }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
skipProvisioning: ${{ parameters.skipProvisioning }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
useArtifacts: ${{ parameters.useArtifacts }}
@@ -86,7 +84,6 @@ stages:
configuration: ${{ project.iOSConfiguration }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
skipProvisioning: ${{ parameters.skipProvisioning }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
useArtifacts: ${{ parameters.useArtifacts }}
@@ -110,7 +107,6 @@ stages:
configuration: ${{ project.iOSConfiguration }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
skipProvisioning: ${{ parameters.skipProvisioning }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
useArtifacts: ${{ parameters.useArtifacts }}
@@ -136,7 +132,6 @@ stages:
configuration: ${{ project.windowsConfiguration }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
skipProvisioning: ${{ parameters.skipProvisioning }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
artifactName: ${{ parameters.artifactName }}
artifactItemPattern: ${{ parameters.artifactItemPattern }}
useArtifacts: ${{ parameters.useArtifacts }}
diff --git a/eng/pipelines/common/ui-tests-build-sample.yml b/eng/pipelines/common/ui-tests-build-sample.yml
index a3872de583cb..0fa26f8f35cb 100644
--- a/eng/pipelines/common/ui-tests-build-sample.yml
+++ b/eng/pipelines/common/ui-tests-build-sample.yml
@@ -6,7 +6,6 @@ parameters:
app: '' #path to app to test
version: '' #the iOS version'
provisionatorChannel: 'latest'
- agentPoolAccessToken: ''
skipProvisioning: true
configuration: "Release"
testFilter: ''
diff --git a/eng/pipelines/common/ui-tests-steps.yml b/eng/pipelines/common/ui-tests-steps.yml
index 9f38a99022f9..4c0d1d849d0e 100644
--- a/eng/pipelines/common/ui-tests-steps.yml
+++ b/eng/pipelines/common/ui-tests-steps.yml
@@ -6,7 +6,6 @@ parameters:
app: '' #path to app to test
version: '' #the iOS version'
provisionatorChannel: 'latest'
- agentPoolAccessToken: ''
configuration: "Release"
runtimeVariant: "Mono"
testFilter: ''
@@ -183,7 +182,7 @@ steps:
displayName: 'Enable Notification Center'
continueOnError: true
timeoutInMinutes: 60
-
+
- ${{ if eq(parameters.platform, 'android')}}:
- task: PowerShell@2
inputs:
diff --git a/eng/pipelines/common/ui-tests.yml b/eng/pipelines/common/ui-tests.yml
index a27e789505cb..3f0133828f9b 100644
--- a/eng/pipelines/common/ui-tests.yml
+++ b/eng/pipelines/common/ui-tests.yml
@@ -10,7 +10,8 @@ parameters:
provisionatorChannel: 'latest'
timeoutInMinutes: 180
skipProvisioning: true
- agentPoolAccessToken: ''
+ BuildNativeAOT: false # Parameter to control whether NativeAOT artifacts should be built
+ RunNativeAOT: false # Parameter to control whether NativeAOT UI tests should run
categoryGroupsToTest:
# Make sure that this list is always up-to-date with src/Controls/tests/TestCases.Shared.Tests/UITestCategories.cs
# we might want to improve this somehow depending on how much the categories change over time
@@ -75,7 +76,8 @@ stages:
runtimeVariant: "CoreCLR"
skipProvisioning: ${{ parameters.skipProvisioning }}
- - ${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
+ # NativeAOT UI tests build stage - only run when BuildNativeAOT parameter is true
+ - ${{ if eq(parameters.BuildNativeAOT, true) }}:
- stage: build_ui_tests_nativeaot
displayName: Build UITests NativeAOT Sample App
dependsOn: []
@@ -142,7 +144,6 @@ stages:
${{ if not(eq(api, 27)) }}:
device: android-emulator-64_${{ api }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
testFilter: $(CATEGORYGROUP)
skipProvisioning: ${{ parameters.skipProvisioning }}
@@ -222,7 +223,6 @@ stages:
${{ if ne(version, 'latest') }}:
device: ios-simulator-64_${{ version }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
runtimeVariant : "Mono"
testFilter: $(CATEGORYGROUP)
skipProvisioning: ${{ parameters.skipProvisioning }}
@@ -259,7 +259,6 @@ stages:
${{ if ne(version, 'latest') }}:
device: ios-simulator-64_${{ version }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
runtimeVariant : "Mono"
testFilter: "CollectionView"
testConfigurationArgs: "CollectionView2"
@@ -297,13 +296,13 @@ stages:
${{ if ne(version, 'latest') }}:
device: ios-simulator-64_${{ version }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
runtimeVariant : "Mono"
testFilter: "CarouselView"
testConfigurationArgs: "CollectionView2"
skipProvisioning: ${{ parameters.skipProvisioning }}
- - ${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
+ # NativeAOT iOS UI tests stage - only run when both BuildNativeAOT and RunNativeAOT parameters are true
+ - ${{ if and(eq(parameters.BuildNativeAOT, true), eq(parameters.RunNativeAOT, true)) }}:
- stage: ios_ui_tests_nativeaot
displayName: iOS UITests NativeAOT
dependsOn: build_ui_tests_nativeaot
@@ -341,7 +340,6 @@ stages:
${{ if ne(version, 'latest') }}:
device: ios-simulator-64_${{ version }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
runtimeVariant : "NativeAOT"
testFilter: $(CATEGORYGROUP)
skipProvisioning: ${{ parameters.skipProvisioning }}
@@ -374,7 +372,6 @@ stages:
path: ${{ project.winui }}
app: ${{ project.app }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
testFilter: $(CATEGORYGROUP)
skipProvisioning: ${{ parameters.skipProvisioning }}
@@ -407,6 +404,5 @@ stages:
path: ${{ project.mac }}
app: ${{ project.app }}
provisionatorChannel: ${{ parameters.provisionatorChannel }}
- agentPoolAccessToken: ${{ parameters.agentPoolAccessToken }}
testFilter: $(CATEGORYGROUP)
skipProvisioning: ${{ parameters.skipProvisioning }}
diff --git a/eng/pipelines/device-tests.yml b/eng/pipelines/device-tests.yml
index ca36a92b5884..3f71ddbafdee 100644
--- a/eng/pipelines/device-tests.yml
+++ b/eng/pipelines/device-tests.yml
@@ -52,11 +52,6 @@ parameters:
type: boolean
default: false
-- name: provisionatorChannel
- displayName: 'Provisionator channel'
- type: string
- default: 'latest'
-
- name: BuildEverything
type: boolean
default: false
@@ -91,19 +86,12 @@ parameters:
name: $(windowsTestsVmPool)
vmImage: $(windowsTestsVmImage)
+
- name: targetFrameworkVersions
type: object
default:
- tfm: net10.0
-resources:
- repositories:
- - repository: yaml-templates
- type: github
- name: xamarin/yaml-templates
- endpoint: xamarin
- ref: refs/heads/main
-
stages:
- ${{ each targetFrameworkVersion in parameters.targetFrameworkVersions }}:
- template: common/device-tests.yml
@@ -142,7 +130,7 @@ stages:
windows: $(System.DefaultWorkingDirectory)/src/Essentials/test/DeviceTests/Essentials.DeviceTests.csproj
- name: graphics
desc: Graphics
- androidApiLevelsExclude: [ 25 ] # Ignore for now API25 since the runs's are not stable
+ androidApiLevelsExclude: [ 25, 28 ] # Ignore for now API25 and API28 since the runs's are not stable
androidConfiguration: 'Release'
iOSConfiguration: 'Debug'
windowsConfiguration: 'Debug'
diff --git a/eng/pipelines/handlers.yml b/eng/pipelines/handlers.yml
index 153717afa0c5..d79c5288fae8 100644
--- a/eng/pipelines/handlers.yml
+++ b/eng/pipelines/handlers.yml
@@ -303,6 +303,9 @@ stages:
displayName: Build Microsoft.Maui.IntegrationTests
- pwsh: ./build.ps1 --target=dotnet-integration-test --filter="Category=Samples" --resultsfilename="integration-samples" --verbosity=diagnostic
displayName: Run ${{ BuildPlatform.name }} sample build tests
+ - ${{ if eq(BuildPlatform.name , 'Windows') }}:
+ - pwsh: ./build.ps1 --target=dotnet-integration-test --filter="Category=AOT" --resultsfilename="integration-aot-windows" --verbosity=diagnostic
+ displayName: Run Windows AOT build tests
- task: PublishTestResults@2
displayName: Publish the ${{ BuildPlatform.name }} sample build tests
condition: always()
diff --git a/eng/pipelines/ui-tests.yml b/eng/pipelines/ui-tests.yml
index 2f426ba2c417..1674c8da69cd 100644
--- a/eng/pipelines/ui-tests.yml
+++ b/eng/pipelines/ui-tests.yml
@@ -52,15 +52,20 @@ parameters:
type: boolean
default: false
- - name: provisionatorChannel
- displayName: 'Provisionator channel'
- type: string
- default: 'latest'
-
- name: BuildEverything
type: boolean
default: false
+ - name: BuildNativeAOT
+ displayName: 'Build NativeAOT artifacts'
+ type: boolean
+ default: false
+
+ - name: RunNativeAOT
+ displayName: 'Run NativeAOT UI Tests'
+ type: boolean
+ default: false
+
- name: androidPool
type: object
default:
@@ -105,15 +110,6 @@ parameters:
name: Azure Pipelines
vmImage: macOS-14
-
-resources:
- repositories:
- - repository: yaml-templates
- type: github
- name: xamarin/yaml-templates
- endpoint: xamarin
- ref: refs/heads/main
-
stages:
- template: common/ui-tests.yml
@@ -124,15 +120,15 @@ stages:
windowsPool: ${{ parameters.windowsPool }}
windowsBuildPool: ${{ parameters.windowsBuildPool }}
macosPool: ${{ parameters.macosPool }}
- agentPoolAccessToken: $(AgentPoolAccessToken)
+ # BuildNativeAOT is false by default, but true in devdiv environment
+ BuildNativeAOT: ${{ or(parameters.BuildNativeAOT, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}
+ RunNativeAOT: ${{ parameters.RunNativeAOT }}
${{ if or(parameters.BuildEverything, and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'devdiv'))) }}:
androidApiLevels: [ 30 ]
iosVersions: [ '18.4' ]
- provisionatorChannel: ${{ parameters.provisionatorChannel }}
${{ else }}:
androidApiLevels: [ 30 ]
iosVersions: [ '18.4' ]
- provisionatorChannel: ${{ parameters.provisionatorChannel }}
${{ if or(parameters.UseProvisionator, eq(variables['internalProvisioning'],'true') ) }}:
skipProvisioning: false
${{ else }}:
diff --git a/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs b/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs
index 15ae12b64739..9d4e7e5fc9c0 100644
--- a/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs
+++ b/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs
@@ -26,7 +26,7 @@ static void OnLayoutChange(object sender, global::Android.Views.View.LayoutChang
{
if (sender is IVisualElementRenderer renderer && renderer.View is ImageView imageView)
#pragma warning disable CS0618 // Obsolete
- AViewCompat.SetClipBounds(imageView, imageView.GetScaleType() == AScaleType.CenterCrop ? new ARect(0, 0, e.Right - e.Left, e.Bottom - e.Top) : null);
+ AViewCompat.SetClipBounds(imageView, PlatformInterop.IsImageViewCenterCrop(imageView) ? new ARect(0, 0, e.Right - e.Left, e.Bottom - e.Top) : null);
#pragma warning restore CS0618 // Obsolete
}
diff --git a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml
index 6590af989c48..8982619fe0c9 100644
--- a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml
+++ b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml
@@ -172,10 +172,6 @@
-
-
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/summarychemaddition.svg b/src/Controls/tests/ManualTests/Resources/Images/summarychemaddition.svg
new file mode 100644
index 000000000000..3e12faca0df1
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/summarychemaddition.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/summaryhigh.svg b/src/Controls/tests/ManualTests/Resources/Images/summaryhigh.svg
new file mode 100644
index 000000000000..8823bc1d3761
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/summaryhigh.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/summarylow.svg b/src/Controls/tests/ManualTests/Resources/Images/summarylow.svg
new file mode 100644
index 000000000000..575d9f300969
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/summarylow.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/tfp.svg b/src/Controls/tests/ManualTests/Resources/Images/tfp.svg
new file mode 100644
index 000000000000..0a97a365ec4d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/tfp.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Images/tfpblue.svg b/src/Controls/tests/ManualTests/Resources/Images/tfpblue.svg
new file mode 100644
index 000000000000..0e5e3ac278f9
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/tfpblue.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timeline.svg b/src/Controls/tests/ManualTests/Resources/Images/timeline.svg
new file mode 100644
index 000000000000..d213544b8ba1
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timeline.svg
@@ -0,0 +1,74 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinebroom.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinebroom.svg
new file mode 100644
index 000000000000..80a2bc02453e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinebroom.svg
@@ -0,0 +1,39 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinechemicals.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinechemicals.svg
new file mode 100644
index 000000000000..d01b3c2f1ab1
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinechemicals.svg
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinedollar.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinedollar.svg
new file mode 100644
index 000000000000..8b0e7ab79fd0
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinedollar.svg
@@ -0,0 +1,37 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinedrop.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinedrop.svg
new file mode 100644
index 000000000000..b23879876eec
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinedrop.svg
@@ -0,0 +1,44 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinefilter.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinefilter.svg
new file mode 100644
index 000000000000..08b269a2bba8
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinefilter.svg
@@ -0,0 +1,64 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinenote.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinenote.svg
new file mode 100644
index 000000000000..dc1cbc82974e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinenote.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelineplus.svg b/src/Controls/tests/ManualTests/Resources/Images/timelineplus.svg
new file mode 100644
index 000000000000..b09fdad87142
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelineplus.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinepoolclose.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinepoolclose.svg
new file mode 100644
index 000000000000..5bf16fa2a974
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinepoolclose.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinepoolopen.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinepoolopen.svg
new file mode 100644
index 000000000000..ced81ea5c571
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinepoolopen.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelineschedule.svg b/src/Controls/tests/ManualTests/Resources/Images/timelineschedule.svg
new file mode 100644
index 000000000000..6f2ab5ba32e5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelineschedule.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/timelinevacuum.svg b/src/Controls/tests/ManualTests/Resources/Images/timelinevacuum.svg
new file mode 100644
index 000000000000..131f0a978b4b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/timelinevacuum.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/twitter.svg b/src/Controls/tests/ManualTests/Resources/Images/twitter.svg
new file mode 100644
index 000000000000..6a38e08d997c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/twitter.svg
@@ -0,0 +1,39 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/upgrade.svg b/src/Controls/tests/ManualTests/Resources/Images/upgrade.svg
new file mode 100644
index 000000000000..9d77bd5fbe9d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/upgrade.svg
@@ -0,0 +1,38 @@
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/user.svg b/src/Controls/tests/ManualTests/Resources/Images/user.svg
new file mode 100644
index 000000000000..9bdbbac5d49a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/user.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w1.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w1.svg
new file mode 100644
index 000000000000..eafcd77d7b51
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w1.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w11.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w11.svg
new file mode 100644
index 000000000000..cf06f8f8216f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w11.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w12.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w12.svg
new file mode 100644
index 000000000000..3cb7e3184b0b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w12.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w13.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w13.svg
new file mode 100644
index 000000000000..cd0cb0a06968
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w13.svg
@@ -0,0 +1,43 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w14.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w14.svg
new file mode 100644
index 000000000000..cd0cb0a06968
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w14.svg
@@ -0,0 +1,43 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w15.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w15.svg
new file mode 100644
index 000000000000..52555ec78612
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w15.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w16.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w16.svg
new file mode 100644
index 000000000000..006a8e56415c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w16.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w17.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w17.svg
new file mode 100644
index 000000000000..006a8e56415c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w17.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w18.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w18.svg
new file mode 100644
index 000000000000..7ecef3fecc98
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w18.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w19.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w19.svg
new file mode 100644
index 000000000000..950aeacf75a6
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w19.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w2.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w2.svg
new file mode 100644
index 000000000000..eafcd77d7b51
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w2.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w20.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w20.svg
new file mode 100644
index 000000000000..6a632dc381da
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w20.svg
@@ -0,0 +1,40 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w21.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w21.svg
new file mode 100644
index 000000000000..6a632dc381da
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w21.svg
@@ -0,0 +1,40 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w22.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w22.svg
new file mode 100644
index 000000000000..56afebf9c20a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w22.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w23.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w23.svg
new file mode 100644
index 000000000000..c1f1c711a1b9
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w23.svg
@@ -0,0 +1,40 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w24.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w24.svg
new file mode 100644
index 000000000000..e0d345db7c4f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w24.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w25.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w25.svg
new file mode 100644
index 000000000000..b97bc09e7450
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w25.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w26.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w26.svg
new file mode 100644
index 000000000000..b97bc09e7450
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w26.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w29.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w29.svg
new file mode 100644
index 000000000000..b97bc09e7450
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w29.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w3.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w3.svg
new file mode 100644
index 000000000000..4873b055aa52
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w3.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w30.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w30.svg
new file mode 100644
index 000000000000..66faa3a21fcf
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w30.svg
@@ -0,0 +1,56 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w31.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w31.svg
new file mode 100644
index 000000000000..e0d345db7c4f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w31.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w32.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w32.svg
new file mode 100644
index 000000000000..de5488a3b843
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w32.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w33.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w33.svg
new file mode 100644
index 000000000000..053b2de96823
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w33.svg
@@ -0,0 +1,13 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w34.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w34.svg
new file mode 100644
index 000000000000..2b36834f415d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w34.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w35.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w35.svg
new file mode 100644
index 000000000000..2b36834f415d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w35.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w36.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w36.svg
new file mode 100644
index 000000000000..2b36834f415d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w36.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w37.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w37.svg
new file mode 100644
index 000000000000..a895dac2f538
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w37.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w38.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w38.svg
new file mode 100644
index 000000000000..8b76dba18583
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w38.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w39.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w39.svg
new file mode 100644
index 000000000000..4829c81ba66c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w39.svg
@@ -0,0 +1,32 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w4.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w4.svg
new file mode 100644
index 000000000000..4873b055aa52
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w4.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w40.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w40.svg
new file mode 100644
index 000000000000..3d4e6dc2f7bc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w40.svg
@@ -0,0 +1,24 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w41.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w41.svg
new file mode 100644
index 000000000000..b9541cb11b25
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w41.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w42.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w42.svg
new file mode 100644
index 000000000000..b9541cb11b25
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w42.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w43.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w43.svg
new file mode 100644
index 000000000000..d34c39f175c4
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w43.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w44.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w44.svg
new file mode 100644
index 000000000000..c4bab7465e3b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w44.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w5.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w5.svg
new file mode 100644
index 000000000000..e19bf1379e2a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w5.svg
@@ -0,0 +1,33 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w6.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w6.svg
new file mode 100644
index 000000000000..cf63543a83fc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w6.svg
@@ -0,0 +1,26 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w7.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w7.svg
new file mode 100644
index 000000000000..c3eaf41db3a7
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w7.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Images/weather/w8.svg b/src/Controls/tests/ManualTests/Resources/Images/weather/w8.svg
new file mode 100644
index 000000000000..c3eaf41db3a7
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Images/weather/w8.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/Controls/tests/ManualTests/Resources/Raw/AboutAssets.txt b/src/Controls/tests/ManualTests/Resources/Raw/AboutAssets.txt
new file mode 100644
index 000000000000..89dc758d6e0d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with your package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
diff --git a/src/Controls/tests/ManualTests/Resources/Raw/logs.json b/src/Controls/tests/ManualTests/Resources/Raw/logs.json
new file mode 100644
index 000000000000..ef33a24a4fb8
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Raw/logs.json
@@ -0,0 +1,10550 @@
+[
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": true,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": 25,
+ "pressure": 33,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2024-03-26T19:41:13Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "47edbabb-3f1e-4e64-a01f-6490db901590",
+ "_ts": 1711482878,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 1,
+ "Unit": 0,
+ "Amount": 0.3,
+ "NormalizedAmount": 0.3,
+
+ "logTimestamp": "2024-01-23T02:19:46Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "265abb39-9f29-46de-a12e-dcbd53fa0b9b",
+ "_ts": 1705977510,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": 6.9,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": -0.9,
+ "waterTemp": null,
+ "waterTempUnits": 0,
+
+ "logTimestamp": "2024-01-21T02:51:45Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "594b8aca-26f4-4cc2-a0f5-091e7a93654c",
+ "_ts": 1711484871,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test Time",
+
+ "logTimestamp": "2023-11-14T21:00:00Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "386d5b56-d46f-4b96-a228-230ba83ddada",
+ "_ts": 1699998962,
+ "deleted": false
+ },
+ {
+ "type": "notelog",
+ "notes": "Test",
+
+ "logTimestamp": "2022-12-29T02:58:27Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "11135f77-5122-40f0-90a3-7a5a43ffd9ec",
+ "_ts": 1680273497,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": false,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": true,
+ "notes": null,
+
+ "logTimestamp": "2018-08-20T14:45:29Z",
+ "weather": null,
+ "weatherLogId": null,
+
+ "origin": null,
+ "id": "d03b8cce-dbdb-4562-bdd8-c0238d8bfded",
+ "_ts": 1549295157,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-17T14:38:14.6422431Z",
+ "weather": {
+ "timestamp": "2018-08-17T14:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22,
+ "tempFeelsLike": 24.5,
+ "relHumidity": 97,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 13.8,
+ "windGustSpeed": 18,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 97,
+ "pressure": 1012.9,
+ "precipPast24Hours": 3
+ },
+ "weatherLogId": "170635c4-8da2-4fa7-b800-017ef750677b",
+
+ "origin": "dialogflow",
+ "id": "7c0e274d-55c6-4e84-96d3-f85509d87051",
+ "_ts": 1534516694,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-16T00:39:12.5845119Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "776e5e72-972b-452c-b322-36439ede8c3d",
+
+ "origin": "dialogflow",
+ "id": "ea7b115e-6940-4625-90fb-97fd83191f81",
+ "_ts": 1534379952,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 4,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-16T00:37:34.6585562Z",
+ "weather": {
+ "timestamp": "2018-08-16T00:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 26.9,
+ "tempFeelsLike": 28.9,
+ "relHumidity": 74,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 11.1,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 81,
+ "pressure": 1014,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "089431d6-21fe-4fda-b04f-fba27c2c20eb",
+
+ "origin": "dialogflow",
+ "id": "c0475b4a-963f-475c-a8f1-22f5c5fdfc2d",
+ "_ts": 1534379854,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-15T00:02:22.8880771Z",
+ "weather": {
+ "timestamp": "2018-08-15T00:01:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 26.3,
+ "tempFeelsLike": 25.9,
+ "relHumidity": 63,
+ "windDir": 270,
+ "windDirDesc": "W",
+ "windSpeed": 13.5,
+ "windGustSpeed": 17,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 28,
+ "pressure": 1012.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "2855707a-2d89-45cb-8702-75987ec89f8f",
+
+ "origin": "dialogflow",
+ "id": "ac40d9e1-8a11-48f6-ba98-da8323518102",
+ "_ts": 1534291343,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-08-13T23:49:38.0936887Z",
+ "weather": {
+ "timestamp": "2018-08-13T23:45:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 24.3,
+ "tempFeelsLike": 23.9,
+ "relHumidity": 68,
+ "windDir": 45,
+ "windDirDesc": "NE",
+ "windSpeed": 9.4,
+ "windGustSpeed": 12.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 77,
+ "pressure": 1015.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "717b9d7a-7659-4131-b87f-d13134cdeb41",
+
+ "origin": "dialogflow",
+ "id": "2c6ed786-c2f4-493f-b35f-a200f6fb23f5",
+ "_ts": 1534204178,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-13T00:09:44.1352293Z",
+ "weather": {
+ "timestamp": "2018-08-13T00:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26.4,
+ "tempFeelsLike": 25.8,
+ "relHumidity": 60,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 11.4,
+ "windGustSpeed": 14.7,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 68,
+ "pressure": 1017.5,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "cf3c0db0-2c3a-42a2-b176-6f5a5e9e128f",
+
+ "origin": "dialogflow",
+ "id": "5030e5a8-24f9-41b4-abfb-8fefa387102b",
+ "_ts": 1534118984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-12T14:43:30.0390095Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "3623d415-d372-49e3-a5b8-5fb0f13863be",
+
+ "origin": "dialogflow",
+ "id": "beb80cab-63ce-46c5-bddb-ef04f2c9cd34",
+ "_ts": 1534085010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-12T14:42:01.4115554Z",
+ "weather": {
+ "timestamp": "2018-08-12T14:30:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 68,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 5.6,
+ "windGustSpeed": 8.6,
+ "uvIndex": 5,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1018.4,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "72d58aa2-d430-49bf-88c8-ab8717fa2077",
+
+ "origin": "dialogflow",
+ "id": "99d51b84-11d7-4b7f-bcf2-205b77dc721f",
+ "_ts": 1534085040,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-09T13:38:47.2819901Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "5ad94891-96d6-4296-8681-1dbd210d43e8",
+
+ "origin": "dialogflow",
+ "id": "adf46068-180b-408a-8947-49c361ff72b2",
+ "_ts": 1533821927,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": 0.25,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-09T13:36:52.2780111Z",
+ "weather": {
+ "timestamp": "2018-08-09T13:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 21.5,
+ "tempFeelsLike": 23.6,
+ "relHumidity": 86,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.7,
+ "windGustSpeed": 13,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 82,
+ "pressure": 1012.8,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "8beea3cb-0e4c-4290-ac41-fbc39ab1e963",
+
+ "origin": "dialogflow",
+ "id": "12090f61-701b-44a6-97cb-f7b98ea02581",
+ "_ts": 1533821970,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-07T21:25:50.7176017Z",
+ "weather": {
+ "timestamp": "2018-08-07T21:20:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 25.6,
+ "tempFeelsLike": 28.5,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 8.1,
+ "windGustSpeed": 11.7,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 91,
+ "pressure": 1011.7,
+ "precipPast24Hours": 18
+ },
+ "weatherLogId": "3c769a46-7202-4b87-a2b4-b1dec93b6d54",
+
+ "origin": "dialogflow",
+ "id": "0998b96e-fda4-447a-86f6-165bf1cbc9d4",
+ "_ts": 1533677151,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-06T21:34:23.3122289Z",
+ "weather": {
+ "timestamp": "2018-08-06T21:25:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 27.9,
+ "tempFeelsLike": 31.3,
+ "relHumidity": 72,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 11.4,
+ "windGustSpeed": 16,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 83,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "70f30ade-67d7-4c5a-9d7e-eac70a3a5343",
+
+ "origin": "dialogflow",
+ "id": "73a1a200-a536-4996-b9cb-6635b5df17db",
+ "_ts": 1533591263,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-05T23:32:35.1643275Z",
+ "weather": {
+ "timestamp": "2018-08-05T23:25:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 29,
+ "relHumidity": 63,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 15.2,
+ "windGustSpeed": 20.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 54,
+ "pressure": 1016.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "9b107452-ede0-46c1-8c9b-9a34c11d50e2",
+
+ "origin": "dialogflow",
+ "id": "96a55109-15dd-4c0f-85ff-912f8c76badb",
+ "_ts": 1533511955,
+ "deleted": false
+ },
+ {
+ "type": "maintlog",
+ "backwashed": false,
+ "brushed": false,
+ "cleanedFilter": false,
+ "vacuumed": true,
+ "flowRate": null,
+ "pressure": null,
+ "waterTemp": null,
+ "pumpRuntime": null,
+ "swgCellPercent": null,
+ "opened": false,
+ "closed": false,
+ "notes": null,
+
+ "logTimestamp": "2018-08-05T14:17:00.0463318Z",
+ "weather": {
+ "timestamp": "2018-08-05T14:10:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.7,
+ "tempFeelsLike": 30.5,
+ "relHumidity": 85,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 10.6,
+ "windGustSpeed": 14.5,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 52,
+ "pressure": 1020.1,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "7fb51a1e-2997-43be-9a35-11f48ca611b4",
+
+ "origin": "dialogflow",
+ "id": "e0a6f6c9-515f-4877-9bce-f6391d2bbc6b",
+ "_ts": 1533478620,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-08-04T20:37:27.0893588Z",
+ "weather": {
+ "timestamp": "2018-08-04T20:20:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 27.4,
+ "tempFeelsLike": 29.7,
+ "relHumidity": 55,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 7.9,
+ "windGustSpeed": 10.6,
+ "uvIndex": 3,
+ "uvIndexDesc": "Moderate",
+ "visibility": 6.4,
+ "cloudCover": 33,
+ "pressure": 1019.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0aa6eb0d-09b8-4245-a720-2b22685b8605",
+
+ "origin": "dialogflow",
+ "id": "aa1b9180-3f22-4107-ac1a-62a1b91d1fa1",
+ "_ts": 1533415047,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 6.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-08-04T15:27:37.9011375Z",
+ "weather": {
+ "timestamp": "2018-08-04T15:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 22.9,
+ "tempFeelsLike": 29.1,
+ "relHumidity": 79,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 6.7,
+ "windGustSpeed": 9.9,
+ "uvIndex": 8,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 24,
+ "pressure": 1019,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "0d7f3b3a-e67a-4773-83fe-31045212cc4a",
+
+ "origin": "dialogflow",
+ "id": "1f2c688f-8dd4-4190-bf42-f96b7b19b336",
+ "_ts": 1533396474,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-08-03T00:25:11.3787107Z",
+ "weather": {
+ "timestamp": "2018-08-03T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.5,
+ "tempFeelsLike": 24.4,
+ "relHumidity": 73,
+ "windDir": 135,
+ "windDirDesc": "SE",
+ "windSpeed": 13.1,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1015,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "a3e5c7cb-4b4f-4b16-835d-4e454b35a17d",
+
+ "origin": "dialogflow",
+ "id": "b4db8719-1480-4d97-ae5b-13a47ff2c74f",
+ "_ts": 1533255911,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-08-01T21:16:03.4408029Z",
+ "weather": {
+ "timestamp": "2018-08-01T21:10:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.1,
+ "tempFeelsLike": 22,
+ "relHumidity": 80,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 13.7,
+ "windGustSpeed": 17.1,
+ "uvIndex": 1,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1013.1,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "07e002b7-af16-4770-8c77-3996588a19e8",
+
+ "origin": "dialogflow",
+ "id": "5e46b288-b950-4d6d-9ef1-77a8083d14a1",
+ "_ts": 1533158163,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": null,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-30T23:47:58.6770836Z",
+ "weather": {
+ "timestamp": "2018-07-30T23:40:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 23.1,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 69,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 9.7,
+ "windGustSpeed": 12.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 84,
+ "pressure": 1016.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "98c28b44-8c02-4282-8d5d-d84b4779a730",
+
+ "origin": "dialogflow",
+ "id": "e2dd0091-148b-42ef-bd84-4702c02e5bb9",
+ "_ts": 1532994478,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-28T11:39:45.4772522Z",
+ "weather": {
+ "timestamp": "2018-07-28T11:35:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 17.5,
+ "tempFeelsLike": 17.6,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 13.4,
+ "windGustSpeed": 16.9,
+ "uvIndex": 2,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 65,
+ "pressure": 1017.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d5b29b45-837a-4dc9-8e37-f19076fd1f36",
+
+ "origin": "dialogflow",
+ "id": "3e2bba3e-4a80-41f6-83a7-8250ac9d6cf8",
+ "_ts": 1532777985,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 0.8,
+ "NormalizedAmount": 800,
+
+ "logTimestamp": "2018-07-27T00:30:26.7584573Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "9e50efe2-1378-4ee1-a718-3b00776e81cc",
+
+ "origin": "dialogflow",
+ "id": "9f82ced2-a906-4cdd-ab76-761b5ddbcf24",
+ "_ts": 1532651426,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 87,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-27T00:23:51.2269602Z",
+ "weather": {
+ "timestamp": "2018-07-27T00:15:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 22.6,
+ "tempFeelsLike": 21.7,
+ "relHumidity": 81,
+ "windDir": 248,
+ "windDirDesc": "WSW",
+ "windSpeed": 20.9,
+ "windGustSpeed": 29.6,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 4.8,
+ "cloudCover": 77,
+ "pressure": 1009.7,
+ "precipPast24Hours": 7
+ },
+ "weatherLogId": "e53c08a4-f77e-40ae-bc48-30c8e7150660",
+
+ "origin": "dialogflow",
+ "id": "bd2be2fc-9f04-4c21-8d19-676e5317bfcd",
+ "_ts": 1532651059,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-26T00:07:21.8672953Z",
+ "weather": {
+ "timestamp": "2018-07-26T00:03:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 26,
+ "tempFeelsLike": 25.6,
+ "relHumidity": 63,
+ "windDir": 180,
+ "windDirDesc": "S",
+ "windSpeed": 11.2,
+ "windGustSpeed": 13.9,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1010.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "d1d2e117-caef-46cb-bafc-4d5c532590ad",
+
+ "origin": "dialogflow",
+ "id": "a7f5a6d2-24a3-45e9-b62e-f6ad142619c5",
+ "_ts": 1532563642,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-25T00:03:16.614879Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "f3081451-8510-407a-8239-8f1d518d12c7",
+
+ "origin": null,
+ "id": "0eb12baa-9a8a-4873-808e-507b8ccf1fe5",
+ "_ts": 1532477010,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-24T23:59:16.1670206Z",
+ "weather": {
+ "timestamp": "2018-07-25T00:01:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 24.5,
+ "tempFeelsLike": 25.3,
+ "relHumidity": 74,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 7.1,
+ "windGustSpeed": 10.1,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 97,
+ "pressure": 1011.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "c70de094-6f97-462d-a6b0-a59b18ec4297",
+
+ "origin": "dialogflow",
+ "id": "df80a9b2-8307-4fb7-9a48-a09ee0a55d74",
+ "_ts": 1532476756,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 20,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T03:01:43.37876Z",
+ "weather": {
+ "timestamp": "2018-07-22T03:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 38,
+ "temp": 22.2,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 86,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 15.2,
+ "windGustSpeed": 19.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 88,
+ "pressure": 1007.6,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "444fd80f-91e6-4ef5-86fb-8c4f5a65f3d0",
+
+ "origin": "dialogflow",
+ "id": "ed1bb7b4-e61a-4e10-9cf5-85276cb52f1a",
+ "_ts": 1532228503,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.75,
+ "NormalizedAmount": 1750,
+
+ "logTimestamp": "2018-07-22T01:47:35.4244336Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "126e1d2d-f79f-42e5-a703-c865aa4a1436",
+
+ "origin": "dialogflow",
+ "id": "a054db03-f812-447d-b234-f3516f0ec2ef",
+ "_ts": 1532224055,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 15,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T01:45:31.6302124Z",
+ "weather": {
+ "timestamp": "2018-07-22T01:40:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.3,
+ "relHumidity": 81,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 13.9,
+ "windGustSpeed": 17.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 91,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "852197dd-4d50-403b-85d1-baa3f2142f57",
+
+ "origin": "dialogflow",
+ "id": "32186e7f-cfb7-4875-9797-844f7f8b64ca",
+ "_ts": 1532223932,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 4,
+ "NormalizedAmount": 4000,
+
+ "logTimestamp": "2018-07-22T00:43:19.1151705Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:30:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.5,
+ "tempFeelsLike": 22.1,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18.4,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 16.1,
+ "cloudCover": 93,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "1d65d2f3-18e1-4aab-ae20-45b8de501143",
+
+ "origin": "dialogflow",
+ "id": "a3dd1114-36c2-4ea3-90cf-2aa6b9a05f77",
+ "_ts": 1532220199,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": 0.5,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.43,
+ "waterTemp": 86,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-22T00:35:35.086717Z",
+ "weather": {
+ "timestamp": "2018-07-22T00:25:00Z",
+ "desc": "Cloudy",
+ "icon": 7,
+ "temp": 22.9,
+ "tempFeelsLike": 22.8,
+ "relHumidity": 82,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 14.9,
+ "windGustSpeed": 18,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 95,
+ "pressure": 1007,
+ "precipPast24Hours": 1
+ },
+ "weatherLogId": "55b4b107-8085-47c7-a480-4685a6c77915",
+
+ "origin": "dialogflow",
+ "id": "f9900745-085a-49e7-a8ae-47546700502b",
+ "_ts": 1532219779,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:57:25.361359Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "700bc4b1-6738-4021-abc2-75f3c9ebcead",
+
+ "origin": "dialogflow",
+ "id": "b66c50c8-2d78-4938-bf31-31a7cc7be3f4",
+ "_ts": 1532048246,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-20T00:53:03.9456967Z",
+ "weather": {
+ "timestamp": "2018-07-20T00:45:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.8,
+ "tempFeelsLike": 22.4,
+ "relHumidity": 67,
+ "windDir": 68,
+ "windDirDesc": "ENE",
+ "windSpeed": 17.8,
+ "windGustSpeed": 22.8,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 19,
+ "pressure": 1014.7,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "3cd942f7-4be9-4dc1-8249-c4d1e7653e89",
+
+ "origin": "dialogflow",
+ "id": "31825b59-cd10-4711-a2b9-f8d0ab81113a",
+ "_ts": 1532047984,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.5,
+ "NormalizedAmount": 1500,
+
+ "logTimestamp": "2018-07-17T00:04:45.3187924Z",
+ "weather": {
+ "timestamp": "2018-07-17T00:01:00Z",
+ "desc": "Mostly cloudy",
+ "icon": 6,
+ "temp": 25.8,
+ "tempFeelsLike": 28.3,
+ "relHumidity": 80,
+ "windDir": 293,
+ "windDirDesc": "WNW",
+ "windSpeed": 9.8,
+ "windGustSpeed": 14.5,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 79,
+ "pressure": 1009.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "78b12772-f10e-4aef-84c1-f8578143ef61",
+
+ "origin": "dialogflow",
+ "id": "7a4bc193-ce32-4d0c-b651-ffa7ddf7c010",
+ "_ts": 1531785885,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1033,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-15T17:47:44.093287Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "dc9e7aa4-b661-4e54-8b04-fb76745aaaad",
+
+ "origin": null,
+ "id": "f9876d6e-357e-4a5a-9f51-38fe522a9913",
+ "_ts": 1531676865,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 1.5,
+ "cc": 0,
+ "cya": 45,
+ "ch": null,
+ "ph": 7.5,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.42,
+ "waterTemp": 89,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-15T17:47:12Z",
+ "weather": {
+ "timestamp": "2018-07-15T17:40:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 27.2,
+ "tempFeelsLike": 32.8,
+ "relHumidity": 71,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 9.8,
+ "windGustSpeed": 12.8,
+ "uvIndex": 6,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 67,
+ "pressure": 1014.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "fbf5a79d-7109-4150-ae7a-c2175012368d",
+
+ "origin": null,
+ "id": "7b7c4ecf-c993-44e9-9e37-fcbf5093b5a0",
+ "_ts": 1532219834,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-12T17:45:58.3969482Z",
+ "weather": {
+ "timestamp": "2018-07-12T17:40:00Z",
+ "desc": "Partly sunny",
+ "icon": 3,
+ "temp": 24.2,
+ "tempFeelsLike": 28.4,
+ "relHumidity": 50,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 11.5,
+ "windGustSpeed": 14.8,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 48,
+ "pressure": 1023.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "109cc2c2-8b4d-47d8-969d-9da77ffbd6ff",
+
+ "origin": "dialogflow",
+ "id": "bcd1dab1-7cc2-4f83-accc-aba85e1abb79",
+ "_ts": 1531417558,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": null,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-08T17:02:21.8166098Z",
+ "weather": {
+ "timestamp": "2018-07-08T17:00:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 23.2,
+ "tempFeelsLike": 29,
+ "relHumidity": 56,
+ "windDir": 203,
+ "windDirDesc": "SSW",
+ "windSpeed": 5.9,
+ "windGustSpeed": 8.2,
+ "uvIndex": 9,
+ "uvIndexDesc": "Very High",
+ "visibility": 6.4,
+ "cloudCover": 26,
+ "pressure": 1025.6,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "246e9bad-dcfe-4b68-af12-f42085674295",
+
+ "origin": "dialogflow",
+ "id": "4798cb21-f79b-4121-bde1-b62d6cd33ff4",
+ "_ts": 1531069342,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 1328,
+ "NormalizedAmount": null,
+
+ "logTimestamp": "2018-07-07T18:35:24.715964Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "57403c31-a43e-4781-998f-c4817c1b943d",
+
+ "origin": null,
+ "id": "53bf83a7-a1e8-45b4-a8c2-d2240d246927",
+ "_ts": 1530988526,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 0.5,
+ "cc": null,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-07T18:34:11.45778Z",
+ "weather": {
+ "timestamp": "2018-07-07T18:25:00Z",
+ "desc": "Mostly sunny",
+ "icon": 2,
+ "temp": 21.4,
+ "tempFeelsLike": 24,
+ "relHumidity": 52,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 16.9,
+ "windGustSpeed": 24.6,
+ "uvIndex": 7,
+ "uvIndexDesc": "High",
+ "visibility": 6.4,
+ "cloudCover": 16,
+ "pressure": 1027.9,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "4af952ad-5480-4538-9acd-eac9fcdc80bb",
+
+ "origin": null,
+ "id": "25d11b3e-fabb-435d-b948-317b6af20423",
+ "_ts": 1530988459,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 0,
+ "Amount": 750,
+ "NormalizedAmount": 750,
+
+ "logTimestamp": "2018-07-05T23:25:47.8601697Z",
+ "weather": {
+ "timestamp": "2018-07-05T23:20:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.2,
+ "tempFeelsLike": 31.1,
+ "relHumidity": 76,
+ "windDir": 225,
+ "windDirDesc": "SW",
+ "windSpeed": 20.8,
+ "windGustSpeed": 27,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 73,
+ "pressure": 1017.2,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "cec7857d-0439-450c-9c9f-093876347eca",
+
+ "origin": "dialogflow",
+ "id": "36b7bca1-4b8b-476b-b49e-ce1c5d3a8e84",
+ "_ts": 1530833148,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1,
+ "NormalizedAmount": 1000,
+
+ "logTimestamp": "2018-07-04T23:13:10.293007Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "40a6cc38-5591-4dd8-9925-3524e3488d46",
+
+ "origin": "dialogflow",
+ "id": "50fa29ed-0008-48e6-b885-01fed3e92912",
+ "_ts": 1530745990,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 3,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": null,
+ "waterTemp": 91,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T23:10:51.6869302Z",
+ "weather": {
+ "timestamp": "2018-07-04T23:06:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 28.4,
+ "tempFeelsLike": 33.2,
+ "relHumidity": 78,
+ "windDir": 158,
+ "windDirDesc": "SSE",
+ "windSpeed": 8.8,
+ "windGustSpeed": 12.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 63,
+ "pressure": 1021.8,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "8d6fc2bb-6508-4455-9d39-c5209f21a50c",
+
+ "origin": "dialogflow",
+ "id": "0a2ce88c-b37b-43de-ac40-c9470be0cada",
+ "_ts": 1530746061,
+ "deleted": false
+ },
+ {
+ "type": "chemlog",
+ "Chemical": 0,
+ "runTime": null,
+ "Percent": 11,
+ "Unit": 1,
+ "Amount": 1.25,
+ "NormalizedAmount": 1250,
+
+ "logTimestamp": "2018-07-04T00:19:47.161294Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "ec82f9ca-b584-459c-b3be-1ba6f27ee534",
+
+ "origin": null,
+ "id": "8f52fd2d-b517-4ee1-9903-59f9b06146bf",
+ "_ts": 1530663595,
+ "deleted": false
+ },
+ {
+ "type": "testlog",
+ "fc": 2.5,
+ "cc": 0,
+ "cya": null,
+ "ch": null,
+ "ph": null,
+ "ta": null,
+ "salt": null,
+ "bor": null,
+ "tds": null,
+ "csi": 0.32,
+ "waterTemp": 88,
+ "waterTempUnits": null,
+
+ "logTimestamp": "2018-07-04T00:19:27.928185Z",
+ "weather": {
+ "timestamp": "2018-07-04T00:15:00Z",
+ "desc": "Clouds and sun",
+ "icon": 4,
+ "temp": 24.6,
+ "tempFeelsLike": 26.2,
+ "relHumidity": 86,
+ "windDir": 90,
+ "windDirDesc": "E",
+ "windSpeed": 15.5,
+ "windGustSpeed": 21.2,
+ "uvIndex": 0,
+ "uvIndexDesc": "Low",
+ "visibility": 6.4,
+ "cloudCover": 69,
+ "pressure": 1021.4,
+ "precipPast24Hours": 0
+ },
+ "weatherLogId": "afb0eff3-a2d1-4c0c-85da-beefa3fa248d",
+
+ "origin": null,
+ "id": "844069b4-9f46-43b1-8002-a111616f0bc2",
+ "_ts": 1530663575,
+ "deleted": false
+ }
+]
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Splash/splash.svg b/src/Controls/tests/ManualTests/Resources/Splash/splash.svg
new file mode 100644
index 000000000000..21dfb25f187b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Styles/Colors.xaml b/src/Controls/tests/ManualTests/Resources/Styles/Colors.xaml
new file mode 100644
index 000000000000..245758ba1793
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml b/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml
new file mode 100644
index 000000000000..848cf31e73cc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+ #DA0606
+ #255AAB
+ #0C64BC
+ #255AAB
+ #5e697c
+ #24416e
+ #24416e
+ #FFFFFF
+ #000000
+ #FFFFFF
+ #84C269
+ #DA0606
+ #3E73C4
+ #FFFFFF
+ #6D6D72
+ #979797
+ #0B71D9
+ #FFFFFF
+ #255AAB
+ #000000
+
+ #303030
+ #303030
+
+ #D500FF
+ #f7ccff
+ #FEEDF2
+ #D500FF
+ #f7ccff
+ #FEEDF2
+ #DA0641
+ #fca3bc
+ #FFDEE7
+ #56921C
+ #c7eda2
+ #E8F6DA
+ #1389AB
+ #a0e2f4
+ #E1F3F8
+ #D16403
+ #fed9b8
+ #F8E9DC
+ #656565
+ #dadada
+ #F1F1F1
+ #C26C6C
+ #f0dcdc
+ #FCF1F1
+ #79A44E
+ #dfead3
+ #EFF7E6
+ #FFA03A
+ #ffe8d0
+ #FFF6EC
+
+
+
+
+
+
+ #FFFFFF
+ #F3F7FA
+ #F3F7FA
+ #000000
+ #255AAB
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #000000
+ #DDDDE7
+ #0F4B76
+ #DDDDE7
+ #BABABA
+ #000000
+ #255AAB
+ #ECECEC
+ #FFFFFF
+ #A1A1A1
+ #A1A1A1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml.cs b/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml.cs
new file mode 100644
index 000000000000..7442b555865b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Styles/PoolStyles.xaml.cs
@@ -0,0 +1,9 @@
+namespace Microsoft.Maui.ManualTests.Gallery.Pool;
+
+public partial class PoolStyles : ResourceDictionary
+{
+ public PoolStyles()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Resources/Styles/Styles.xaml b/src/Controls/tests/ManualTests/Resources/Styles/Styles.xaml
new file mode 100644
index 000000000000..dc4a03475b51
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Resources/Styles/Styles.xaml
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml b/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml
new file mode 100644
index 000000000000..23640d4f3b96
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml.cs
new file mode 100644
index 000000000000..31d28a3ada2b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Animation/F1.xaml.cs
@@ -0,0 +1,21 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "F1",
+ title: "Animation tasks do not complete when Battery Saver enabled.",
+ category: Category.Animation)]
+public partial class F1 : ContentPage
+{
+ public F1()
+ {
+ InitializeComponent();
+
+ Appearing += async (sender, args) =>
+ {
+ await Label1.FadeTo(1, 120000);
+ Label2.IsVisible = true;
+ };
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml b/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml
new file mode 100644
index 000000000000..92caf3a3063c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml.cs b/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml.cs
new file mode 100644
index 000000000000..2d1180a56b7d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Animation/F2.xaml.cs
@@ -0,0 +1,21 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "F2",
+ title: "Animation tasks do not complete when Remove Animations enabled.",
+ category: Category.Animation)]
+public partial class F2 : ContentPage
+{
+ public F2()
+ {
+ InitializeComponent();
+
+ Appearing += async (sender, args) =>
+ {
+ await Label1.FadeTo(1, 120000);
+ Label2.IsVisible = true;
+ };
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml
new file mode 100644
index 000000000000..ec5d52c430b0
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml.cs
new file mode 100644
index 000000000000..0505edd23d8f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I10_Swipe.xaml.cs
@@ -0,0 +1,26 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I10",
+ title: "Swipe.",
+ category: Category.CollectionView)]
+public partial class I10_Swipe : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I10_Swipe()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml
new file mode 100644
index 000000000000..f66f265faa4f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml.cs
new file mode 100644
index 000000000000..c29989e8c70e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I1_Layout.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I1",
+ title: "Layout.",
+ category: Category.CollectionView)]
+
+public partial class I1_Layout : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I1_Layout()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml
new file mode 100644
index 000000000000..aa22f86ecdaa
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml.cs
new file mode 100644
index 000000000000..7442ca4efc45
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I2_Spacing.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I2",
+ title: "Spacing.",
+ category: Category.CollectionView)]
+
+public partial class I2_Spacing : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I2_Spacing()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml
new file mode 100644
index 000000000000..ad814c7f5a14
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml.cs
new file mode 100644
index 000000000000..f320d10ddb02
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I3_Sizing.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I3",
+ title: "Sizing.",
+ category: Category.CollectionView)]
+
+public partial class I3_Sizing : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I3_Sizing()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml
new file mode 100644
index 000000000000..93c08bbd8759
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml.cs
new file mode 100644
index 000000000000..7ca2b973a2c4
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I4_Selection.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I4",
+ title: "Selection.",
+ category: Category.CollectionView)]
+
+public partial class I4_Selection : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I4_Selection()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml
new file mode 100644
index 000000000000..472bd6d4f6f5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml.cs
new file mode 100644
index 000000000000..b5fe73de23c2
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I5_EmptyView.xaml.cs
@@ -0,0 +1,26 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I5",
+ title: "EmptyView.",
+ category: Category.CollectionView)]
+public partial class I5_EmptyView : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I5_EmptyView()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml
new file mode 100644
index 000000000000..a8be8b0fd3d4
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml.cs
new file mode 100644
index 000000000000..0536ba574b98
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I6_Grouping.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I6",
+ title: "Grouping.",
+ category: Category.CollectionView)]
+
+public partial class I6_Grouping : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I6_Grouping()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml
new file mode 100644
index 000000000000..af4431000d93
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml.cs
new file mode 100644
index 000000000000..459e74efa1bb
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I7_PullToRefresh.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I7",
+ title: "Pull To Refresh.",
+ category: Category.CollectionView)]
+
+public partial class I7_PullToRefresh : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I7_PullToRefresh()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml
new file mode 100644
index 000000000000..1b9d15ec50b5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml.cs
new file mode 100644
index 000000000000..8f189c67e4ec
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I8_HeaderAndFooters.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I8",
+ title: "Headers and Footers.",
+ category: Category.CollectionView)]
+
+public partial class I8_HeaderAndFooters : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I8_HeaderAndFooters()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml b/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml
new file mode 100644
index 000000000000..6d4be6a048b2
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml.cs b/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml.cs
new file mode 100644
index 000000000000..5d8bdf65e403
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/CollectionView/I9_Scrolling.xaml.cs
@@ -0,0 +1,26 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.CollectionView;
+
+[Test(
+ id: "I9",
+ title: "Scrolling.",
+ category: Category.CollectionView)]
+public partial class I9_Scrolling : ContentPage
+{
+ public ICommand NavigateCommand { get; private set; }
+ public I9_Scrolling()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml
new file mode 100644
index 000000000000..b1b16cb27244
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml.cs
new file mode 100644
index 000000000000..c50ef444f2c6
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G1.xaml.cs
@@ -0,0 +1,36 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G1", title: "Button IsEnabled property doesn't work if used with Command property.", category: Category.Commands)]
+public partial class G1 : ContentPage
+{
+ public G1()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_Clicked(object sender, EventArgs e)
+ {
+ Console.WriteLine("Button_Clicked");
+ }
+}
+
+public class ViewModel
+{
+ public ViewModel()
+ {
+ Command = new Command(HandleCommand);
+ }
+
+ public bool IsButtonEnabled { get; set; } = false;
+
+ public ICommand Command { get; set; }
+
+ private static void HandleCommand()
+ {
+ Console.WriteLine("HandleCommand");
+ }
+}
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml
new file mode 100644
index 000000000000..90e31399ac20
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml.cs
new file mode 100644
index 000000000000..8ef8cae0321d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G2.xaml.cs
@@ -0,0 +1,40 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G2", title: "Entry Return command not firing up.", category: Category.Commands)]
+public partial class G2 : ContentPage
+{
+ public G2()
+ {
+ InitializeComponent();
+
+ Entry1Command = new Command(HandleEntry1Command);
+ Entry2Command = new Command(HandleEntry2Command);
+ Entry3Command = new Command(HandleEntry3Command);
+
+ BindingContext = this;
+ }
+
+ public ICommand Entry1Command { get; set; }
+
+ public ICommand Entry2Command { get; set; }
+
+ public ICommand Entry3Command { get; set; }
+
+ private void HandleEntry1Command()
+ {
+ Label1.BackgroundColor = Colors.Green;
+ }
+
+ private void HandleEntry2Command()
+ {
+ Label2.BackgroundColor = Colors.Green;
+ }
+
+ private void HandleEntry3Command()
+ {
+ Label3.BackgroundColor = Colors.Green;
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml
new file mode 100644
index 000000000000..b7ccacaa2bf0
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml.cs
new file mode 100644
index 000000000000..6d14b3bb9601
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G3.xaml.cs
@@ -0,0 +1,26 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G3", title: "Page changing using menu bar stops command in menu bar from working.", category: Category.Commands)]
+public partial class G3 : ContentPage
+{
+ public G3()
+ {
+ InitializeComponent();
+
+ MenuCommand = new Command(HandleMenuCommand);
+
+ Routing.RegisterRoute(nameof(G3Page), typeof(G3Page));
+
+ BindingContext = this;
+ }
+
+ public ICommand MenuCommand { get; set; }
+
+ private async void HandleMenuCommand()
+ {
+ await Shell.Current.GoToAsync(nameof(G3Page));
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml
new file mode 100644
index 000000000000..53cdf84ba933
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml.cs
new file mode 100644
index 000000000000..310c48fcdbe9
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G3Page.xaml.cs
@@ -0,0 +1,22 @@
+using System.Windows.Input;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+public partial class G3Page : ContentPage
+{
+ public G3Page()
+ {
+ InitializeComponent();
+
+ GoBackCommand = new Command(HandleGoBackCommand);
+
+ BindingContext = this;
+ }
+
+ public ICommand GoBackCommand { get; set; }
+
+ private async void HandleGoBackCommand()
+ {
+ await Shell.Current.GoToAsync("..");
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml
new file mode 100644
index 000000000000..51ef44198ff0
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml.cs
new file mode 100644
index 000000000000..dfb6c1030a47
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G4.xaml.cs
@@ -0,0 +1,24 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G4", title: "Shell BackButtonBehavior binding Command to valid ICommand causes back button to disappear.", category: Category.Commands)]
+public partial class G4 : ContentPage
+{
+ public G4()
+ {
+ InitializeComponent();
+
+ GoBackCommand = new Command(HandleGoBackCommand);
+
+ BindingContext = this;
+ }
+
+ public ICommand GoBackCommand { get; set; }
+
+ private async void HandleGoBackCommand()
+ {
+ await Shell.Current.GoToAsync("..");
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml
new file mode 100644
index 000000000000..d13ea2854a0e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml.cs
new file mode 100644
index 000000000000..2677a4c7dd0e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G5.xaml.cs
@@ -0,0 +1,31 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G5", title: "Command.ChangeCanExecute() does not work correctly.", category: Category.Commands)]
+public partial class G5 : ContentPage
+{
+ public G5()
+ {
+ InitializeComponent();
+
+ OnCommand = new Command(execute: HandleCommand, canExecute: () => !Toggle);
+ OffCommand = new Command(execute: HandleCommand, canExecute: () => Toggle);
+
+ BindingContext = this;
+ }
+
+ private void HandleCommand()
+ {
+ Toggle = !Toggle;
+ ((Command)OnCommand).ChangeCanExecute();
+ ((Command)OffCommand).ChangeCanExecute();
+ }
+
+ public bool Toggle { get; set; } = false;
+
+ public ICommand OnCommand { get; set; }
+
+ public ICommand OffCommand { get; set; }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml
new file mode 100644
index 000000000000..b25e4373c177
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml.cs
new file mode 100644
index 000000000000..e5c777c6f4e1
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G6.xaml.cs
@@ -0,0 +1,86 @@
+using System.Collections.ObjectModel;
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G6", title: "RemainingItemsThresholdReachedCommand is not called for IsGrouped CollectionViews.", category: Category.Commands)]
+public partial class G6 : ContentPage
+{
+ public G6()
+ {
+ InitializeComponent();
+
+ BindingContext = new MainPageViewModel();
+ }
+}
+
+public class Person
+{
+ public string Name { get; set; }
+}
+
+public class StudyGroup : List
+{
+ private static int counter = 0;
+
+ public static StudyGroup CreateStudyGroup()
+ {
+ counter++;
+ return new()
+ {
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ new Person{Name = $"{counter}"},
+ };
+ }
+}
+
+public class MainPageViewModel : BindableObject
+{
+ private ObservableCollection studyGroups;
+
+ public ObservableCollection StudyGroups
+ {
+ get
+ {
+ return studyGroups;
+ }
+ set
+ {
+ if (studyGroups != value)
+ {
+ studyGroups = value;
+ OnPropertyChanged(nameof(StudyGroups));
+ }
+ }
+ }
+
+ public ICommand ThresholdReachedCommand { get; }
+
+ public MainPageViewModel()
+ {
+ studyGroups = new ObservableCollection()
+ {
+ StudyGroup.CreateStudyGroup(),
+ StudyGroup.CreateStudyGroup(),
+ StudyGroup.CreateStudyGroup()
+ };
+
+ ThresholdReachedCommand = new Command(ThresholdReachedOperation);
+ }
+
+ private void ThresholdReachedOperation(object obj)
+ {
+ StudyGroups.Add(StudyGroup.CreateStudyGroup());
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml
new file mode 100644
index 000000000000..df8c2a92933b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml.cs
new file mode 100644
index 000000000000..7dc37b270d00
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G7.xaml.cs
@@ -0,0 +1,24 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G7", title: "Render Menuitems in the Shell as disabled if a command's CanExecute returns false.", category: Category.Commands)]
+public partial class G7 : ContentPage
+{
+ public G7()
+ {
+ InitializeComponent();
+
+ MenuCommand = new Command(execute: HandleMenuCommand, canExecute: () => false);
+
+ BindingContext = this;
+ }
+
+ public ICommand MenuCommand { get; set; }
+
+ private void HandleMenuCommand()
+ {
+ Console.WriteLine(nameof(HandleMenuCommand));
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml b/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml
new file mode 100644
index 000000000000..45c548c7987a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml.cs b/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml.cs
new file mode 100644
index 000000000000..650571d72436
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Commands/G8.xaml.cs
@@ -0,0 +1,24 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Commands;
+
+[Test(id: "G8", title: "ShellTitleView command binding not working.", category: Category.Commands)]
+public partial class G8 : ContentPage
+{
+ public G8()
+ {
+ InitializeComponent();
+
+ ImageButtonCommand = new Command(execute: HandleImageButtonCommandCommand);
+
+ BindingContext = this;
+ }
+
+ public ICommand ImageButtonCommand { get; set; }
+
+ private void HandleImageButtonCommandCommand()
+ {
+ Label.BackgroundColor = Colors.Green;
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml
new file mode 100644
index 000000000000..04b1da262a00
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml.cs
new file mode 100644
index 000000000000..2998342df7fd
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D1.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D1",
+ title: "AutoSize expansion and contraction.",
+ category: Category.Editor)]
+public partial class D1 : ContentPage
+{
+ public D1()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml
new file mode 100644
index 000000000000..ac6cdf399a11
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml.cs
new file mode 100644
index 000000000000..63d87d6b15c8
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D10.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D10",
+ title: "Customize cursor position.",
+ category: Category.Editor)]
+public partial class D10 : ContentPage
+{
+ public D10()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml
new file mode 100644
index 000000000000..0bbff34bdb26
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml.cs
new file mode 100644
index 000000000000..828e75f5ce9e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D11.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D11",
+ title: "Customize font.",
+ category: Category.Editor)]
+public partial class D11 : ContentPage
+{
+ public D11()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml
new file mode 100644
index 000000000000..484478e914e2
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml.cs
new file mode 100644
index 000000000000..3e2dbeb72cf5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D12.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D12",
+ title: "Customize placeholder.",
+ category: Category.Editor)]
+public partial class D12 : ContentPage
+{
+ public D12()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml
new file mode 100644
index 000000000000..3150c7b1250a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml.cs
new file mode 100644
index 000000000000..bf34d32eb6cc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D13.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D13",
+ title: "Customize text alignment.",
+ category: Category.Editor)]
+public partial class D13 : ContentPage
+{
+ public D13()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml
new file mode 100644
index 000000000000..13d82a28a470
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml.cs
new file mode 100644
index 000000000000..3a7514066a10
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D14.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D14",
+ title: "Customize background color.",
+ category: Category.Editor)]
+public partial class D14 : ContentPage
+{
+ public D14()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml
new file mode 100644
index 000000000000..ce0010518b45
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml.cs
new file mode 100644
index 000000000000..648ec23d7595
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D15.xaml.cs
@@ -0,0 +1,45 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D15",
+ title: "Events work correctly.",
+ category: Category.Editor)]
+public partial class D15 : ContentPage
+{
+ public D15()
+ {
+ InitializeComponent();
+ }
+
+ private void Editor_Loaded(object sender, EventArgs e)
+ {
+ Label1.BackgroundColor = Colors.LightBlue;
+ Label1.TextColor = Colors.Black;
+ }
+
+ private void Editor_Focused(object sender, FocusEventArgs e)
+ {
+ Label2.BackgroundColor = Colors.LightBlue;
+ Label2.TextColor = Colors.Black;
+ }
+
+ private void Editor_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ Label3.BackgroundColor = Colors.LightBlue;
+ Label3.TextColor = Colors.Black;
+ }
+
+ private void Editor_Completed(object sender, EventArgs e)
+ {
+ Label4.BackgroundColor = Colors.LightBlue;
+ Label4.TextColor = Colors.Black;
+ }
+
+ private void Editor_Unfocused(object sender, FocusEventArgs e)
+ {
+ Label5.BackgroundColor = Colors.LightBlue;
+ Label5.TextColor = Colors.Black;
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml
new file mode 100644
index 000000000000..c572800b26be
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml.cs
new file mode 100644
index 000000000000..94ec397430eb
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D16.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D16",
+ title: "Tab navigation works correctly.",
+ category: Category.Editor)]
+public partial class D16 : ContentPage
+{
+ public D16()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml
new file mode 100644
index 000000000000..9c7f0c6b7e7a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml.cs
new file mode 100644
index 000000000000..da74e713b00d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D17.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D17",
+ title: "Unfocus works correctly.",
+ category: Category.Editor)]
+public partial class D17 : ContentPage
+{
+ public D17()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml
new file mode 100644
index 000000000000..74fa711a5a47
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml.cs
new file mode 100644
index 000000000000..7bdb9abc7a3d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D18.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D18",
+ title: "Scrolling works correctly.",
+ category: Category.Editor)]
+public partial class D18 : ContentPage
+{
+ public D18()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml
new file mode 100644
index 000000000000..dc65cb319883
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml.cs
new file mode 100644
index 000000000000..390bbca0766c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D19.xaml.cs
@@ -0,0 +1,23 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D19",
+ title: "Window resize works correctly.",
+ category: Category.Editor)]
+public partial class D19 : ContentPage
+{
+ public D19()
+ {
+ InitializeComponent();
+ }
+
+ private void Editor_Loaded(object sender, EventArgs e)
+ {
+ for (int i = 0; i < 40; i++)
+ {
+ Editor.Text += "testing\n";
+ }
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml
new file mode 100644
index 000000000000..e6cfff0a361e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml.cs
new file mode 100644
index 000000000000..cbe10c9c85d4
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D2.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D2",
+ title: "Customize character spacing.",
+ category: Category.Editor)]
+public partial class D2 : ContentPage
+{
+ public D2()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml
new file mode 100644
index 000000000000..0b0dcc727531
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml.cs
new file mode 100644
index 000000000000..f38220627745
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D20.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D20",
+ title: "Cursor position after tab navigation.",
+ category: Category.Editor)]
+public partial class D20 : ContentPage
+{
+ public D20()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml
new file mode 100644
index 000000000000..5d4b435509e2
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml.cs
new file mode 100644
index 000000000000..840e49d0b0f6
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D21.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D21",
+ title: "IsReadOnly is focusable.",
+ category: Category.Editor)]
+public partial class D21 : ContentPage
+{
+ public D21()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml
new file mode 100644
index 000000000000..c6e37743d086
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml.cs
new file mode 100644
index 000000000000..00b5770ee3b0
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D22.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D22",
+ title: "Toggling IsSpellCheckEnabled should refresh red squiggly lines.",
+ category: Category.Editor)]
+public partial class D22 : ContentPage
+{
+ public D22()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml
new file mode 100644
index 000000000000..cea2a8f7d5ce
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml.cs
new file mode 100644
index 000000000000..e311d5998eb1
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D23.xaml.cs
@@ -0,0 +1,45 @@
+using System.Collections.ObjectModel;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D23",
+ title: "Screen is partially hidden when showing the virtual keyboard.",
+ category: Category.Editor)]
+public partial class D23 : ContentPage
+{
+ readonly ObservableCollection _messages = new();
+
+ int _counter = 0;
+
+ public D23()
+ {
+ InitializeComponent();
+
+ entryMessage.Completed += async (s, e) => await SendMessageAsync();
+ listViewMessages.ItemsSource = _messages;
+ }
+
+ async Task SendMessageAsync()
+ {
+ // simulates sending messages
+ await Task.Delay(200);
+
+ AppendMessage($"{DateTime.Now:HH:mm:ss}: {++_counter} {Message}");
+
+ Message = string.Empty;
+ }
+
+ private void AppendMessage(string message)
+ {
+ _messages.Add(message);
+ listViewMessages.ScrollTo(_messages.Last(), ScrollToPosition.End);
+ }
+
+ string Message
+ {
+ get => entryMessage.Text;
+ set => entryMessage.Text = value;
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml
new file mode 100644
index 000000000000..19dd0cc4f638
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml.cs
new file mode 100644
index 000000000000..07dcc81e588d
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D24.xaml.cs
@@ -0,0 +1,16 @@
+using System.Collections.ObjectModel;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D24",
+ title: "IsVisible and IsEnabled.",
+ category: Category.Editor)]
+public partial class D24 : ContentPage
+{
+ public D24()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml
new file mode 100644
index 000000000000..c44d0151d7cc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml.cs
new file mode 100644
index 000000000000..fac6057d8a26
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D3.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D3",
+ title: "Limit input length.",
+ category: Category.Editor)]
+public partial class D3 : ContentPage
+{
+ public D3()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml
new file mode 100644
index 000000000000..703a3e46971f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml.cs
new file mode 100644
index 000000000000..ab55cd09a63b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D4.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D4",
+ title: "Text transformation.",
+ category: Category.Editor)]
+public partial class D4 : ContentPage
+{
+ public D4()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml
new file mode 100644
index 000000000000..4120a7c2719c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml.cs
new file mode 100644
index 000000000000..b8047b79c5ad
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D5.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D5",
+ title: "Customize the keyboard.",
+ category: Category.Editor)]
+public partial class D5 : ContentPage
+{
+ public D5()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml
new file mode 100644
index 000000000000..095f4480299e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+ CapitalizeSentence
+
+
+
+
+
+
+
+
+
+
+
+ CapitalizeWord
+
+
+
+
+
+
+
+
+
+
+
+ CapitalizeCharacter
+
+
+
+
+
+
+
+
+
+
+
+ CapitalizeNone
+
+
+
+
+
+
+
+
+
+
+
+ Spellcheck
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml.cs
new file mode 100644
index 000000000000..6f587253ca00
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D6.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D6",
+ title: "Customize the keyboard flags.",
+ category: Category.Editor)]
+public partial class D6 : ContentPage
+{
+ public D6()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml
new file mode 100644
index 000000000000..98982858ac25
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml.cs
new file mode 100644
index 000000000000..4e21e5312363
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D7.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D7",
+ title: "Enable and disable spell checking.",
+ category: Category.Editor)]
+public partial class D7 : ContentPage
+{
+ public D7()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml
new file mode 100644
index 000000000000..4e943fbab13a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml.cs
new file mode 100644
index 000000000000..a926156a212c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D8.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D8",
+ title: "Enable and disable text prediction.",
+ category: Category.Editor)]
+public partial class D8 : ContentPage
+{
+ public D8()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml b/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml
new file mode 100644
index 000000000000..4175f5388a9c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml.cs b/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml.cs
new file mode 100644
index 000000000000..ca8b38547cba
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Editor/D9.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "D9",
+ title: "Prevent text entry.",
+ category: Category.Editor)]
+public partial class D9 : ContentPage
+{
+ public D9()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml b/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml
new file mode 100644
index 000000000000..6574b50b2107
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml.cs
new file mode 100644
index 000000000000..2dc5519503b8
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Entry/E1.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Entry;
+
+[Test(
+ id: "E1",
+ title: "IsPassword works correctly",
+ category: Category.Entry)]
+public partial class E1 : ContentPage
+{
+ public E1()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml b/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml
new file mode 100644
index 000000000000..0c7524e815d4
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml.cs b/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml.cs
new file mode 100644
index 000000000000..bd5cacc10751
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/FlyoutPage/H1.xaml.cs
@@ -0,0 +1,17 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+// More information: https://learn.microsoft.com/en-us/dotnet/maui/ios/platform-specifics/flyoutpage-shadow
+[Test(
+ id: "H1",
+ title: "FlyoutPage Shadow.",
+ category: Category.FlyoutPage)]
+public partial class H1 : FlyoutPage
+{
+ public H1()
+ {
+ InitializeComponent();
+ btn.Clicked += async (s, e) => await Navigation.PopModalAsync(false);
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml b/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml
new file mode 100644
index 000000000000..a13ada88153f
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml.cs
new file mode 100644
index 000000000000..85bd11bb6def
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Layout/A1.xaml.cs
@@ -0,0 +1,12 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Layout;
+
+[Test(id: "A1", title: "Controls inside AbsoluteLayout", category: Category.Layout)]
+public partial class A1 : ContentPage
+{
+ public A1()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml b/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml
new file mode 100644
index 000000000000..aa59caffda6a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml.cs b/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml.cs
new file mode 100644
index 000000000000..62367cf383cf
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Performance/K1_CollectionViewPool.xaml.cs
@@ -0,0 +1,31 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.Performance.CollectionViewPool;
+
+namespace Microsoft.Maui.ManualTests.Tests.Performance;
+
+[Test(
+ id: "K1",
+ title: "CollectionViewPool",
+ category: Category.Performance)]
+public partial class K1_CollectionViewPool : ContentPage
+{
+ public K1_CollectionViewPool()
+ {
+ InitializeComponent();
+ }
+
+ private async void Button_Clicked(object sender, EventArgs e)
+ {
+ var page = new PoolPage();
+ await page.LoadLogs();
+
+ try
+ {
+ await this.Navigation.PushAsync(page, true);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml
new file mode 100644
index 000000000000..0a499ac46027
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml.cs
new file mode 100644
index 000000000000..d9fe8f98a632
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C1.xaml.cs
@@ -0,0 +1,17 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.ViewModels;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C1",
+ title: "RefreshView with ScrollView child.",
+ category: Category.RefreshView)]
+public partial class C1 : ContentPage
+{
+ public C1()
+ {
+ InitializeComponent();
+ BindingContext = new MonkeysViewModel();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml
new file mode 100644
index 000000000000..c75b4c52085a
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml.cs
new file mode 100644
index 000000000000..23654ebf8f3c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C2.xaml.cs
@@ -0,0 +1,17 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.ViewModels;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C2",
+ title: "RefreshView with CollectionView child.",
+ category: Category.RefreshView)]
+public partial class C2 : ContentPage
+{
+ public C2()
+ {
+ InitializeComponent();
+ BindingContext = new MonkeysViewModel();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml
new file mode 100644
index 000000000000..19ebc04b4e59
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml.cs
new file mode 100644
index 000000000000..95b32a0ccc45
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C3.xaml.cs
@@ -0,0 +1,17 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.ViewModels;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C3",
+ title: "RefreshView with ListView child.",
+ category: Category.RefreshView)]
+public partial class C3 : ContentPage
+{
+ public C3()
+ {
+ InitializeComponent();
+ BindingContext = new MonkeysViewModel();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml
new file mode 100644
index 000000000000..7080fd1d0120
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml.cs
new file mode 100644
index 000000000000..67289a99f093
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C4.xaml.cs
@@ -0,0 +1,15 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C4",
+ title: "RefreshColor is displayed correctly.",
+ category: Category.RefreshView)]
+public partial class C4 : ContentPage
+{
+ public C4()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml
new file mode 100644
index 000000000000..cfc7a6196a53
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml.cs
new file mode 100644
index 000000000000..271730cab50c
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C5.xaml.cs
@@ -0,0 +1,27 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C5",
+ title: "Refresh command is executed correctly.",
+ category: Category.RefreshView)]
+public partial class C5 : ContentPage
+{
+ public C5()
+ {
+ InitializeComponent();
+
+ RefreshCommand = new Command(HandleRefreshCommand);
+
+ BindingContext = this;
+ }
+
+ public ICommand RefreshCommand { get; set; }
+
+ private void HandleRefreshCommand()
+ {
+ RefreshView.IsRefreshing = false;
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml
new file mode 100644
index 000000000000..2e7f1771a4fd
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml.cs
new file mode 100644
index 000000000000..23496ceb8d82
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C6.xaml.cs
@@ -0,0 +1,18 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.ViewModels;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C6",
+ title: "RefreshView is disabled correctly.",
+ category: Category.RefreshView)]
+public partial class C6 : ContentPage
+{
+ public C6()
+ {
+ InitializeComponent();
+
+ BindingContext = new MonkeysViewModel();
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml b/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml
new file mode 100644
index 000000000000..29279a94a106
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml.cs b/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml.cs
new file mode 100644
index 000000000000..de4fd57cc2dc
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/RefreshView/C7.xaml.cs
@@ -0,0 +1,44 @@
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.RefreshView;
+
+[Test(
+ id: "C7",
+ title: "Button within RefreshView usable while refreshing.",
+ category: Category.RefreshView)]
+public partial class C7 : ContentPage
+{
+ public C7()
+ {
+ InitializeComponent();
+
+ RefreshCommand = new Command(HandleRefreshCommand);
+ Counter = 0;
+
+ BindingContext = this;
+ }
+
+ private void HandleRefreshCommand()
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(10000);
+ RefreshView.IsRefreshing = false;
+ });
+ }
+
+ public ICommand RefreshCommand { get; set; }
+
+ public int Counter { get; set; }
+
+ private void Button_Clicked(object sender, EventArgs e)
+ {
+ Counter++;
+
+ if (Counter == 1)
+ Button.Text = $"Clicked {Counter} time";
+ else
+ Button.Text = $"Clicked {Counter} times";
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml b/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml
new file mode 100644
index 000000000000..183ab21c4fed
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml.cs b/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml.cs
new file mode 100644
index 000000000000..8db873e2ccf5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/Scroll/B1.xaml.cs
@@ -0,0 +1,96 @@
+using System.ComponentModel;
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.Scroll;
+
+[Test(id: "B1", title: "Controls rendered outside scroll view are still functional", category: Category.Scroll)]
+public partial class B1 : ContentPage
+{
+ public B1()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_Clicked(object sender, EventArgs e)
+ {
+ ButtonContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void ImageButton_Clicked(object sender, EventArgs e)
+ {
+ ImageButtonContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void RadioButton_CheckedChanged(object sender, CheckedChangedEventArgs e)
+ {
+ RadioButtonContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void SearchBar_SearchButtonPressed(object sender, EventArgs e)
+ {
+ SearchBarContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void SwipeItem_Invoked(object sender, EventArgs e)
+ {
+ SwipeViewContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void CheckBox_CheckedChanged(object sender, CheckedChangedEventArgs e)
+ {
+ CheckBoxContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void DatePicker_DateSelected(object sender, DateChangedEventArgs e)
+ {
+ DatePickerContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void Slider_ValueChanged(object sender, ValueChangedEventArgs e)
+ {
+ SliderContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void Stepper_ValueChanged(object sender, ValueChangedEventArgs e)
+ {
+ StepperContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void Switch_Toggled(object sender, ToggledEventArgs e)
+ {
+ SwitchContainer.BackgroundColor = Colors.Green;
+ }
+
+ private void TimePicker_PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ SwitchContainer.BackgroundColor = Colors.Green;
+ }
+
+ private bool editorTextChanged = false;
+ private void Editor_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ editorTextChanged = true;
+ }
+
+ private void Editor_Completed(object sender, EventArgs e)
+ {
+ if (editorTextChanged)
+ {
+ EditorContainer.BackgroundColor = Colors.Green;
+ }
+ }
+
+ private bool entryTextChanged = false;
+ private void Entry_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ entryTextChanged = true;
+ }
+
+ private void Entry_Completed(object sender, EventArgs e)
+ {
+ if (entryTextChanged)
+ {
+ EntryContainer.BackgroundColor = Colors.Green;
+ }
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/TestAttribute.cs b/src/Controls/tests/ManualTests/Tests/TestAttribute.cs
new file mode 100644
index 000000000000..27d01be0659b
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TestAttribute.cs
@@ -0,0 +1,18 @@
+namespace Microsoft.Maui.ManualTests.Tests;
+
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
+public class TestAttribute : Attribute
+{
+ public TestAttribute(string id, string title, string category)
+ {
+ Id = id;
+ Title = title;
+ Category = category;
+ }
+
+ public string Id { get; set; }
+
+ public string Title { get; set; }
+
+ public string Category { get; set; }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TestPageInfo.cs b/src/Controls/tests/ManualTests/Tests/TestPageInfo.cs
new file mode 100644
index 000000000000..b44d3d8651d5
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TestPageInfo.cs
@@ -0,0 +1,30 @@
+namespace Microsoft.Maui.ManualTests.Tests;
+
+public class TestPageInfo : IComparable
+{
+ public TestPageInfo(Type type, TestAttribute test)
+ {
+ Type = type;
+ Test = test;
+ }
+
+ public Type Type { get; }
+
+ public TestAttribute Test { get; }
+
+ public int CompareTo(TestPageInfo other)
+ {
+ if (Test.Id.Length > other.Test.Id.Length)
+ {
+ return 1;
+ }
+ else if (Test.Id.Length < other.Test.Id.Length)
+ {
+ return -1;
+ }
+ else
+ {
+ return string.Compare(Test.Id, other.Test.Id, StringComparison.Ordinal);
+ }
+ }
+}
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml b/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml
new file mode 100644
index 000000000000..93f09e97f0b7
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml.cs b/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml.cs
new file mode 100644
index 000000000000..b33e57db0736
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J1.xaml.cs
@@ -0,0 +1,127 @@
+using Microsoft.Maui.ManualTests.Categories;
+using Microsoft.Maui.ManualTests.ViewModels;
+
+namespace Microsoft.Maui.ManualTests.Tests.TitleBar;
+
+[Test(
+ id: "J1",
+ title: "Check Window.Title when push Modal Page.",
+ category: Category.TitleBar)]
+public partial class J1 : ContentPage
+{
+ static int ModalPageCount1 = 0;
+ public static string ModalStackCountText1 => $"ModalPageCount: {ModalPageCount1}";
+
+ string _previousTitle;
+
+ public J1()
+ {
+ InitializeComponent();
+ BackgroundColor = Colors.White;
+ Title = $"Modal Page {ModalPageCount1}";
+ }
+
+ protected override void OnNavigatingFrom(NavigatingFromEventArgs args)
+ {
+ _previousTitle = this.Window?.Title;
+ base.OnNavigatingFrom(args);
+ }
+
+ protected override void OnNavigatedTo(NavigatedToEventArgs args)
+ {
+ if (this.Window is null)
+ return;
+
+ if (PopModal.IsVisible)
+ {
+ this.Window.Title = "Modal Gallery";
+ }
+ else if (!String.IsNullOrWhiteSpace(_previousTitle))
+ {
+ this.Window.Title = _previousTitle;
+ }
+ }
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ PopModal.IsVisible = Navigation.ModalStack.Count > 0;
+ }
+
+ protected override void OnDisappearing()
+ {
+ base.OnDisappearing();
+ this.Window.Title = "";
+ }
+
+ //async void PushNavigationModalClicked(object sender, EventArgs e)
+ //{
+ // var j1 = new J1();
+ // Page pushMe = new NavigationPage(j1)
+ // {
+ // BackgroundColor =
+ // (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White,
+ // Title = $"Navigation Root: {j1.Title}"
+ // };
+
+ // await Navigation.PushModalAsync(pushMe);
+
+ //}
+
+ async void PushModalClicked(object sender, EventArgs e)
+ {
+ ModalPageCount1++;
+
+ Page pushMe = new J1()
+ {
+ BackgroundColor =
+ (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White
+ };
+
+ await Navigation.PushModalAsync(pushMe);
+ }
+
+ //async void PushClicked(object sender, EventArgs e)
+ //{
+ // await Navigation.PushAsync(new J1()
+ // {
+ // BackgroundColor =
+ // (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White
+ // });
+ //}
+
+ async void PopModalClicked(object sender, EventArgs e)
+ {
+ if (Navigation.ModalStack.Count <= 0)
+ {
+ await DisplayAlert("Alert", "There is no more page to pop up, please click button 'Push Modal Page' to push page first !", "OK");
+ return;
+ }
+
+ await Navigation.PopModalAsync();
+ ModalPageCount1--;
+ }
+
+ //async void PushFlyoutPageClicked(object sender, EventArgs e)
+ //{
+ // var j1 = new J1();
+ // Page newMainPage = new NavigationPage(j1)
+ // {
+ // BackgroundColor =
+ // (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White,
+ // Title = $"Navigation Root: {j1.Title}"
+ // };
+
+ // var flyoutPage = new FlyoutPage()
+ // {
+ // Detail = newMainPage,
+ // Flyout = new ContentPage()
+ // {
+ // Content = new Label() { Text = "Flyout Text" },
+ // Title = "Flyout Title"
+ // }
+ // };
+
+ // await Navigation.PushModalAsync(flyoutPage);
+ //}
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml b/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml
new file mode 100644
index 000000000000..99dd74322592
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml.cs b/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml.cs
new file mode 100644
index 000000000000..a3803b5d7111
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J2.xaml.cs
@@ -0,0 +1,78 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.TitleBar;
+
+[Test(
+ id: "J2",
+ title: "Check Window.TitleBar when push Modal Page.",
+ category: Category.TitleBar)]
+public partial class J2 : ContentPage
+{
+ public static int ModalPageCount2 = 0;
+ public static string ModalStackCountText2 => $"ModalPageCount: {ModalPageCount2}";
+
+ public J2()
+ {
+ InitializeComponent();
+ BackgroundColor = Colors.White;
+ Title = $"Modal Page {ModalPageCount2}";
+ }
+
+#if NET9_0_OR_GREATER
+ Microsoft.Maui.Controls.TitleBar TitleBar = new Microsoft.Maui.Controls.TitleBar()
+ {
+ Title = "[TitleBar.TitleBar]",
+ Subtitle = "[Title.Subtitle]",
+ BackgroundColor = Color.FromRgb(255, 255, 0)
+ };
+
+ protected override void OnNavigatedTo(NavigatedToEventArgs args)
+ {
+ if (this.Window is null)
+ return;
+
+ this.Window.TitleBar = TitleBar;
+ }
+
+ protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
+ {
+ base.OnNavigatedFrom(args);
+
+ var window = Application.Current.Windows.FirstOrDefault();
+
+ if (window != null && Navigation.ModalStack.Count == 0)
+ {
+ window.TitleBar = null;
+ }
+ }
+#endif
+
+ private async void PushModalClicked(object sender, EventArgs e)
+ {
+ ModalPageCount2++;
+ Page pushMe = new J2()
+ {
+ BackgroundColor =
+ (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White
+ };
+
+ await Navigation.PushModalAsync(pushMe);
+ }
+
+ private async void PopModalClicked(object sender, EventArgs e)
+ {
+ if (Navigation.ModalStack.Count <= 0)
+ {
+ await DisplayAlert("Alert", "There is no more page to pop up, please click button 'Push Modal Page' to push page first !", "OK");
+ return;
+ }
+ await Navigation.PopModalAsync(false);
+ ModalPageCount2--;
+ }
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ PopModal.IsVisible = Navigation.ModalStack.Count > 0;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml b/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml
new file mode 100644
index 000000000000..fddce77a7b96
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml.cs b/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml.cs
new file mode 100644
index 000000000000..c54187a3fbfb
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J3.xaml.cs
@@ -0,0 +1,64 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.TitleBar;
+
+[Test(
+ id: "J3",
+ title: "Check Window.TitleBar is not reset after changing Window.Page at runtime.",
+ category: Category.TitleBar)]
+public partial class J3 : ContentPage
+{
+ public static Page FirstPage;
+ public J3()
+ {
+ InitializeComponent();
+ this.ShowFirstPageBtn.IsEnabled = FirstPage != null;
+ }
+
+#if NET9_0_OR_GREATER
+ Microsoft.Maui.Controls.TitleBar TitleBar = new Microsoft.Maui.Controls.TitleBar()
+ {
+ Title = "[TitleBar.TitleBar]",
+ Subtitle = "[Title.Subtitle]",
+ BackgroundColor = Color.FromRgb(255, 255, 0)
+ };
+
+ protected override void OnNavigatedTo(NavigatedToEventArgs args)
+ {
+ if (this.Window is null)
+ return;
+ FirstPage = Window.Page;
+
+ this.Window.TitleBar = TitleBar;
+ }
+
+ protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
+ {
+ base.OnNavigatedFrom(args);
+
+ FirstPage = null;
+
+ var window = Application.Current.Windows.FirstOrDefault();
+
+ if (window != null)
+ {
+ window.TitleBar = null;
+ }
+ }
+#endif
+
+ private void AssignNewPage(object sender, EventArgs e)
+ {
+ var page = new J3()
+ {
+ BackgroundColor = (BackgroundColor == Colors.White) ? Colors.Pink : Colors.White
+ };
+
+ this.Window.Page = page;
+ }
+
+ private void ShowFirstPage(object sender, EventArgs e)
+ {
+ this.Window.Page = FirstPage;
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml b/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml
new file mode 100644
index 000000000000..12d0a2546a2e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml.cs b/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml.cs
new file mode 100644
index 000000000000..4869823f0217
--- /dev/null
+++ b/src/Controls/tests/ManualTests/Tests/TitleBar/J4.xaml.cs
@@ -0,0 +1,53 @@
+using Microsoft.Maui.ManualTests.Categories;
+
+namespace Microsoft.Maui.ManualTests.Tests.TitleBar;
+
+[Test(
+ id: "J4",
+ title: "Check Window Title when reverting from TitleBar to Default State",
+ category: Category.TitleBar)]
+public partial class J4 : ContentPage
+{
+ public J4()
+ {
+ InitializeComponent();
+ }
+
+#if NET9_0_OR_GREATER
+ Microsoft.Maui.Controls.TitleBar TitleBar = new Microsoft.Maui.Controls.TitleBar()
+ {
+ Title = "[TitleBar.TitleBar]",
+ Subtitle = "[Title.Subtitle]",
+ BackgroundColor = Color.FromRgb(255, 255, 0)
+ };
+ protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
+ {
+ base.OnNavigatedFrom(args);
+
+ var window = Application.Current.Windows.FirstOrDefault();
+
+ if (window != null)
+ {
+ window.Title = "";
+ window.TitleBar = null;
+ }
+
+ }
+ private void SetWindowTitle(object sender, EventArgs e)
+ {
+ if (this.Window != null)
+ {
+ this.Window.TitleBar = null;
+ this.Window.Title = "Title";
+ }
+ }
+
+ private void SetWindowTitleBar(object sender, EventArgs e)
+ {
+ if (this.Window != null)
+ {
+ this.Window.TitleBar = TitleBar;
+ }
+ }
+#endif
+}
\ No newline at end of file
diff --git a/src/Controls/tests/ManualTests/ViewModels/AnimalsViewModel.cs b/src/Controls/tests/ManualTests/ViewModels/AnimalsViewModel.cs
new file mode 100644
index 000000000000..cac19890af98
--- /dev/null
+++ b/src/Controls/tests/ManualTests/ViewModels/AnimalsViewModel.cs
@@ -0,0 +1,453 @@
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Models;
+
+namespace Microsoft.Maui.ManualTests.ViewModels
+{
+ public class AnimalsViewModel : INotifyPropertyChanged
+ {
+ int itemCount = 10;
+ const int MaximumItemCount = 50;
+ const int PageSize = 10;
+ const int RefreshDuration = 2;
+ bool isRefreshing;
+
+ public ObservableCollection Animals { get; private set; } = new ObservableCollection();
+
+ public bool IsRefreshing
+ {
+ get { return isRefreshing; }
+ set
+ {
+ isRefreshing = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public ICommand LoadMoreDataCommand => new Command(GetNextPageOfData);
+ public ICommand RefreshCommand => new Command(async () => await RefreshDataAsync());
+
+ public AnimalsViewModel()
+ {
+ AddBears();
+ }
+
+ void GetNextPageOfData()
+ {
+ switch (itemCount)
+ {
+ case 10:
+ AddCats();
+ break;
+ case 20:
+ AddDogs();
+ break;
+ case 30:
+ AddElephants();
+ break;
+ case 40:
+ AddMonkeys();
+ break;
+ }
+
+ if (itemCount < MaximumItemCount)
+ {
+ itemCount += PageSize;
+ }
+
+ Debug.WriteLine("Count: " + itemCount);
+ }
+
+ async Task RefreshDataAsync()
+ {
+ IsRefreshing = true;
+ await Task.Delay(TimeSpan.FromSeconds(RefreshDuration));
+ GetNextPageOfData();
+ IsRefreshing = false;
+ }
+
+ void AddBears()
+ {
+ Animals.Add(new Animal
+ {
+ Name = "American Black Bear",
+ Location = "North America",
+ Details = "The American black bear is a medium-sized bear native to North America. It is the continent's smallest and most widely distributed bear species. American black bears are omnivores, with their diets varying greatly depending on season and location. They typically live in largely forested areas, but do leave forests in search of food. Sometimes they become attracted to human communities because of the immediate availability of food. The American black bear is the world's most common bear species.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/08/01_Schwarzbär.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Asian Black Bear",
+ Location = "Asia",
+ Details = "The Asian black bear, also known as the moon bear and the white-chested bear, is a medium-sized bear species native to Asia and largely adapted to arboreal life. It lives in the Himalayas, in the northern parts of the Indian subcontinent, Korea, northeastern China, the Russian Far East, the Honshū and Shikoku islands of Japan, and Taiwan. It is classified as vulnerable by the International Union for Conservation of Nature (IUCN), mostly because of deforestation and hunting for its body parts.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG/180px-Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Brown Bear",
+ Location = "Northern Eurasia & North America",
+ Details = "The brown bear is a bear that is found across much of northern Eurasia and North America. In North America the population of brown bears are often called grizzly bears. It is one of the largest living terrestrial members of the order Carnivora, rivaled in size only by its closest relative, the polar bear, which is much less variable in size and slightly larger on average. The brown bear's principal range includes parts of Russia, Central Asia, China, Canada, the United States, Scandinavia and the Carpathian region, especially Romania, Anatolia and the Caucasus. The brown bear is recognized as a national and state animal in several European countries.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Kamchatka_Brown_Bear_near_Dvuhyurtochnoe_on_2015-07-23.jpg/320px-Kamchatka_Brown_Bear_near_Dvuhyurtochnoe_on_2015-07-23.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Grizzly-Polar Bear Hybrid",
+ Location = "Canadian Artic",
+ Details = "A grizzly–polar bear hybrid is a rare ursid hybrid that has occurred both in captivity and in the wild. In 2006, the occurrence of this hybrid in nature was confirmed by testing the DNA of a unique-looking bear that had been shot near Sachs Harbour, Northwest Territories on Banks Island in the Canadian Arctic. The number of confirmed hybrids has since risen to eight, all of them descending from the same female polar bear.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Grolar.JPG/276px-Grolar.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Sloth Bear",
+ Location = "Indian Subcontinent",
+ Details = "The sloth bear is an insectivorous bear species native to the Indian subcontinent. It is listed as Vulnerable on the IUCN Red List, mainly because of habitat loss and degradation. It has also been called labiated bear because of its long lower lip and palate used for sucking insects. Compared to brown and black bears, the sloth bear is lankier, has a long, shaggy fur and a mane around the face, and long, sickle-shaped claws. It evolved from the ancestral brown bear during the Pleistocene and through convergent evolution shares features found in insect-eating mammals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Sloth_Bear_Washington_DC.JPG/320px-Sloth_Bear_Washington_DC.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Sun Bear",
+ Location = "Southeast Asia",
+ Details = "The sun bear is a bear species occurring in tropical forest habitats of Southeast Asia. It is listed as Vulnerable on the IUCN Red List. The global population is thought to have declined by more than 30% over the past three bear generations. Suitable habitat has been dramatically reduced due to the large-scale deforestation that has occurred throughout Southeast Asia over the past three decades. The sun bear is also known as the honey bear, which refers to its voracious appetite for honeycombs and honey.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Sitting_sun_bear.jpg/319px-Sitting_sun_bear.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Polar Bear",
+ Location = "Artic Circle",
+ Details = "The polar bear is a hypercarnivorous bear whose native range lies largely within the Arctic Circle, encompassing the Arctic Ocean, its surrounding seas and surrounding land masses. It is a large bear, approximately the same size as the omnivorous Kodiak bear. A boar (adult male) weighs around 350–700 kg (772–1,543 lb), while a sow (adult female) is about half that size. Although it is the sister species of the brown bear, it has evolved to occupy a narrower ecological niche, with many body characteristics adapted for cold temperatures, for moving across snow, ice and open water, and for hunting seals, which make up most of its diet. Although most polar bears are born on land, they spend most of their time on the sea ice. Their scientific name means maritime bear and derives from this fact. Polar bears hunt their preferred food of seals from the edge of sea ice, often living off fat reserves when no sea ice is present. Because of their dependence on the sea ice, polar bears are classified as marine mammals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/66/Polar_Bear_-_Alaska_%28cropped%29.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Spectacled Bear",
+ Location = "South America",
+ Details = "The spectacled bear, also known as the Andean bear or Andean short-faced bear and locally as jukumari (Aymara), ukumari (Quechua) or ukuku, is the last remaining short-faced bear. Its closest relatives are the extinct Florida spectacled bear, and the giant short-faced bears of the Middle to Late Pleistocene age. Spectacled bears are the only surviving species of bear native to South America, and the only surviving member of the subfamily Tremarctinae. The species is classified as Vulnerable by the IUCN because of habitat loss.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Spectacled_Bear_-_Houston_Zoo.jpg/264px-Spectacled_Bear_-_Houston_Zoo.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Short-faced Bear",
+ Location = "Extinct",
+ Details = "The short-faced bears is an extinct bear genus that inhabited North America during the Pleistocene epoch from about 1.8 Mya until 11,000 years ago. It was the most common early North American bear and was most abundant in California. There are two recognized species: Arctodus pristinus and Arctodus simus, with the latter considered to be one of the largest known terrestrial mammalian carnivores that has ever existed. It has been hypothesized that their extinction coincides with the Younger Dryas period of global cooling commencing around 10,900 BC.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/ArctodusSimusSkeleton.jpg/320px-ArctodusSimusSkeleton.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "California Grizzly Bear",
+ Location = "Extinct",
+ Details = "The California grizzly bear is an extinct subspecies of the grizzly bear, the very large North American brown bear. Grizzly could have meant grizzled (that is, with golden and grey tips of the hair) or fear-inspiring. Nonetheless, after careful study, naturalist George Ord formally classified it in 1815 – not for its hair, but for its character – as Ursus horribilis (terrifying bear). Genetically, North American grizzlies are closely related; in size and coloring, the California grizzly bear was much like the grizzly bear of the southern coast of Alaska. In California, it was particularly admired for its beauty, size and strength. The grizzly became a symbol of the Bear Flag Republic, a moniker that was attached to the short-lived attempt by a group of American settlers to break away from Mexico in 1846. Later, this rebel flag became the basis for the state flag of California, and then California was known as the Bear State.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/d/de/Monarch_the_bear.jpg"
+ });
+ }
+
+ void AddCats()
+ {
+ Animals.Add(new Animal
+ {
+ Name = "Abyssinian",
+ Location = "Ethopia",
+ Details = "The Abyssinian is a breed of domestic short-haired cat with a distinctive tickedtabby coat, in which individual hairs are banded with different colors. The breed is named for Abyssinia (now called Ethiopia), where it is believed to have originated.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Gustav_chocolate.jpg/168px-Gustav_chocolate.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Arabian Mau",
+ Location = "Arabian Peninsula",
+ Details = "The Arabian Mau is a formal breed of domestic cat, originated from the desert cat, a short-haired landrace native to the desert of the Arabian Peninsula. It lives there in the streets and has adapted very well to the extreme climate. The Arabian Mau is recognized as a formal breed by few fancier and breeder organization and cat registry, World Cat Federation (WCF) and Emirates Feline Federation (EFF). Based on one landrace, the Arabian Mau is a natural breed.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/d/d3/Bex_Arabian_Mau.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Bengal",
+ Location = "Asia",
+ Details = "The Bengal cat is a domesticated cat breed created from hybrids of domestic cats and the Asian leopard cat – the breed name comes from the taxonomic name. Back-crossing to domestic cats is then done with the goal of creating a healthy, and docile cat with wild-looking, high-contrast coat. Bengals have a wild appearance and may show spots, rosettes, arrowhead markings, or marbling.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Paintedcats_Red_Star_standing.jpg/187px-Paintedcats_Red_Star_standing.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Burmese",
+ Location = "Thailand",
+ Details = "The Burmese cat is a breed of domestic cat, originating in Thailand, believed to have its roots near the present Thai-Burma border and developed in the United States and Britain.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/04/Blissandlucky11.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Cyprus",
+ Location = "Cyprus",
+ Details = "Cyprus cats, also known as Cypriot cats, Saint Helen cats, and Saint Nicholas cats, are a landrace of domestic cat found across the island of Cyprus. A standardized breed is being developed from them; among cat fancier and breeder organizations, it is presently fully recognized by the World Cat Federation (WCF), with breeding regulated by the World Cat Congress (WCC), under the name Aphrodite's Giant; and provisionally by The International Cat Association (TICA) as the Aphrodite. All three organizations permit shorthaired and semi-longhaired versions and no out-crossing to other breeds.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/CyprusShorthair.jpg/320px-CyprusShorthair.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "German Rex",
+ Location = "Germany",
+ Details = "The German Rex is a medium-sized breed with slender legs of a medium length. The head is round with well-developed cheeks and large, open ears. The eyes are of medium size in colours related to the coat colour. The coat is silky and short with a tendency to curl. The whiskers also curl, though less strongly than in the Cornish Rex. They may be nearly straight. All colours of coat, including white, are allowed. The body development is heavier than in the Cornish Rex - more like the European Shorthairs.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/c/c7/German_rex_harry_%28cropped%29.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Highlander",
+ Location = "United States",
+ Details = "The Highlander (also known as the Highlander Shorthair, and originally as the Highland Lynx), is an experimental breed of cat. The unique appearance of the Highlander comes from the deliberate cross between the Desert Lynx and the Jungle Curl breeds, also recently developed. The latter of these has some non-domestic ancestry from two Asian small cat species, the leopard cat and jungle cat, making the Highlander nominally a feline hybrid, though its foundation stock is mostly domestic cat.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Highlander-7.jpg/293px-Highlander-7.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Manx",
+ Location = "Isle of Man",
+ Details = "The Manx cat is a breed of domestic cat originating on the Isle of Man, with a naturally occurring mutation that shortens the tail. Many Manx have a small stub of a tail, but Manx cats are best known as being entirely tailless; this is the most distinguishing characteristic of the breed, along with elongated hind legs and a rounded head. Manx cats come in all coat colours and patterns, though all-white specimens are rare, and the coat range of the original stock was more limited. Long-haired variants are sometimes considered a separate breed, the Cymric. Manx are prized as skilled hunters, and thus have often been sought by farmers with rodent problems, and been a preferred ship's cat breed. They are said to be social, tame and active. An old local term for the cats on their home island is stubbin. Manx have been exhibited in cat shows since the 1800s, with the first known breed standard published in 1903.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/en/9/9b/Manx_cat_by_Karen_Weaver.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Peterbald",
+ Location = "Russia",
+ Details = "The Peterbald is a cat breed of Russian origin. It was created in St Petersburg in 1994 from an experimental breeding by Olga S. Mironova. They resemble Oriental Shorthairs with a hair-losing gene. The breed was accepted for Championship class competition in 2009.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/c/c7/Peterbald_male_Shango_by_Irina_Polunina.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Scottish Fold",
+ Location = "Scotland",
+ Details = "The Scottish Fold is a breed of domestic cat with a natural dominant-gene mutation that affects cartilage throughout the body, causing the ears to fold, bending forward and down towards the front of the head, which gives the cat what is often described as an owl-like appearance.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Adult_Scottish_Fold.jpg/240px-Adult_Scottish_Fold.jpg"
+ });
+ }
+
+ void AddDogs()
+ {
+ Animals.Add(new Animal
+ {
+ Name = "Afghan Hound",
+ Location = "Afghanistan",
+ Details = "The Afghan Hound is a hound that is distinguished by its thick, fine, silky coat and its tail with a ring curl at the end. The breed is selectively bred for its unique features in the cold mountains of Afghanistan. Other names for this breed are Kuchi Hound, Tāzī, Balkh Hound, Baluchi Hound, Barakzai Hound, Shalgar Hound, Kabul Hound, Galanday Hound or sometimes incorrectly African Hound.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/69/Afghane.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Alpine Dachsbracke",
+ Location = "Austria",
+ Details = "The Alpine Dachsbracke is a small breed of dog of the scent hound type originating in Austria. The Alpine Dachsbracke was bred to track wounded deer as well as boar, hare, and fox. It is highly efficient at following a trail even after it has gone cold. The Alpine Dachsbracke is very sturdy, and Austria is said to be the country of origin.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Alpejski_gończy_krótkonożny_g99.jpg/320px-Alpejski_gończy_krótkonożny_g99.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "American Bulldog",
+ Location = "United States",
+ Details = "The American Bulldog is a breed of utility dog descended from the Old English Bulldog.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/5/5e/American_Bulldog_600.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Bearded Collie",
+ Location = "Scotland",
+ Details = "The Bearded Collie, or Beardie, is a herding breed of dog once used primarily by Scottish shepherds, but now mostly a popular family companion. Bearded Collies have an average weight of 18–27 kilograms (40–60 lb). Males are around 51–56 centimetres (20–22 in) tall at the withers while females are around 51–53 centimetres (20–21 in) tall.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/9c/Bearded_Collie_600.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Boston Terrier",
+ Location = "United States",
+ Details = "The Boston Terrier is a breed of dog originating in the United States of America. This American Gentleman was accepted in 1893 by the American Kennel Club as a non-sporting breed. Color and markings are important when distinguishing this breed to the AKC standard. They should be either black, brindle or seal with white markings. Bostons are small and compact with a short tail and erect ears. The AKC says they are highly intelligent and very easily trained. They are friendly and can be stubborn at times. The average life span of a Boston is around 11 to 13 years, though some can live well into their teens.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Boston-terrier-carlos-de.JPG/320px-Boston-terrier-carlos-de.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Canadian Eskimo",
+ Location = "Canada",
+ Details = "The Canadian Eskimo Dog is an Arctic breed of working dog, which is often considered to be one of North America's oldest and rarest remaining purebred indigenous domestic canines. Other names include qimmiq or qimmit. They were brought from Siberia to North America by the Thule people 1,000 years ago, along with the Greenland Dog that is genetically identical.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/7/79/Spoonsced.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Eurohound",
+ Location = "Scandinavia",
+ Details = "A Eurohound (also known as a Eurodog or Scandinavian hound) is a type of dog bred for sled dog racing. The Eurohound is typically crossbred from the Alaskan husky group and any of a number of pointing breeds.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/98/Eurohound.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Irish Terrier",
+ Location = "Ireland",
+ Details = "The Irish Terrier is a dog breed from Ireland, one of many breeds of terrier. The Irish Terrier is considered one of the oldest terrier breeds. The Dublin dog show in 1873 was the first to provide a separate class for Irish Terriers. By the 1880s, Irish Terriers were the fourth most popular breed in Ireland and Britain.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/IrishTerrierSydenhamHillWoods.jpg/180px-IrishTerrierSydenhamHillWoods.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Kerry Beagle",
+ Location = "Ireland",
+ Details = "The Kerry Beagle is one of the oldest Irish hound breeds, believed to be descendant from the Old Southern Hound or the Celtic Hounds. It is the only extant scent hound breed native to Ireland.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/7/75/Kerry_Beagle_from_1915.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Norwegian Buhund",
+ Location = "Norway",
+ Details = "The Norwegian Buhund is a breed of dog of the spitz type. It is closely related to the Icelandic Sheepdog and the Jämthund. The Buhund is used as an all purpose farm and herding dog, as well as watch dog and a nanny dog.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/3/3b/Norwegian_Buhund_600.jpg"
+ });
+ }
+
+ void AddElephants()
+ {
+ Animals.Add(new Animal
+ {
+ Name = "African Bush Elephant",
+ Location = "Africa",
+ Details = "The African bush elephant, also known as the African savanna elephant, is the larger of the two species of African elephants, and the largest living terrestrial animal. These elephants were previously regarded as the same species, but the African forest elephant has been reclassified as L. cyclotis.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/African_Elephant_%28Loxodonta_africana%29_bull_%2831100819046%29.jpg/320px-African_Elephant_%28Loxodonta_africana%29_bull_%2831100819046%29.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "African Forest Elephant",
+ Location = "Africa",
+ Details = "The African forest elephant is a forest-dwelling species of elephant found in the Congo Basin. It is the smallest of the three extant species of elephant, but still one of the largest living terrestrial animals. The African forest elephant and the African bush elephan were considered to be one species until genetic studies indicated that they separated an estimated 2–7 million years ago. From an estimated population size of over 2 million prior to the colonization of Africa, the population in 2015 is estimated to be about 100,000 forest elephants, mostly living in the forests of Gabon. Due to a slower birth rate, the forest elephant takes longer to recover from poaching, which caused its population to fall by 65% from 2002 to 2014.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/6a/African_Forest_Elephant.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Desert Elephant",
+ Location = "Africa",
+ Details = "Desert elephants, or desert-adapted elephants are not a distinct species of elephant but are African bush elephants that have made their homes in the Namib and Sahara deserts in Africa. It was believed at one time that they were a subspecies of the African bush elephant but this is no longer thought to be the case. Desert-dwelling elephants were once more widespread in Africa than they are now and are currently found only in Namibia and Mali. They tend to migrate from one waterhole to another following traditional routes which depend on the seasonal availability of food and water. They face pressure from poaching and from changes in land use by humans.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Desert_elephants_in_the_Huab_River.jpg/320px-Desert_elephants_in_the_Huab_River.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Borneo Elephant",
+ Location = "Asia",
+ Details = "The Borneo elephant, also called the Borneo pygmy elephant, is a subspecies of Asian elephant that inhabits northeastern Borneo, in Indonesia and Malaysia. Its origin remains the subject of debate. A definitive subspecific classification as Elephas maximus borneensis awaits a detailed range-wide morphometric and genetic study. Since 1986, Elephas maximus has been listed as Endangered on the IUCN Red List as the population has declined by at least 50% over the last three generations, estimated to be 60–75 years. The species is pre-eminently threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Elephant_%40_kabini.jpg/180px-Elephant_%40_kabini.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Indian Elephant",
+ Location = "Asia",
+ Details = "The Indian elephant is one of three extant recognized subspecies of the Asian elephant and native to mainland Asia. Since 1986, the Asian elephant has been listed as Endangered on the IUCN Red List as the wild population has declined by at least 50% since the 1930s to 1940s, i.e. three elephant generations. The Asian elephant is threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Elephas_maximus_%28Bandipur%29.jpg/320px-Elephas_maximus_%28Bandipur%29.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Sri Lankan Elephant",
+ Location = "Asia",
+ Details = "The Sri Lankan elephant is one of three recognized subspecies of the Asian elephant, and native to Sri Lanka. Since 1986, Elephas maximus has been listed as endangered by IUCN as the population has declined by at least 50% over the last three generations, estimated to be 60–75 years. The species is primarily threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Srilankan_tuskelephant.jpg/213px-Srilankan_tuskelephant.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Sumatran Elephant",
+ Location = "Asia",
+ Details = "The Sumatran elephant is one of three recognized subspecies of the Asian elephant, and native to the Indonesia island of Sumatra. In 2011, the Sumatran elephant has been classified as critically endangered by IUCN as the population has declined by at least 80% over the last three generations, estimated to be about 75 years. The subspecies is pre-eminently threatened by habitat loss, degradation and fragmentation, and poaching; over 69% of potential elephant habitat has been lost within the last 25 years. Much of the remaining forest cover is in blocks smaller than 250 km2 (97 sq mi), which are too small to contain viable elephant populations.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Borobudur-Temple-Park_Elephant-cage-01.jpg/320px-Borobudur-Temple-Park_Elephant-cage-01.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Pygmy Elephant",
+ Location = "Africa & Asia",
+ Details = "Pygmy elephants live in both Africa and Asia.The African pygmy elephant is currently considered to be a tiny morph of the African forest elephant. The Borneo elephant, a well-documented variety of elephant, is also calledmpygmy elephant. This elephant, inhabiting tropical rainforest in north Borneo (east Sabah and extreme north Kalimantan), was long thought to be identical to the Asian elephant and descended from a captive population. In 2003, DNA comparison revealed them to be probably a new subspecies.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/93/Borneo-elephant-PLoS_Biology.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Mammoth",
+ Location = "Extinct",
+ Details = "A mammoth is any species of the extinct genus Mammuthus, one of the many genera that make up the order of trunked mammals called proboscideans. The various species of mammoth were commonly equipped with long, curved tusks and, in northern species, a covering of long hair. They lived from the Pliocene epoch (from around 5 million years ago) into the Holocene at about 4,000 years ago, and various species existed in Africa, Europe, Asia, and North America. They were members of the family Elephantidae, which also contains the two genera of modern elephants and their ancestors.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Columbian_mammoth.JPG/320px-Columbian_mammoth.JPG"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Mastodon",
+ Location = "Extinct",
+ Details = "Mastodons are any species of extinct proboscideans in the genus Mammut, distantly related to elephants, that inhabited North and Central America during the late Miocene or late Pliocene up to their extinction at the end of the Pleistocene 10,000 to 11,000 years ago. Mastodons lived in herds and were predominantly forest-dwelling animals that fed on a mixed diet obtained by browsing and grazing with a seasonal preference for browsing, similar to living elephants.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Mammut_americanum.jpg/320px-Mammut_americanum.jpg"
+ });
+ }
+
+ void AddMonkeys()
+ {
+ Animals.Add(new Animal
+ {
+ Name = "Baboon",
+ Location = "Africa & Asia",
+ Details = "Baboons are African and Arabian Old World monkeys belonging to the genus Papio, part of the subfamily Cercopithecinae.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Capuchin Monkey",
+ Location = "Central & South America",
+ Details = "The capuchin monkeys are New World monkeys of the subfamily Cebinae. Prior to 2011, the subfamily contained only a single genus, Cebus.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Blue Monkey",
+ Location = "Central and East Africa",
+ Details = "The blue monkey or diademed monkey is a species of Old World monkey native to Central and East Africa, ranging from the upper Congo River basin east to the East African Rift and south to northern Angola and Zambia",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Squirrel Monkey",
+ Location = "Central & South America",
+ Details = "The squirrel monkeys are the New World monkeys of the genus Saimiri. They are the only genus in the subfamily Saimirinae. The name of the genus Saimiri is of Tupi origin, and was also used as an English name by early researchers.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Saimiri_sciureus-1_Luc_Viatour.jpg/220px-Saimiri_sciureus-1_Luc_Viatour.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Golden Lion Tamarin",
+ Location = "Brazil",
+ Details = "The golden lion tamarin also known as the golden marmoset, is a small New World monkey of the family Callitrichidae.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Golden_lion_tamarin_portrait3.jpg/220px-Golden_lion_tamarin_portrait3.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Japanese Macaque",
+ Location = "Japan",
+ Details = "The Japanese macaque, is a terrestrial Old World monkey species native to Japan. They are also sometimes known as the snow monkey because they live in areas where snow covers the ground for months each",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Macaca_fuscata_fuscata1.jpg/220px-Macaca_fuscata_fuscata1.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Mandrill",
+ Location = "Southern Cameroon, Gabon, Equatorial Guinea, and Congo",
+ Details = "The mandrill is a primate of the Old World monkey family, closely related to the baboons and even more closely to the drill. It is found in southern Cameroon, Gabon, Equatorial Guinea, and Congo.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Mandrill_at_san_francisco_zoo.jpg/220px-Mandrill_at_san_francisco_zoo.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Proboscis Monkey",
+ Location = "Borneo",
+ Details = "The proboscis monkey or long-nosed monkey, known as the bekantan in Malay, is a reddish-brown arboreal Old World monkey that is endemic to the south-east Asian island of Borneo.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Proboscis_Monkey_in_Borneo.jpg/250px-Proboscis_Monkey_in_Borneo.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Red-shanked Douc",
+ Location = "Vietnam, Laos",
+ Details = "The red-shanked douc is a species of Old World monkey, among the most colourful of all primates. This monkey is sometimes called the \"costumed ape\" for its extravagant appearance. From its knees to its ankles it sports maroon-red \"stockings\", and it appears to wear white forearm length gloves. Its attire is finished with black hands and feet. The golden face is framed by a white ruff, which is considerably fluffier in males. The eyelids are a soft powder blue. The tail is white with a triangle of white hair at the base. Males of all ages have a white spot on both sides of the corners of the rump patch, and red and white genitals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Portrait_of_a_Douc.jpg/159px-Portrait_of_a_Douc.jpg"
+ });
+ Animals.Add(new Animal
+ {
+ Name = "Gray-shanked Douc",
+ Location = "Vietnam",
+ Details = "The gray-shanked douc langur is a douc species native to the Vietnamese provinces of Quảng Nam, Quảng Ngãi, Bình Định, Kon Tum, and Gia Lai. The total population is estimated at 550 to 700 individuals. In 2016, Dr Benjamin Rawson, Country Director of Fauna & Flora International - Vietnam Programme, announced a discovery of an additional population of more than 500 individuals found in Central Vietnam, bringing the total population up to approximately 1000 individuals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Cuc.Phuong.Primate.Rehab.center.jpg/320px-Cuc.Phuong.Primate.Rehab.center.jpg"
+ });
+ }
+
+ #region INotifyPropertyChanged
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ #endregion
+ }
+}
diff --git a/src/Controls/tests/ManualTests/ViewModels/GroupedAnimalsViewModel.cs b/src/Controls/tests/ManualTests/ViewModels/GroupedAnimalsViewModel.cs
new file mode 100644
index 000000000000..7bb93713aa24
--- /dev/null
+++ b/src/Controls/tests/ManualTests/ViewModels/GroupedAnimalsViewModel.cs
@@ -0,0 +1,479 @@
+using Microsoft.Maui.ManualTests.Models;
+
+namespace Microsoft.Maui.ManualTests.ViewModels
+{
+ public class GroupedAnimalsViewModel
+ {
+ bool includeEmptyGroups;
+ public List Animals { get; private set; } = new List();
+
+ public GroupedAnimalsViewModel(bool emptyGroups = false)
+ {
+ includeEmptyGroups = emptyGroups;
+ CreateAnimalsCollection();
+ }
+
+ void CreateAnimalsCollection()
+ {
+ if (includeEmptyGroups)
+ Animals.Add(new AnimalGroup("Aardvarks", new List()));
+
+ Animals.Add(new AnimalGroup("Bears", new List
+ {
+ new Animal
+ {
+ Name = "American Black Bear",
+ Location = "North America",
+ Details = "The American black bear is a medium-sized bear native to North America. It is the continent's smallest and most widely distributed bear species. American black bears are omnivores, with their diets varying greatly depending on season and location. They typically live in largely forested areas, but do leave forests in search of food. Sometimes they become attracted to human communities because of the immediate availability of food. The American black bear is the world's most common bear species.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/08/01_Schwarzbär.jpg"
+ },
+ new Animal
+ {
+ Name = "Asian Black Bear",
+ Location = "Asia",
+ Details = "The Asian black bear, also known as the moon bear and the white-chested bear, is a medium-sized bear species native to Asia and largely adapted to arboreal life. It lives in the Himalayas, in the northern parts of the Indian subcontinent, Korea, northeastern China, the Russian Far East, the Honshū and Shikoku islands of Japan, and Taiwan. It is classified as vulnerable by the International Union for Conservation of Nature (IUCN), mostly because of deforestation and hunting for its body parts.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG/180px-Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG"
+ },
+ new Animal
+ {
+ Name = "Brown Bear",
+ Location = "Northern Eurasia & North America",
+ Details = "The brown bear is a bear that is found across much of northern Eurasia and North America. In North America the population of brown bears are often called grizzly bears. It is one of the largest living terrestrial members of the order Carnivora, rivaled in size only by its closest relative, the polar bear, which is much less variable in size and slightly larger on average. The brown bear's principal range includes parts of Russia, Central Asia, China, Canada, the United States, Scandinavia and the Carpathian region, especially Romania, Anatolia and the Caucasus. The brown bear is recognized as a national and state animal in several European countries.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Kamchatka_Brown_Bear_near_Dvuhyurtochnoe_on_2015-07-23.jpg/320px-Kamchatka_Brown_Bear_near_Dvuhyurtochnoe_on_2015-07-23.jpg"
+ },
+ new Animal
+ {
+ Name = "Grizzly-Polar Bear Hybrid",
+ Location = "Canadian Artic",
+ Details = "A grizzly–polar bear hybrid is a rare ursid hybrid that has occurred both in captivity and in the wild. In 2006, the occurrence of this hybrid in nature was confirmed by testing the DNA of a unique-looking bear that had been shot near Sachs Harbour, Northwest Territories on Banks Island in the Canadian Arctic. The number of confirmed hybrids has since risen to eight, all of them descending from the same female polar bear.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Grolar.JPG/276px-Grolar.JPG"
+ },
+ new Animal
+ {
+ Name = "Sloth Bear",
+ Location = "Indian Subcontinent",
+ Details = "The sloth bear is an insectivorous bear species native to the Indian subcontinent. It is listed as Vulnerable on the IUCN Red List, mainly because of habitat loss and degradation. It has also been called labiated bear because of its long lower lip and palate used for sucking insects. Compared to brown and black bears, the sloth bear is lankier, has a long, shaggy fur and a mane around the face, and long, sickle-shaped claws. It evolved from the ancestral brown bear during the Pleistocene and through convergent evolution shares features found in insect-eating mammals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Sloth_Bear_Washington_DC.JPG/320px-Sloth_Bear_Washington_DC.JPG"
+ },
+ new Animal
+ {
+ Name = "Sun Bear",
+ Location = "Southeast Asia",
+ Details = "The sun bear is a bear species occurring in tropical forest habitats of Southeast Asia. It is listed as Vulnerable on the IUCN Red List. The global population is thought to have declined by more than 30% over the past three bear generations. Suitable habitat has been dramatically reduced due to the large-scale deforestation that has occurred throughout Southeast Asia over the past three decades. The sun bear is also known as the honey bear, which refers to its voracious appetite for honeycombs and honey.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Sitting_sun_bear.jpg/319px-Sitting_sun_bear.jpg"
+ },
+ new Animal
+ {
+ Name = "Polar Bear",
+ Location = "Artic Circle",
+ Details = "The polar bear is a hypercarnivorous bear whose native range lies largely within the Arctic Circle, encompassing the Arctic Ocean, its surrounding seas and surrounding land masses. It is a large bear, approximately the same size as the omnivorous Kodiak bear. A boar (adult male) weighs around 350–700 kg (772–1,543 lb), while a sow (adult female) is about half that size. Although it is the sister species of the brown bear, it has evolved to occupy a narrower ecological niche, with many body characteristics adapted for cold temperatures, for moving across snow, ice and open water, and for hunting seals, which make up most of its diet. Although most polar bears are born on land, they spend most of their time on the sea ice. Their scientific name means maritime bear and derives from this fact. Polar bears hunt their preferred food of seals from the edge of sea ice, often living off fat reserves when no sea ice is present. Because of their dependence on the sea ice, polar bears are classified as marine mammals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/66/Polar_Bear_-_Alaska_%28cropped%29.jpg"
+ },
+ new Animal
+ {
+ Name = "Spectacled Bear",
+ Location = "South America",
+ Details = "The spectacled bear, also known as the Andean bear or Andean short-faced bear and locally as jukumari (Aymara), ukumari (Quechua) or ukuku, is the last remaining short-faced bear. Its closest relatives are the extinct Florida spectacled bear, and the giant short-faced bears of the Middle to Late Pleistocene age. Spectacled bears are the only surviving species of bear native to South America, and the only surviving member of the subfamily Tremarctinae. The species is classified as Vulnerable by the IUCN because of habitat loss.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Spectacled_Bear_-_Houston_Zoo.jpg/264px-Spectacled_Bear_-_Houston_Zoo.jpg"
+ },
+ new Animal
+ {
+ Name = "Short-faced Bear",
+ Location = "Extinct",
+ Details = "The short-faced bears is an extinct bear genus that inhabited North America during the Pleistocene epoch from about 1.8 Mya until 11,000 years ago. It was the most common early North American bear and was most abundant in California. There are two recognized species: Arctodus pristinus and Arctodus simus, with the latter considered to be one of the largest known terrestrial mammalian carnivores that has ever existed. It has been hypothesized that their extinction coincides with the Younger Dryas period of global cooling commencing around 10,900 BC.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/ArctodusSimusSkeleton.jpg/320px-ArctodusSimusSkeleton.jpg"
+ },
+ new Animal
+ {
+ Name = "California Grizzly Bear",
+ Location = "Extinct",
+ Details = "The California grizzly bear is an extinct subspecies of the grizzly bear, the very large North American brown bear. Grizzly could have meant grizzled (that is, with golden and grey tips of the hair) or fear-inspiring. Nonetheless, after careful study, naturalist George Ord formally classified it in 1815 – not for its hair, but for its character – as Ursus horribilis (terrifying bear). Genetically, North American grizzlies are closely related; in size and coloring, the California grizzly bear was much like the grizzly bear of the southern coast of Alaska. In California, it was particularly admired for its beauty, size and strength. The grizzly became a symbol of the Bear Flag Republic, a moniker that was attached to the short-lived attempt by a group of American settlers to break away from Mexico in 1846. Later, this rebel flag became the basis for the state flag of California, and then California was known as the Bear State.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/d/de/Monarch_the_bear.jpg"
+ }
+ }));
+
+ Animals.Add(new AnimalGroup("Cats", new List
+ {
+ new Animal
+ {
+ Name = "Abyssinian",
+ Location = "Ethopia",
+ Details = "The Abyssinian is a breed of domestic short-haired cat with a distinctive tickedtabby coat, in which individual hairs are banded with different colors. The breed is named for Abyssinia (now called Ethiopia), where it is believed to have originated.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Gustav_chocolate.jpg/168px-Gustav_chocolate.jpg"
+ },
+ new Animal
+ {
+ Name = "Arabian Mau",
+ Location = "Arabian Peninsula",
+ Details = "The Arabian Mau is a formal breed of domestic cat, originated from the desert cat, a short-haired landrace native to the desert of the Arabian Peninsula. It lives there in the streets and has adapted very well to the extreme climate. The Arabian Mau is recognized as a formal breed by few fancier and breeder organization and cat registry, World Cat Federation (WCF) and Emirates Feline Federation (EFF). Based on one landrace, the Arabian Mau is a natural breed.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/d/d3/Bex_Arabian_Mau.jpg"
+ },
+ new Animal
+ {
+ Name = "Bengal",
+ Location = "Asia",
+ Details = "The Bengal cat is a domesticated cat breed created from hybrids of domestic cats and the Asian leopard cat – the breed name comes from the taxonomic name. Back-crossing to domestic cats is then done with the goal of creating a healthy, and docile cat with wild-looking, high-contrast coat. Bengals have a wild appearance and may show spots, rosettes, arrowhead markings, or marbling.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Paintedcats_Red_Star_standing.jpg/187px-Paintedcats_Red_Star_standing.jpg"
+ },
+ new Animal
+ {
+ Name = "Burmese",
+ Location = "Thailand",
+ Details = "The Burmese cat is a breed of domestic cat, originating in Thailand, believed to have its roots near the present Thai-Burma border and developed in the United States and Britain.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/04/Blissandlucky11.jpg"
+ },
+ new Animal
+ {
+ Name = "Cyprus",
+ Location = "Cyprus",
+ Details = "Cyprus cats, also known as Cypriot cats, Saint Helen cats, and Saint Nicholas cats, are a landrace of domestic cat found across the island of Cyprus. A standardized breed is being developed from them; among cat fancier and breeder organizations, it is presently fully recognized by the World Cat Federation (WCF), with breeding regulated by the World Cat Congress (WCC), under the name Aphrodite's Giant; and provisionally by The International Cat Association (TICA) as the Aphrodite. All three organizations permit shorthaired and semi-longhaired versions and no out-crossing to other breeds.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/CyprusShorthair.jpg/320px-CyprusShorthair.jpg"
+ },
+ new Animal
+ {
+ Name = "German Rex",
+ Location = "Germany",
+ Details = "The German Rex is a medium-sized breed with slender legs of a medium length. The head is round with well-developed cheeks and large, open ears. The eyes are of medium size in colours related to the coat colour. The coat is silky and short with a tendency to curl. The whiskers also curl, though less strongly than in the Cornish Rex. They may be nearly straight. All colours of coat, including white, are allowed. The body development is heavier than in the Cornish Rex - more like the European Shorthairs.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/c/c7/German_rex_harry_%28cropped%29.jpg"
+ },
+ new Animal
+ {
+ Name = "Highlander",
+ Location = "United States",
+ Details = "The Highlander (also known as the Highlander Shorthair, and originally as the Highland Lynx), is an experimental breed of cat. The unique appearance of the Highlander comes from the deliberate cross between the Desert Lynx and the Jungle Curl breeds, also recently developed. The latter of these has some non-domestic ancestry from two Asian small cat species, the leopard cat and jungle cat, making the Highlander nominally a feline hybrid, though its foundation stock is mostly domestic cat.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Highlander-7.jpg/293px-Highlander-7.jpg"
+ },
+ new Animal
+ {
+ Name = "Manx",
+ Location = "Isle of Man",
+ Details = "The Manx cat is a breed of domestic cat originating on the Isle of Man, with a naturally occurring mutation that shortens the tail. Many Manx have a small stub of a tail, but Manx cats are best known as being entirely tailless; this is the most distinguishing characteristic of the breed, along with elongated hind legs and a rounded head. Manx cats come in all coat colours and patterns, though all-white specimens are rare, and the coat range of the original stock was more limited. Long-haired variants are sometimes considered a separate breed, the Cymric. Manx are prized as skilled hunters, and thus have often been sought by farmers with rodent problems, and been a preferred ship's cat breed. They are said to be social, tame and active. An old local term for the cats on their home island is stubbin. Manx have been exhibited in cat shows since the 1800s, with the first known breed standard published in 1903.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/en/9/9b/Manx_cat_by_Karen_Weaver.jpg"
+ },
+ new Animal
+ {
+ Name = "Peterbald",
+ Location = "Russia",
+ Details = "The Peterbald is a cat breed of Russian origin. It was created in St Petersburg in 1994 from an experimental breeding by Olga S. Mironova. They resemble Oriental Shorthairs with a hair-losing gene. The breed was accepted for Championship class competition in 2009.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/c/c7/Peterbald_male_Shango_by_Irina_Polunina.jpg"
+ },
+ new Animal
+ {
+ Name = "Scottish Fold",
+ Location = "Scotland",
+ Details = "The Scottish Fold is a breed of domestic cat with a natural dominant-gene mutation that affects cartilage throughout the body, causing the ears to fold, bending forward and down towards the front of the head, which gives the cat what is often described as an owl-like appearance.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Adult_Scottish_Fold.jpg/240px-Adult_Scottish_Fold.jpg"
+ },
+ new Animal
+ {
+ Name = "Sphynx",
+ Location = "Europe",
+ Details = "The Sphynx cat is a breed of cat known for its lack of coat (fur). It was developed through selective breeding, starting in the 1960s. The skin should have the texture of chamois, as it has fine hairs, or they may be completely hairless. Whiskers may be present, either whole or broken, or may be totally absent. They also have a narrow, long head, and webbed feet. Their skin is the color that their fur would be, and all the usual cat markings (solid, point, van, tabby, tortie, etc.) may be found on the Sphynx cat's skin. Because they have no coat, they lose more body heat than coated cats. This makes them warm to the touch as well as heat-seeking.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Sphinx2_July_2006.jpg/180px-Sphinx2_July_2006.jpg"
+ }
+ }));
+
+ Animals.Add(new AnimalGroup("Dogs", new List
+ {
+ new Animal
+ {
+ Name = "Afghan Hound",
+ Location = "Afghanistan",
+ Details = "The Afghan Hound is a hound that is distinguished by its thick, fine, silky coat and its tail with a ring curl at the end. The breed is selectively bred for its unique features in the cold mountains of Afghanistan. Other names for this breed are Kuchi Hound, Tāzī, Balkh Hound, Baluchi Hound, Barakzai Hound, Shalgar Hound, Kabul Hound, Galanday Hound or sometimes incorrectly African Hound.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/69/Afghane.jpg"
+ },
+ new Animal
+ {
+ Name = "Alpine Dachsbracke",
+ Location = "Austria",
+ Details = "The Alpine Dachsbracke is a small breed of dog of the scent hound type originating in Austria. The Alpine Dachsbracke was bred to track wounded deer as well as boar, hare, and fox. It is highly efficient at following a trail even after it has gone cold. The Alpine Dachsbracke is very sturdy, and Austria is said to be the country of origin.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Alpejski_gończy_krótkonożny_g99.jpg/320px-Alpejski_gończy_krótkonożny_g99.jpg"
+ },
+ new Animal
+ {
+ Name = "American Bulldog",
+ Location = "United States",
+ Details = "The American Bulldog is a breed of utility dog descended from the Old English Bulldog.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/5/5e/American_Bulldog_600.jpg"
+ },
+ new Animal
+ {
+ Name = "Bearded Collie",
+ Location = "Scotland",
+ Details = "The Bearded Collie, or Beardie, is a herding breed of dog once used primarily by Scottish shepherds, but now mostly a popular family companion. Bearded Collies have an average weight of 18–27 kilograms (40–60 lb). Males are around 51–56 centimetres (20–22 in) tall at the withers while females are around 51–53 centimetres (20–21 in) tall.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/9c/Bearded_Collie_600.jpg"
+ },
+ new Animal
+ {
+ Name = "Boston Terrier",
+ Location = "United States",
+ Details = "The Boston Terrier is a breed of dog originating in the United States of America. This American Gentleman was accepted in 1893 by the American Kennel Club as a non-sporting breed. Color and markings are important when distinguishing this breed to the AKC standard. They should be either black, brindle or seal with white markings. Bostons are small and compact with a short tail and erect ears. The AKC says they are highly intelligent and very easily trained. They are friendly and can be stubborn at times. The average life span of a Boston is around 11 to 13 years, though some can live well into their teens.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Boston-terrier-carlos-de.JPG/320px-Boston-terrier-carlos-de.JPG"
+ },
+ new Animal
+ {
+ Name = "Canadian Eskimo",
+ Location = "Canada",
+ Details = "The Canadian Eskimo Dog is an Arctic breed of working dog, which is often considered to be one of North America's oldest and rarest remaining purebred indigenous domestic canines. Other names include qimmiq or qimmit. They were brought from Siberia to North America by the Thule people 1,000 years ago, along with the Greenland Dog that is genetically identical.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/7/79/Spoonsced.jpg"
+ },
+ new Animal
+ {
+ Name = "Eurohound",
+ Location = "Scandinavia",
+ Details = "A Eurohound (also known as a Eurodog or Scandinavian hound) is a type of dog bred for sled dog racing. The Eurohound is typically crossbred from the Alaskan husky group and any of a number of pointing breeds.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/98/Eurohound.jpg"
+ },
+ new Animal
+ {
+ Name = "Irish Terrier",
+ Location = "Ireland",
+ Details = "The Irish Terrier is a dog breed from Ireland, one of many breeds of terrier. The Irish Terrier is considered one of the oldest terrier breeds. The Dublin dog show in 1873 was the first to provide a separate class for Irish Terriers. By the 1880s, Irish Terriers were the fourth most popular breed in Ireland and Britain.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/IrishTerrierSydenhamHillWoods.jpg/180px-IrishTerrierSydenhamHillWoods.jpg"
+ },
+ new Animal
+ {
+ Name = "Kerry Beagle",
+ Location = "Ireland",
+ Details = "The Kerry Beagle is one of the oldest Irish hound breeds, believed to be descendant from the Old Southern Hound or the Celtic Hounds. It is the only extant scent hound breed native to Ireland.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/7/75/Kerry_Beagle_from_1915.JPG"
+ },
+ new Animal
+ {
+ Name = "Norwegian Buhund",
+ Location = "Norway",
+ Details = "The Norwegian Buhund is a breed of dog of the spitz type. It is closely related to the Icelandic Sheepdog and the Jämthund. The Buhund is used as an all purpose farm and herding dog, as well as watch dog and a nanny dog.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/3/3b/Norwegian_Buhund_600.jpg"
+ },
+ new Animal
+ {
+ Name = "Patterdale Terrier",
+ Location = "England",
+ Details = "The Patterdale Terrier is a breed of dog descended from the Northern terrier breeds of the early 20th century. The origins of the breed can be traced back to the Lake District, specifically to Ullswater Hunt master Joe Bowman, an early Border Terrier breeder.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/05078045_Patterdale_Terrier.jpg/320px-05078045_Patterdale_Terrier.jpg"
+ },
+ new Animal
+ {
+ Name = "St. Bernard",
+ Location = "Italy, Switzerland",
+ Details = "The St. Bernard or St Bernard is a breed of very large working dog from the western Alps in Italy and Switzerland. They were originally bred for rescue by the hospice of the Great St Bernard Pass on the Italian-Swiss border. The hospice, built by and named after Italian monk Bernard of Menthon, acquired its first dogs between 1660 and 1670. The breed has become famous through tales of alpine rescues, as well as for its enormous size.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Hummel_Vedor_vd_Robandahoeve.jpg/320px-Hummel_Vedor_vd_Robandahoeve.jpg"
+ }
+ }));
+
+ Animals.Add(new AnimalGroup("Elephants", new List
+ {
+ new Animal
+ {
+ Name = "African Bush Elephant",
+ Location = "Africa",
+ Details = "The African bush elephant, also known as the African savanna elephant, is the larger of the two species of African elephants, and the largest living terrestrial animal. These elephants were previously regarded as the same species, but the African forest elephant has been reclassified as L. cyclotis.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/African_Elephant_%28Loxodonta_africana%29_bull_%2831100819046%29.jpg/320px-African_Elephant_%28Loxodonta_africana%29_bull_%2831100819046%29.jpg"
+ },
+ new Animal
+ {
+ Name = "African Forest Elephant",
+ Location = "Africa",
+ Details = "The African forest elephant is a forest-dwelling species of elephant found in the Congo Basin. It is the smallest of the three extant species of elephant, but still one of the largest living terrestrial animals. The African forest elephant and the African bush elephan were considered to be one species until genetic studies indicated that they separated an estimated 2–7 million years ago. From an estimated population size of over 2 million prior to the colonization of Africa, the population in 2015 is estimated to be about 100,000 forest elephants, mostly living in the forests of Gabon. Due to a slower birth rate, the forest elephant takes longer to recover from poaching, which caused its population to fall by 65% from 2002 to 2014.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/6/6a/African_Forest_Elephant.jpg"
+ },
+ new Animal
+ {
+ Name = "Desert Elephant",
+ Location = "Africa",
+ Details = "Desert elephants, or desert-adapted elephants are not a distinct species of elephant but are African bush elephants that have made their homes in the Namib and Sahara deserts in Africa. It was believed at one time that they were a subspecies of the African bush elephant but this is no longer thought to be the case. Desert-dwelling elephants were once more widespread in Africa than they are now and are currently found only in Namibia and Mali. They tend to migrate from one waterhole to another following traditional routes which depend on the seasonal availability of food and water. They face pressure from poaching and from changes in land use by humans.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Desert_elephants_in_the_Huab_River.jpg/320px-Desert_elephants_in_the_Huab_River.jpg"
+ },
+ new Animal
+ {
+ Name = "Borneo Elephant",
+ Location = "Asia",
+ Details = "The Borneo elephant, also called the Borneo pygmy elephant, is a subspecies of Asian elephant that inhabits northeastern Borneo, in Indonesia and Malaysia. Its origin remains the subject of debate. A definitive subspecific classification as Elephas maximus borneensis awaits a detailed range-wide morphometric and genetic study. Since 1986, Elephas maximus has been listed as Endangered on the IUCN Red List as the population has declined by at least 50% over the last three generations, estimated to be 60–75 years. The species is pre-eminently threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Elephant_%40_kabini.jpg/180px-Elephant_%40_kabini.jpg"
+ },
+ new Animal
+ {
+ Name = "Indian Elephant",
+ Location = "Asia",
+ Details = "The Indian elephant is one of three extant recognized subspecies of the Asian elephant and native to mainland Asia. Since 1986, the Asian elephant has been listed as Endangered on the IUCN Red List as the wild population has declined by at least 50% since the 1930s to 1940s, i.e. three elephant generations. The Asian elephant is threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Elephas_maximus_%28Bandipur%29.jpg/320px-Elephas_maximus_%28Bandipur%29.jpg"
+ },
+ new Animal
+ {
+ Name = "Sri Lankan Elephant",
+ Location = "Asia",
+ Details = "The Sri Lankan elephant is one of three recognized subspecies of the Asian elephant, and native to Sri Lanka. Since 1986, Elephas maximus has been listed as endangered by IUCN as the population has declined by at least 50% over the last three generations, estimated to be 60–75 years. The species is primarily threatened by habitat loss, degradation and fragmentation.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Srilankan_tuskelephant.jpg/213px-Srilankan_tuskelephant.jpg"
+ },
+ new Animal
+ {
+ Name = "Sumatran Elephant",
+ Location = "Asia",
+ Details = "The Sumatran elephant is one of three recognized subspecies of the Asian elephant, and native to the Indonesia island of Sumatra. In 2011, the Sumatran elephant has been classified as critically endangered by IUCN as the population has declined by at least 80% over the last three generations, estimated to be about 75 years. The subspecies is pre-eminently threatened by habitat loss, degradation and fragmentation, and poaching; over 69% of potential elephant habitat has been lost within the last 25 years. Much of the remaining forest cover is in blocks smaller than 250 km2 (97 sq mi), which are too small to contain viable elephant populations.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Borobudur-Temple-Park_Elephant-cage-01.jpg/320px-Borobudur-Temple-Park_Elephant-cage-01.jpg"
+ },
+ new Animal
+ {
+ Name = "Pygmy Elephant",
+ Location = "Africa & Asia",
+ Details = "Pygmy elephants live in both Africa and Asia.The African pygmy elephant is currently considered to be a tiny morph of the African forest elephant. The Borneo elephant, a well-documented variety of elephant, is also calledmpygmy elephant. This elephant, inhabiting tropical rainforest in north Borneo (east Sabah and extreme north Kalimantan), was long thought to be identical to the Asian elephant and descended from a captive population. In 2003, DNA comparison revealed them to be probably a new subspecies.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/9/93/Borneo-elephant-PLoS_Biology.jpg"
+ },
+ new Animal
+ {
+ Name = "Mammoth",
+ Location = "Extinct",
+ Details = "A mammoth is any species of the extinct genus Mammuthus, one of the many genera that make up the order of trunked mammals called proboscideans. The various species of mammoth were commonly equipped with long, curved tusks and, in northern species, a covering of long hair. They lived from the Pliocene epoch (from around 5 million years ago) into the Holocene at about 4,000 years ago, and various species existed in Africa, Europe, Asia, and North America. They were members of the family Elephantidae, which also contains the two genera of modern elephants and their ancestors.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Columbian_mammoth.JPG/320px-Columbian_mammoth.JPG"
+ },
+ new Animal
+ {
+ Name = "Mastodon",
+ Location = "Extinct",
+ Details = "Mastodons are any species of extinct proboscideans in the genus Mammut, distantly related to elephants, that inhabited North and Central America during the late Miocene or late Pliocene up to their extinction at the end of the Pleistocene 10,000 to 11,000 years ago. Mastodons lived in herds and were predominantly forest-dwelling animals that fed on a mixed diet obtained by browsing and grazing with a seasonal preference for browsing, similar to living elephants.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Mammut_americanum.jpg/320px-Mammut_americanum.jpg"
+ },
+ new Animal
+ {
+ Name = "Dwarf Elephant",
+ Location = "Extinct",
+ Details = "Dwarf elephants are prehistoric members of the order Proboscidea which, through the process of allopatric speciation on islands, evolved much smaller body sizes (around 1.5-2.3 metres) in comparison with their immediate ancestors. Dwarf elephants are an example of insular dwarfism, the phenomenon whereby large terrestrial vertebrates (usually mammals) that colonize islands evolve dwarf forms, a phenomenon attributed to adaptation to resource-poor environments and selection for early maturation and reproduction. Some modern populations of Asian elephants have also undergone size reduction on islands to a lesser degree, resulting in populations of pygmy elephants.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/69/Elephas_skeleton.JPG/320px-Elephas_skeleton.JPG"
+ },
+ new Animal
+ {
+ Name = "Pygmy Mammoth",
+ Location = "Extinct",
+ Details = "The pygmy mammoth or Channel Islands mammoth is an extinct species of dwarf elephant descended from the Columbian mammoth of mainland North America. This species became extinct during the Quaternary extinction event in which many megafauna species became extinct due to changing conditions to which the species could not adapt. A case of island or insular dwarfism, from a recent analysis in 2010 it was determined that M. exilis was on average, 1.72 m (5.6 ft) tall at the shoulders and 760 kg (1,680 lb) in weight, in stark contrast to its 4.3 m (14 ft) tall, 9,070 kg (20,000 lb) ancestor. Another estimate gives a shoulder height of 2.02 m (6.6 ft) and a weight of 1,350 kg (2,980 lb).",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/f/f6/Mammuthus_exilis.jpg"
+ }
+ }));
+
+ if (includeEmptyGroups)
+ Animals.Add(new AnimalGroup("Horses", new List()));
+
+ Animals.Add(new AnimalGroup("Monkeys", new List
+ {
+ new Animal
+ {
+ Name = "Baboon",
+ Location = "Africa & Asia",
+ Details = "Baboons are African and Arabian Old World monkeys belonging to the genus Papio, part of the subfamily Cercopithecinae.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg"
+ },
+ new Animal
+ {
+ Name = "Capuchin Monkey",
+ Location = "Central & South America",
+ Details = "The capuchin monkeys are New World monkeys of the subfamily Cebinae. Prior to 2011, the subfamily contained only a single genus, Cebus.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg"
+ },
+ new Animal
+ {
+ Name = "Blue Monkey",
+ Location = "Central and East Africa",
+ Details = "The blue monkey or diademed monkey is a species of Old World monkey native to Central and East Africa, ranging from the upper Congo River basin east to the East African Rift and south to northern Angola and Zambia",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg"
+ },
+ new Animal
+ {
+ Name = "Squirrel Monkey",
+ Location = "Central & South America",
+ Details = "The squirrel monkeys are the New World monkeys of the genus Saimiri. They are the only genus in the subfamily Saimirinae. The name of the genus Saimiri is of Tupi origin, and was also used as an English name by early researchers.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Saimiri_sciureus-1_Luc_Viatour.jpg/220px-Saimiri_sciureus-1_Luc_Viatour.jpg"
+ },
+ new Animal
+ {
+ Name = "Golden Lion Tamarin",
+ Location = "Brazil",
+ Details = "The golden lion tamarin also known as the golden marmoset, is a small New World monkey of the family Callitrichidae.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Golden_lion_tamarin_portrait3.jpg/220px-Golden_lion_tamarin_portrait3.jpg"
+ },
+ new Animal
+ {
+ Name = "Howler Monkey",
+ Location = "South America",
+ Details = "Howler monkeys are among the largest of the New World monkeys. Fifteen species are currently recognised. Previously classified in the family Cebidae, they are now placed in the family Atelidae.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Alouatta_guariba.jpg/200px-Alouatta_guariba.jpg"
+ },
+ new Animal
+ {
+ Name = "Japanese Macaque",
+ Location = "Japan",
+ Details = "The Japanese macaque, is a terrestrial Old World monkey species native to Japan. They are also sometimes known as the snow monkey because they live in areas where snow covers the ground for months each",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Macaca_fuscata_fuscata1.jpg/220px-Macaca_fuscata_fuscata1.jpg"
+ },
+ new Animal
+ {
+ Name = "Mandrill",
+ Location = "Southern Cameroon, Gabon, Equatorial Guinea, and Congo",
+ Details = "The mandrill is a primate of the Old World monkey family, closely related to the baboons and even more closely to the drill. It is found in southern Cameroon, Gabon, Equatorial Guinea, and Congo.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Mandrill_at_san_francisco_zoo.jpg/220px-Mandrill_at_san_francisco_zoo.jpg"
+ },
+ new Animal
+ {
+ Name = "Proboscis Monkey",
+ Location = "Borneo",
+ Details = "The proboscis monkey or long-nosed monkey, known as the bekantan in Malay, is a reddish-brown arboreal Old World monkey that is endemic to the south-east Asian island of Borneo.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Proboscis_Monkey_in_Borneo.jpg/250px-Proboscis_Monkey_in_Borneo.jpg"
+ },
+ new Animal
+ {
+ Name = "Red-shanked Douc",
+ Location = "Vietnam, Laos",
+ Details = "The red-shanked douc is a species of Old World monkey, among the most colourful of all primates. This monkey is sometimes called the \"costumed ape\" for its extravagant appearance. From its knees to its ankles it sports maroon-red \"stockings\", and it appears to wear white forearm length gloves. Its attire is finished with black hands and feet. The golden face is framed by a white ruff, which is considerably fluffier in males. The eyelids are a soft powder blue. The tail is white with a triangle of white hair at the base. Males of all ages have a white spot on both sides of the corners of the rump patch, and red and white genitals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Portrait_of_a_Douc.jpg/159px-Portrait_of_a_Douc.jpg"
+ },
+ new Animal
+ {
+ Name = "Gray-shanked Douc",
+ Location = "Vietnam",
+ Details = "The gray-shanked douc langur is a douc species native to the Vietnamese provinces of Quảng Nam, Quảng Ngãi, Bình Định, Kon Tum, and Gia Lai. The total population is estimated at 550 to 700 individuals. In 2016, Dr Benjamin Rawson, Country Director of Fauna & Flora International - Vietnam Programme, announced a discovery of an additional population of more than 500 individuals found in Central Vietnam, bringing the total population up to approximately 1000 individuals.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Cuc.Phuong.Primate.Rehab.center.jpg/320px-Cuc.Phuong.Primate.Rehab.center.jpg"
+ },
+ new Animal
+ {
+ Name = "Golden Snub-nosed Monkey",
+ Location = "China",
+ Details = "The golden snub-nosed monkey is an Old World monkey in the Colobinae subfamily. It is endemic to a small area in temperate, mountainous forests of central and Southwest China. They inhabit these mountainous forests of Southwestern China at elevations of 1,500-3,400 m above sea level. The Chinese name is Sichuan golden hair monkey. It is also widely referred to as the Sichuan snub-nosed monkey. Of the three species of snub-nosed monkeys in China, the golden snub-nosed monkey is the most widely distributed throughout China.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Golden_Snub-nosed_Monkeys%2C_Qinling_Mountains_-_China.jpg/165px-Golden_Snub-nosed_Monkeys%2C_Qinling_Mountains_-_China.jpg"
+ },
+ new Animal
+ {
+ Name = "Black Snub-nosed Monkey",
+ Location = "China",
+ Details = "The black snub-nosed monkey, also known as the Yunnan snub-nosed monkey, is an endangered species of primate in the family Cercopithecidae. It is endemic to China, where it is known to the locals as the Yunnan golden hair monkey and the black golden hair monkey. It is threatened by habitat loss. It was named after Bishop Félix Biet.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/RhinopitecusBieti.jpg/320px-RhinopitecusBieti.jpg"
+ },
+ new Animal
+ {
+ Name = "Tonkin Snub-nosed Monkey",
+ Location = "Vietnam",
+ Details = "The Tonkin snub-nosed monkey or Dollman's snub-nosed monkey is a slender-bodied arboreal Old World monkey, endemic to northern Vietnam. It is a black and white monkey with a pink nose and lips and blue patches round the eyes. It is found at altitudes of 200 to 1,200 m (700 to 3,900 ft) on fragmentary patches of forest on craggy limestone areas. First described in 1912, the monkey was rediscovered in 1990 but is exceedingly rare. In 2008, fewer than 250 individuals were thought to exist, and the species was the subject of intense conservation effort. The main threats faced by these monkeys is habitat loss and hunting, and the International Union for Conservation of Nature has rated the species as \"critically endangered\".",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Tonkin_snub-nosed_monkeys_%28Rhinopithecus_avunculus%29.jpg/320px-Tonkin_snub-nosed_monkeys_%28Rhinopithecus_avunculus%29.jpg"
+ },
+ new Animal
+ {
+ Name = "Thomas's Langur",
+ Location = "Indonesia",
+ Details = "Thomas's langur is a species of primate in the family Cercopithecidae. It is endemic to North Sumatra, Indonesia. Its natural habitat is subtropical or tropical dry forests. It is threatened by habitat loss. Its native names are reungkah in Acehnese and kedih in Alas.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Thomas%27s_langur_Presbytis_thomasi.jpg/142px-Thomas%27s_langur_Presbytis_thomasi.jpg"
+ },
+ new Animal
+ {
+ Name = "Purple-faced Langur",
+ Location = "Sri Lanka",
+ Details = "The purple-faced langur, also known as the purple-faced leaf monkey, is a species of Old World monkey that is endemic to Sri Lanka. The animal is a long-tailed arboreal species, identified by a mostly brown appearance, dark face (with paler lower face) and a very shy nature. The species was once highly prevalent, found in suburban Colombo and the \"wet zone\" villages (areas with high temperatures and high humidity throughout the year, whilst rain deluges occur during the monsoon seasons), but rapid urbanization has led to a significant decrease in the population level of the monkeys.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Semnopithèque_blanchâtre_mâle.JPG/192px-Semnopithèque_blanchâtre_mâle.JPG"
+ },
+ new Animal
+ {
+ Name = "Gelada",
+ Location = "Ethiopia",
+ Details = "The gelada, sometimes called the bleeding-heart monkey or the gelada baboon, is a species of Old World monkey found only in the Ethiopian Highlands, with large populations in the Semien Mountains. Theropithecus is derived from the Greek root words for \"beast-ape.\" Like its close relatives the baboons, it is largely terrestrial, spending much of its time foraging in grasslands.",
+ ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Gelada-Pavian.jpg/320px-Gelada-Pavian.jpg"
+ }
+ }));
+ }
+ }
+}
diff --git a/src/Controls/tests/ManualTests/ViewModels/MonkeysViewModel.cs b/src/Controls/tests/ManualTests/ViewModels/MonkeysViewModel.cs
new file mode 100644
index 000000000000..2f40bd66d51e
--- /dev/null
+++ b/src/Controls/tests/ManualTests/ViewModels/MonkeysViewModel.cs
@@ -0,0 +1,259 @@
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Windows.Input;
+using Microsoft.Maui.ManualTests.Models;
+
+namespace Microsoft.Maui.ManualTests.ViewModels;
+
+public class MonkeysViewModel : INotifyPropertyChanged
+{
+ readonly IList source;
+ Monkey selectedMonkey;
+ int selectionCount = 1;
+
+ public ObservableCollection Monkeys { get; set; }
+ public IList EmptyMonkeys { get; set; }
+
+ public Monkey SelectedMonkey
+ {
+ get
+ {
+ return selectedMonkey;
+ }
+ set
+ {
+ if (selectedMonkey != value)
+ {
+ selectedMonkey = value;
+ }
+ }
+ }
+
+ ObservableCollection