Format and typos
This commit is contained in:
296
GoveeCSharpConnector/.editorconfig
Normal file
296
GoveeCSharpConnector/.editorconfig
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
[*.md]
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 2
|
||||||
|
[*.csproj]
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 2
|
||||||
|
[*.cs]
|
||||||
|
csharp_indent_block_contents = true
|
||||||
|
csharp_indent_braces = false
|
||||||
|
csharp_indent_case_contents = true
|
||||||
|
csharp_indent_case_contents_when_block = true
|
||||||
|
csharp_indent_labels = one_less_than_current
|
||||||
|
csharp_indent_switch_labels = true
|
||||||
|
csharp_new_line_before_catch = false
|
||||||
|
csharp_new_line_before_else = false
|
||||||
|
csharp_new_line_before_finally = false
|
||||||
|
csharp_new_line_before_members_in_anonymous_types = true
|
||||||
|
csharp_new_line_before_members_in_object_initializers = true
|
||||||
|
csharp_new_line_before_open_brace = none
|
||||||
|
csharp_new_line_between_query_expression_clauses = true
|
||||||
|
csharp_prefer_braces = false
|
||||||
|
csharp_prefer_qualified_reference = true:error
|
||||||
|
csharp_prefer_simple_default_expression = true:warning
|
||||||
|
csharp_prefer_simple_using_statement = true:warning
|
||||||
|
csharp_prefer_static_local_function = true:warning
|
||||||
|
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
|
||||||
|
csharp_preserve_single_line_blocks = true
|
||||||
|
csharp_preserve_single_line_statements = false
|
||||||
|
csharp_space_after_cast = false
|
||||||
|
csharp_space_after_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_after_comma = true
|
||||||
|
csharp_space_after_dot = false
|
||||||
|
csharp_space_after_keywords_in_control_flow_statements = true
|
||||||
|
csharp_space_after_semicolon_in_for_statement = true
|
||||||
|
csharp_space_around_binary_operators = before_and_after
|
||||||
|
csharp_space_around_declaration_statements = false
|
||||||
|
csharp_space_before_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_before_comma = false
|
||||||
|
csharp_space_before_dot = false
|
||||||
|
csharp_space_before_open_square_brackets = false
|
||||||
|
csharp_space_before_semicolon_in_for_statement = false
|
||||||
|
csharp_space_between_empty_square_brackets = false
|
||||||
|
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||||
|
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||||
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_parentheses = false
|
||||||
|
csharp_space_between_square_brackets = false
|
||||||
|
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
|
||||||
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
|
||||||
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true
|
||||||
|
csharp_style_conditional_delegate_call = true
|
||||||
|
csharp_style_deconstructed_variable_declaration = false
|
||||||
|
csharp_style_expression_bodied_accessors = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_constructors = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_indexers = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_lambdas = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_local_functions = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_methods = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_operators = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_properties = when_on_single_line:warning
|
||||||
|
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
|
||||||
|
csharp_style_inlined_variable_declaration = false
|
||||||
|
csharp_style_namespace_declarations = file_scoped:warning
|
||||||
|
csharp_style_pattern_local_over_anonymous_function = true:warning
|
||||||
|
csharp_style_pattern_matching_over_as_with_null_check = true:warning
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
|
||||||
|
csharp_style_prefer_index_operator = true:warning
|
||||||
|
csharp_style_prefer_not_pattern = true:warning
|
||||||
|
csharp_style_prefer_null_check_over_type_check = true
|
||||||
|
csharp_style_prefer_pattern_matching = true:warning
|
||||||
|
csharp_style_prefer_range_operator = true:warning
|
||||||
|
csharp_style_prefer_switch_expression = true:warning
|
||||||
|
csharp_style_throw_expression = true
|
||||||
|
csharp_style_unused_value_assignment_preference = discard_variable:warning
|
||||||
|
csharp_style_unused_value_expression_statement_preference = discard_variable:warning
|
||||||
|
csharp_style_var_elsewhere = false:warning
|
||||||
|
csharp_style_var_for_built_in_types = false:warning
|
||||||
|
csharp_style_var_when_type_is_apparent = false:warning
|
||||||
|
csharp_using_directive_placement = outside_namespace
|
||||||
|
dotnet_analyzer_diagnostic.category-Design.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Documentation.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Globalization.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Interoperability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Maintainability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Naming.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Performance.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Reliability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Security.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-SingleFile.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Style.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Usage.severity = error
|
||||||
|
dotnet_code_quality_unused_parameters = all
|
||||||
|
dotnet_code_quality_unused_parameters = non_public
|
||||||
|
dotnet_code_quality.CAXXXX.api_surface = private, internal
|
||||||
|
dotnet_diagnostic.CA1001.severity = error # CA1001: Types that own disposable fields should be disposable
|
||||||
|
dotnet_diagnostic.CA1051.severity = error # CA1051: Do not declare visible instance fields
|
||||||
|
dotnet_diagnostic.CA1511.severity = warning # CA1511: Use 'ArgumentException.ThrowIfNullOrEmpty' instead of explicitly throwing a new exception instance
|
||||||
|
dotnet_diagnostic.CA1513.severity = warning # Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
|
||||||
|
dotnet_diagnostic.CA1825.severity = warning # CA1825: Avoid zero-length array allocations
|
||||||
|
dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available
|
||||||
|
dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
|
||||||
|
dotnet_diagnostic.CA1860.severity = error # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
|
||||||
|
dotnet_diagnostic.CA1862.severity = warning # CA1862: Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'
|
||||||
|
dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead.
|
||||||
|
dotnet_diagnostic.CA2201.severity = none # CA2201: Exception type System.NullReferenceException is reserved by the runtime
|
||||||
|
dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
|
||||||
|
dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name
|
||||||
|
dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2");
|
||||||
|
dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant.
|
||||||
|
dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary
|
||||||
|
dotnet_diagnostic.IDE0010.severity = none # Add missing cases to switch statement (IDE0010)
|
||||||
|
dotnet_diagnostic.IDE0028.severity = error # IDE0028: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
|
||||||
|
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
|
||||||
|
dotnet_diagnostic.IDE0048.severity = none # Parentheses preferences (IDE0047 and IDE0048)
|
||||||
|
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
|
||||||
|
dotnet_diagnostic.IDE0051.severity = error # Private member '' is unused [, ]
|
||||||
|
dotnet_diagnostic.IDE0058.severity = warning # IDE0058: Expression value is never used
|
||||||
|
dotnet_diagnostic.IDE0060.severity = error # IDE0060: Remove unused parameter
|
||||||
|
dotnet_diagnostic.IDE0074.severity = warning # IDE0074: Use compound assignment
|
||||||
|
dotnet_diagnostic.IDE0130.severity = none # Namespace does not match folder structure (IDE0130)
|
||||||
|
dotnet_diagnostic.IDE0270.severity = warning # IDE0270: Null check can be simplified
|
||||||
|
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
|
||||||
|
dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0301.severity = error #IDE0301: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0305.severity = none # IDE0305: Collection initialization can be simplified
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.symbols = class
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.symbols = event
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.symbols = method
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.symbols = property
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||||
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||||
|
dotnet_naming_style.begins_with_i.required_suffix =
|
||||||
|
dotnet_naming_style.begins_with_i.word_separator =
|
||||||
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.pascal_case.required_prefix =
|
||||||
|
dotnet_naming_style.pascal_case.required_suffix =
|
||||||
|
dotnet_naming_style.pascal_case.word_separator =
|
||||||
|
dotnet_naming_style.private_of_internal_field.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.private_of_internal_field.required_prefix = _
|
||||||
|
dotnet_naming_style.private_of_internal_field.required_suffix =
|
||||||
|
dotnet_naming_style.private_of_internal_field.word_separator =
|
||||||
|
dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.abstract_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.abstract_method.required_modifiers = abstract
|
||||||
|
dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.class.applicable_kinds = class
|
||||||
|
dotnet_naming_symbols.class.required_modifiers =
|
||||||
|
dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.delegate.applicable_kinds = delegate
|
||||||
|
dotnet_naming_symbols.delegate.required_modifiers =
|
||||||
|
dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.enum.applicable_kinds = enum
|
||||||
|
dotnet_naming_symbols.enum.required_modifiers =
|
||||||
|
dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.event.applicable_kinds = event
|
||||||
|
dotnet_naming_symbols.event.required_modifiers =
|
||||||
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||||
|
dotnet_naming_symbols.interface.required_modifiers =
|
||||||
|
dotnet_naming_symbols.method.applicable_accessibilities = public
|
||||||
|
dotnet_naming_symbols.method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.method.required_modifiers =
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||||
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_method.applicable_accessibilities = private
|
||||||
|
dotnet_naming_symbols.private_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.private_method.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.property.applicable_kinds = property
|
||||||
|
dotnet_naming_symbols.property.required_modifiers =
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.required_modifiers =
|
||||||
|
dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.static_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.static_field.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.static_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.static_method.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.struct.applicable_kinds = struct
|
||||||
|
dotnet_naming_symbols.struct.required_modifiers =
|
||||||
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||||
|
dotnet_naming_symbols.types.required_modifiers =
|
||||||
|
dotnet_remove_unnecessary_suppression_exclusions = 0
|
||||||
|
dotnet_separate_import_directive_groups = false
|
||||||
|
dotnet_sort_system_directives_first = false
|
||||||
|
dotnet_style_allow_multiple_blank_lines_experimental = false:warning
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = true
|
||||||
|
dotnet_style_coalesce_expression = true
|
||||||
|
dotnet_style_collection_initializer = true:warning
|
||||||
|
dotnet_style_explicit_tuple_names = true:warning
|
||||||
|
dotnet_style_namespace_match_folder = true
|
||||||
|
dotnet_style_null_propagation = true:warning
|
||||||
|
dotnet_style_object_initializer = true:warning
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||||
|
dotnet_style_predefined_type_for_member_access = true:warning
|
||||||
|
dotnet_style_prefer_auto_properties = true:warning
|
||||||
|
dotnet_style_prefer_compound_assignment = true:warning
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = false
|
||||||
|
dotnet_style_prefer_conditional_expression_over_return = false
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true:warning
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
|
||||||
|
dotnet_style_prefer_simplified_boolean_expressions = true:warning
|
||||||
|
dotnet_style_prefer_simplified_interpolation = true
|
||||||
|
dotnet_style_qualification_for_event = false:error
|
||||||
|
dotnet_style_qualification_for_field = false
|
||||||
|
dotnet_style_qualification_for_method = false:error
|
||||||
|
dotnet_style_qualification_for_property = false:error
|
||||||
|
dotnet_style_readonly_field = true:warning
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 4
|
||||||
|
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822
|
||||||
|
# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig
|
||||||
|
# https://github.com/dotnet/project-system/blob/main/.editorconfig
|
||||||
1
GoveeCSharpConnector/.vscode/format-report.json
vendored
Normal file
1
GoveeCSharpConnector/.vscode/format-report.json
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
24
GoveeCSharpConnector/.vscode/launch.json
vendored
Normal file
24
GoveeCSharpConnector/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": ".NET Core Launch (console)",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "launch",
|
||||||
|
"preLaunchTask": "build",
|
||||||
|
"program": "${workspaceFolder}/GoveeCsharpConnector.Example/bin/Debug/net8.0/GoveeCsharpConnector.Example.dll",
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}/GoveeCsharpConnector.Example",
|
||||||
|
"console": "internalConsole",
|
||||||
|
"stopAtEntry": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": ".NET Core Attach",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "attach"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
5
GoveeCSharpConnector/.vscode/settings.json
vendored
Normal file
5
GoveeCSharpConnector/.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"cSpell.words": [
|
||||||
|
"Govee"
|
||||||
|
]
|
||||||
|
}
|
||||||
62
GoveeCSharpConnector/.vscode/tasks.json
vendored
Normal file
62
GoveeCSharpConnector/.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"args": [
|
||||||
|
"format",
|
||||||
|
"--report",
|
||||||
|
".vscode",
|
||||||
|
"--verbosity",
|
||||||
|
"detailed",
|
||||||
|
"--severity",
|
||||||
|
"warn"
|
||||||
|
],
|
||||||
|
"command": "dotnet",
|
||||||
|
"label": "Format",
|
||||||
|
"problemMatcher": "$msCompile",
|
||||||
|
"type": "process"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"args": [
|
||||||
|
"format",
|
||||||
|
"whitespace"
|
||||||
|
],
|
||||||
|
"command": "dotnet",
|
||||||
|
"label": "Format Whitespaces",
|
||||||
|
"problemMatcher": "$msCompile",
|
||||||
|
"type": "process"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "publish",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"publish",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "watch",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"watch",
|
||||||
|
"run"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,7 +1,6 @@
|
|||||||
namespace GoveeCSharpConnector.Enums;
|
namespace GoveeCSharpConnector.Enums;
|
||||||
|
|
||||||
public enum PowerState
|
public enum PowerState {
|
||||||
{
|
|
||||||
Off = 0,
|
Off = 0,
|
||||||
On = 1
|
On = 1
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
@ -15,9 +15,9 @@
|
|||||||
<Version>1.1.2</Version>
|
<Version>1.1.2</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Net.Http.Json" Version="8.0.0" />
|
<PackageReference Include="System.Net.Http.Json" Version="9.0.8" />
|
||||||
<PackageReference Include="System.Reactive" Version="6.0.0" />
|
<PackageReference Include="System.Reactive" Version="6.0.1" />
|
||||||
<PackageReference Include="System.Text.Json" Version="8.0.1" />
|
<PackageReference Include="System.Text.Json" Version="9.0.8" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Properties\" />
|
<Folder Include="Properties\" />
|
||||||
|
|||||||
@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Interfaces;
|
namespace GoveeCSharpConnector.Interfaces;
|
||||||
|
|
||||||
public interface IGoveeApiService
|
public interface IGoveeApiService {
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the required Api Key for the Govee Api.
|
/// Sets the required Api Key for the Govee Api.
|
||||||
/// Request Api Key in the Mobile Phone App.
|
/// Request Api Key in the Mobile Phone App.
|
||||||
|
|||||||
@ -2,8 +2,7 @@ using GoveeCSharpConnector.Objects;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Interfaces;
|
namespace GoveeCSharpConnector.Interfaces;
|
||||||
|
|
||||||
public interface IGoveeService
|
public interface IGoveeService {
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Govee Api Key
|
/// Govee Api Key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -1,14 +1,8 @@
|
|||||||
using System.Data;
|
using GoveeCSharpConnector.Objects;
|
||||||
using System.Net;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
|
||||||
using GoveeCSharpConnector.Objects;
|
|
||||||
|
|
||||||
namespace GoveeCSharpConnector.Interfaces;
|
namespace GoveeCSharpConnector.Interfaces;
|
||||||
|
|
||||||
public interface IGoveeUdpService
|
public interface IGoveeUdpService {
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sends a Scan Command via Udp Multicast.
|
/// Sends a Scan Command via Udp Multicast.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -32,7 +26,7 @@ public interface IGoveeUdpService
|
|||||||
/// <param name="on"></param>
|
/// <param name="on"></param>
|
||||||
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task ToggleDevice(string deviceAddress, bool on, int uniCastPort = 4003);
|
void ToggleDevice(string deviceAddress, bool on, int uniCastPort = 4003);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the Brightness of the Device
|
/// Sets the Brightness of the Device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -40,7 +34,7 @@ public interface IGoveeUdpService
|
|||||||
/// <param name="brightness">In Percent 1-100</param>
|
/// <param name="brightness">In Percent 1-100</param>
|
||||||
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task SetBrightness(string deviceAddress, int brightness, int uniCastPort = 4003);
|
void SetBrightness(string deviceAddress, int brightness, int uniCastPort = 4003);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the Color of the Device
|
/// Sets the Color of the Device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -48,7 +42,7 @@ public interface IGoveeUdpService
|
|||||||
/// <param name="color"></param>
|
/// <param name="color"></param>
|
||||||
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task SetColor(string deviceAddress, RgbColor color, int uniCastPort = 4003);
|
void SetColor(string deviceAddress, RgbColor color, int uniCastPort = 4003);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the ColorTemp of the Device
|
/// Sets the ColorTemp of the Device
|
||||||
@ -57,7 +51,7 @@ public interface IGoveeUdpService
|
|||||||
/// <param name="colorTempInKelvin"></param>
|
/// <param name="colorTempInKelvin"></param>
|
||||||
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task SetColorTemp(string deviceAddress, int colorTempInKelvin, int uniCastPort = 4003);
|
void SetColorTemp(string deviceAddress, int colorTempInKelvin, int uniCastPort = 4003);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Starts the Udp Listener
|
/// Starts the Udp Listener
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class ApiResponse
|
public class ApiResponse {
|
||||||
{
|
public string Message { get; set; }
|
||||||
public string? Message { get; set; }
|
|
||||||
public int Code { get; set; }
|
public int Code { get; set; }
|
||||||
}
|
}
|
||||||
@ -1,8 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class Data
|
public class Data {
|
||||||
{
|
|
||||||
public List<GoveeApiDevice> Devices { get; set; }
|
public List<GoveeApiDevice> Devices { get; set; }
|
||||||
}
|
}
|
||||||
@ -1,14 +1,12 @@
|
|||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeApiCommand
|
public class GoveeApiCommand {
|
||||||
{
|
|
||||||
public string Device { get; set; }
|
public string Device { get; set; }
|
||||||
public string Model { get; set; }
|
public string Model { get; set; }
|
||||||
public Command Cmd { get; set; }
|
public Command Cmd { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Command
|
public class Command {
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public object Value { get; set; }
|
public object Value { get; set; }
|
||||||
}
|
}
|
||||||
@ -1,10 +1,8 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeApiDevice
|
public class GoveeApiDevice {
|
||||||
{
|
|
||||||
[JsonPropertyName("device")]
|
[JsonPropertyName("device")]
|
||||||
public string DeviceId { get; set; }
|
public string DeviceId { get; set; }
|
||||||
public string Model { get; set; }
|
public string Model { get; set; }
|
||||||
|
|||||||
@ -2,8 +2,7 @@ using System.Text.Json.Serialization;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeApiState
|
public class GoveeApiState {
|
||||||
{
|
|
||||||
[JsonPropertyName("device")]
|
[JsonPropertyName("device")]
|
||||||
public string DeviceId { get; set; }
|
public string DeviceId { get; set; }
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeDevice
|
public class GoveeDevice {
|
||||||
{
|
|
||||||
public string DeviceId { get; set; }
|
public string DeviceId { get; set; }
|
||||||
public string Model { get; set; }
|
public string Model { get; set; }
|
||||||
public string DeviceName { get; set; }
|
public string DeviceName { get; set; }
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeResponse : ApiResponse
|
public class GoveeResponse : ApiResponse {
|
||||||
{
|
|
||||||
public Data Data { get; set; }
|
public Data Data { get; set; }
|
||||||
}
|
}
|
||||||
@ -2,8 +2,7 @@ using GoveeCSharpConnector.Enums;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeState
|
public class GoveeState {
|
||||||
{
|
|
||||||
public PowerState State { get; set; }
|
public PowerState State { get; set; }
|
||||||
public int Brightness { get; set; }
|
public int Brightness { get; set; }
|
||||||
public RgbColor Color { get; set; }
|
public RgbColor Color { get; set; }
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeUdpDevice
|
public class GoveeUdpDevice {
|
||||||
{
|
public string IP { get; set; }
|
||||||
public string ip { get; set; }
|
public string Device { get; set; }
|
||||||
public string device { get; set; }
|
public string Sku { get; set; }
|
||||||
public string sku { get; set; }
|
public string BleVersionHard { get; set; }
|
||||||
public string bleVersionHard { get; set; }
|
public string BleVersionSoft { get; set; }
|
||||||
public string bleVersionSoft { get; set; }
|
public string WiFiVersionHard { get; set; }
|
||||||
public string wifiVersionHard { get; set; }
|
public string WiFiVersionSoft { get; set; }
|
||||||
public string wifiVersionSoft { get; set; }
|
|
||||||
}
|
}
|
||||||
@ -1,12 +1,10 @@
|
|||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeUdpMessage
|
public class GoveeUdpMessage {
|
||||||
{
|
public Msg Msg { get; set; }
|
||||||
public msg msg { get; set; }
|
|
||||||
}
|
}
|
||||||
public class msg
|
public class Msg {
|
||||||
{
|
public string Cmd { get; set; }
|
||||||
public string cmd { get; set; }
|
public object Data { get; set; }
|
||||||
public object data { get; set; }
|
|
||||||
}
|
}
|
||||||
@ -2,10 +2,9 @@ using GoveeCSharpConnector.Enums;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class GoveeUdpState
|
public class GoveeUdpState {
|
||||||
{
|
public PowerState OnOff { get; set; }
|
||||||
public PowerState onOff { get; set; }
|
public short Brightness { get; set; }
|
||||||
public short brightness { get; set; }
|
public RgbColor Color { get; set; }
|
||||||
public RgbColor color { get; set; }
|
public int ColorTempInKelvin { get; set; }
|
||||||
public int colorTempInKelvin { get; set; }
|
|
||||||
}
|
}
|
||||||
@ -2,8 +2,7 @@ using GoveeCSharpConnector.Enums;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class Properties
|
public class Properties {
|
||||||
{
|
|
||||||
public bool Online { get; set; }
|
public bool Online { get; set; }
|
||||||
public PowerState PowerState { get; set; }
|
public PowerState PowerState { get; set; }
|
||||||
public int Brightness { get; set; }
|
public int Brightness { get; set; }
|
||||||
|
|||||||
@ -1,13 +1,11 @@
|
|||||||
namespace GoveeCSharpConnector.Objects;
|
namespace GoveeCSharpConnector.Objects;
|
||||||
|
|
||||||
public class RgbColor
|
public class RgbColor {
|
||||||
{
|
|
||||||
public short R { get; set; }
|
public short R { get; set; }
|
||||||
public short G { get; set; }
|
public short G { get; set; }
|
||||||
public short B { get; set; }
|
public short B { get; set; }
|
||||||
|
|
||||||
public RgbColor(int r, int g, int b)
|
public RgbColor(int r, int g, int b) {
|
||||||
{
|
|
||||||
R = Convert.ToInt16(r);
|
R = Convert.ToInt16(r);
|
||||||
G = Convert.ToInt16(g);
|
G = Convert.ToInt16(g);
|
||||||
B = Convert.ToInt16(b);
|
B = Convert.ToInt16(b);
|
||||||
|
|||||||
@ -1,84 +1,58 @@
|
|||||||
using System.Net.Http.Json;
|
using GoveeCSharpConnector.Interfaces;
|
||||||
|
using GoveeCSharpConnector.Objects;
|
||||||
|
using System.Net.Http.Json;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using GoveeCSharpConnector.Interfaces;
|
|
||||||
using GoveeCSharpConnector.Objects;
|
|
||||||
|
|
||||||
namespace GoveeCSharpConnector.Services;
|
namespace GoveeCSharpConnector.Services;
|
||||||
|
|
||||||
public class GoveeApiService : IGoveeApiService
|
public class GoveeApiService : IGoveeApiService {
|
||||||
{
|
private string _APIKey = string.Empty;
|
||||||
private string _apiKey = string.Empty;
|
private const string _GoveeApiAddress = "https://developer-api.govee.com/v1";
|
||||||
private const string GoveeApiAddress = "https://developer-api.govee.com/v1";
|
private readonly HttpClient _HttpClient = new();
|
||||||
private readonly HttpClient _httpClient = new();
|
private readonly JsonSerializerOptions _JsonOptions = new() {
|
||||||
private readonly JsonSerializerOptions? _jsonOptions = new()
|
|
||||||
{
|
|
||||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||||
};
|
};
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void SetApiKey(string apiKey)
|
public void SetApiKey(string apiKey) {
|
||||||
{
|
_APIKey = apiKey;
|
||||||
_apiKey = apiKey;
|
_HttpClient.DefaultRequestHeaders.Add("Govee-API-Key", _APIKey);
|
||||||
_httpClient.DefaultRequestHeaders.Add("Govee-API-Key", _apiKey);
|
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public string GetApiKey()
|
public string GetApiKey() => _APIKey;
|
||||||
{
|
/// <inheritdoc/>
|
||||||
return _apiKey;
|
public void RemoveApiKey() {
|
||||||
|
_APIKey = string.Empty;
|
||||||
|
_ = _HttpClient.DefaultRequestHeaders.Remove("Govee-Api-Key");
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void RemoveApiKey()
|
public async Task<List<GoveeApiDevice>> GetDevices() {
|
||||||
{
|
GoveeResponse response = await _HttpClient.GetFromJsonAsync<GoveeResponse>($"{_GoveeApiAddress}/devices");
|
||||||
_apiKey = string.Empty;
|
|
||||||
_httpClient.DefaultRequestHeaders.Remove("Govee-Api-Key");
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<List<GoveeApiDevice>> GetDevices()
|
|
||||||
{
|
|
||||||
var response = await _httpClient.GetFromJsonAsync<GoveeResponse>($"{GoveeApiAddress}/devices");
|
|
||||||
|
|
||||||
return response.Data.Devices;
|
return response.Data.Devices;
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<GoveeApiState> GetDeviceState(string deviceId, string deviceModel)
|
public async Task<GoveeApiState> GetDeviceState(string deviceId, string deviceModel) => await _HttpClient.GetFromJsonAsync<GoveeApiState>($"{_GoveeApiAddress}/devices/state?device={deviceId}&model={deviceModel}");
|
||||||
{
|
|
||||||
return await _httpClient.GetFromJsonAsync<GoveeApiState>($"{GoveeApiAddress}/devices/state?device={deviceId}&model={deviceModel}");
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task ToggleState(string deviceId, string deviceModel, bool on)
|
public async Task ToggleState(string deviceId, string deviceModel, bool on) => await SendCommand(deviceId, deviceModel, "turn", on ? "on" : "off");
|
||||||
{
|
|
||||||
await SendCommand(deviceId, deviceModel, "turn", on ? "on" : "off");
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task SetBrightness(string deviceId, string deviceModel, int value)
|
public async Task SetBrightness(string deviceId, string deviceModel, int value) => await SendCommand(deviceId, deviceModel, "brightness", value);
|
||||||
{
|
|
||||||
await SendCommand(deviceId, deviceModel, "brightness", value);
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task SetColor(string deviceId, string deviceModel, RgbColor color)
|
public async Task SetColor(string deviceId, string deviceModel, RgbColor color) => await SendCommand(deviceId, deviceModel, "color", color);
|
||||||
{
|
|
||||||
await SendCommand(deviceId, deviceModel, "color", color);
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task SetColorTemp(string deviceId, string deviceModel, int value)
|
public async Task SetColorTemp(string deviceId, string deviceModel, int value) => await SendCommand(deviceId, deviceModel, "colorTem", value);
|
||||||
{
|
|
||||||
await SendCommand(deviceId, deviceModel, "colorTem", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SendCommand(string deviceId, string deviceModel, string command, object commandObject)
|
private async Task SendCommand(string deviceId, string deviceModel, string command, object commandObject) {
|
||||||
{
|
GoveeApiCommand commandRequest = new() {
|
||||||
var commandRequest = new GoveeApiCommand()
|
|
||||||
{
|
|
||||||
Device = deviceId,
|
Device = deviceId,
|
||||||
Model = deviceModel,
|
Model = deviceModel,
|
||||||
Cmd = new Command()
|
Cmd = new Command() {
|
||||||
{
|
|
||||||
Name = command,
|
Name = command,
|
||||||
Value = commandObject
|
Value = commandObject
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var httpContent = new StringContent(JsonSerializer.Serialize(commandRequest, _jsonOptions), Encoding.UTF8, "application/json");
|
StringContent httpContent = new(JsonSerializer.Serialize(commandRequest, _JsonOptions), Encoding.UTF8, "application/json");
|
||||||
var response = await _httpClient.PutAsync($"{GoveeApiAddress}/devices/control", httpContent);
|
HttpResponseMessage response = await _HttpClient.PutAsync($"{_GoveeApiAddress}/devices/control", httpContent);
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
throw new Exception($"Govee Api Request failed. Status code: {response.StatusCode}, Message: {response.Content}");
|
throw new Exception($"Govee Api Request failed. Status code: {response.StatusCode}, Message: {response.Content}");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,106 +3,102 @@ using GoveeCSharpConnector.Objects;
|
|||||||
|
|
||||||
namespace GoveeCSharpConnector.Services;
|
namespace GoveeCSharpConnector.Services;
|
||||||
|
|
||||||
public class GoveeService : IGoveeService
|
public class GoveeService(IGoveeApiService apiService, IGoveeUdpService udpService) : IGoveeService {
|
||||||
{
|
|
||||||
public string GoveeApiKey { get; set; }
|
public string GoveeApiKey { get; set; }
|
||||||
|
|
||||||
private readonly IGoveeApiService _apiService;
|
private readonly IGoveeApiService _APIService = apiService ?? throw new ArgumentNullException(nameof(apiService));
|
||||||
private readonly IGoveeUdpService _udpService;
|
private readonly IGoveeUdpService _UDPService = udpService ?? throw new ArgumentNullException(nameof(udpService));
|
||||||
|
|
||||||
public GoveeService(IGoveeApiService apiService,IGoveeUdpService udpService)
|
public async Task<List<GoveeDevice>> GetDevices(bool onlyLan = true) {
|
||||||
{
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
_apiService = apiService ?? throw new ArgumentNullException(nameof(apiService));
|
throw new Exception("No Govee Api Key Set!");
|
||||||
_udpService = udpService ?? throw new ArgumentNullException(nameof(udpService));
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
}
|
|
||||||
public async Task<List<GoveeDevice>> GetDevices(bool onlyLan = true)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
|
||||||
|
|
||||||
var apiDevices = await _apiService.GetDevices();
|
List<GoveeApiDevice> apiDevices = await _APIService.GetDevices();
|
||||||
var devices = apiDevices.Select(apiDevice => new GoveeDevice() { DeviceId = apiDevice.DeviceId, DeviceName = apiDevice.DeviceName, Model = apiDevice.Model, Address = "onlyAvailableOnUdpRequest" }).ToList();
|
List<GoveeDevice> devices = apiDevices.Select(apiDevice => new GoveeDevice() { DeviceId = apiDevice.DeviceId, DeviceName = apiDevice.DeviceName, Model = apiDevice.Model, Address = "onlyAvailableOnUdpRequest" }).ToList();
|
||||||
if (!onlyLan)
|
if (!onlyLan)
|
||||||
return devices;
|
return devices;
|
||||||
|
|
||||||
if (!_udpService.IsListening())
|
if (!_UDPService.IsListening())
|
||||||
_udpService.StartUdpListener();
|
_UDPService.StartUdpListener();
|
||||||
|
|
||||||
var udpDevices = await _udpService.GetDevices();
|
List<GoveeUdpDevice> udpDevices = await _UDPService.GetDevices();
|
||||||
|
|
||||||
var combinedDevices = (from goveeDevice in devices let matchingDevice = udpDevices.FirstOrDefault(x => x.device == goveeDevice.DeviceId)
|
List<GoveeDevice> combinedDevices = (from goveeDevice in devices
|
||||||
where matchingDevice is not null select
|
let matchingDevice = udpDevices.FirstOrDefault(x => x.Device == goveeDevice.DeviceId)
|
||||||
new GoveeDevice { DeviceId = goveeDevice.DeviceId, DeviceName = goveeDevice.DeviceName, Model = goveeDevice.Model, Address = matchingDevice.ip }).ToList();
|
where matchingDevice is not null
|
||||||
|
select
|
||||||
|
new GoveeDevice { DeviceId = goveeDevice.DeviceId, DeviceName = goveeDevice.DeviceName, Model = goveeDevice.Model, Address = matchingDevice.IP }).ToList();
|
||||||
|
|
||||||
return combinedDevices;
|
return combinedDevices;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<GoveeState> GetDeviceState(GoveeDevice goveeDevice, bool useUdp = true)
|
public async Task<GoveeState> GetDeviceState(GoveeDevice goveeDevice, bool useUdp = true) {
|
||||||
{
|
if (useUdp) {
|
||||||
if (useUdp)
|
if (!_UDPService.IsListening())
|
||||||
{
|
_UDPService.StartUdpListener();
|
||||||
if (!_udpService.IsListening())
|
if (string.IsNullOrWhiteSpace(goveeDevice.Address))
|
||||||
_udpService.StartUdpListener();
|
throw new Exception("Device not available via Udp/Lan");
|
||||||
if (string.IsNullOrWhiteSpace(goveeDevice.Address)) throw new Exception("Device not available via Udp/Lan");
|
GoveeUdpState udpState = await _UDPService.GetState(goveeDevice.Address);
|
||||||
var udpState = await _udpService.GetState(goveeDevice.Address);
|
return new GoveeState() { State = udpState.OnOff, Brightness = udpState.Brightness, Color = udpState.Color, ColorTempInKelvin = udpState.ColorTempInKelvin };
|
||||||
return new GoveeState() { State = udpState.onOff, Brightness = udpState.brightness, Color = udpState.color, ColorTempInKelvin = udpState.colorTempInKelvin };
|
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
throw new Exception("No Govee Api Key Set!");
|
||||||
var apiState = await _apiService.GetDeviceState(goveeDevice.DeviceId, goveeDevice.Model);
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
return new GoveeState{State = apiState.Properties.PowerState, Brightness = apiState.Properties.Brightness, Color = apiState.Properties.Color, ColorTempInKelvin = apiState.Properties.ColorTemp};
|
GoveeApiState apiState = await _APIService.GetDeviceState(goveeDevice.DeviceId, goveeDevice.Model);
|
||||||
|
return new GoveeState { State = apiState.Properties.PowerState, Brightness = apiState.Properties.Brightness, Color = apiState.Properties.Color, ColorTempInKelvin = apiState.Properties.ColorTemp };
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ToggleState(GoveeDevice goveeDevice, bool on, bool useUdp = true)
|
public async Task ToggleState(GoveeDevice goveeDevice, bool on, bool useUdp = true) {
|
||||||
{
|
if (useUdp) {
|
||||||
if (useUdp)
|
if (string.IsNullOrWhiteSpace(goveeDevice.Address))
|
||||||
{
|
throw new Exception("Device not available via Udp/Lan");
|
||||||
if (string.IsNullOrWhiteSpace(goveeDevice.Address)) throw new Exception("Device not available via Udp/Lan");
|
_UDPService.ToggleDevice(goveeDevice.Address, on);
|
||||||
await _udpService.ToggleDevice(goveeDevice.Address, on);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
throw new Exception("No Govee Api Key Set!");
|
||||||
await _apiService.ToggleState(goveeDevice.DeviceId, goveeDevice.Model, on);
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
|
await _APIService.ToggleState(goveeDevice.DeviceId, goveeDevice.Model, on);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SetBrightness(GoveeDevice goveeDevice, int value, bool useUdp = true)
|
public async Task SetBrightness(GoveeDevice goveeDevice, int value, bool useUdp = true) {
|
||||||
{
|
if (useUdp) {
|
||||||
if (useUdp)
|
if (string.IsNullOrWhiteSpace(goveeDevice.Address))
|
||||||
{
|
throw new Exception("Device not available via Udp/Lan");
|
||||||
if (string.IsNullOrWhiteSpace(goveeDevice.Address)) throw new Exception("Device not available via Udp/Lan");
|
_UDPService.SetBrightness(goveeDevice.Address, value);
|
||||||
await _udpService.SetBrightness(goveeDevice.Address, value);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
throw new Exception("No Govee Api Key Set!");
|
||||||
await _apiService.SetBrightness(goveeDevice.DeviceId, goveeDevice.Model, value);
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
|
await _APIService.SetBrightness(goveeDevice.DeviceId, goveeDevice.Model, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SetColor(GoveeDevice goveeDevice, RgbColor color, bool useUdp = true)
|
public async Task SetColor(GoveeDevice goveeDevice, RgbColor color, bool useUdp = true) {
|
||||||
{
|
if (useUdp) {
|
||||||
if (useUdp)
|
if (string.IsNullOrWhiteSpace(goveeDevice.Address))
|
||||||
{
|
throw new Exception("Device not available via Udp/Lan");
|
||||||
if (string.IsNullOrWhiteSpace(goveeDevice.Address)) throw new Exception("Device not available via Udp/Lan");
|
_UDPService.SetColor(goveeDevice.Address, color);
|
||||||
await _udpService.SetColor(goveeDevice.Address, color);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
|
throw new Exception("No Govee Api Key Set!");
|
||||||
|
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
await _apiService.SetColor(goveeDevice.DeviceId, goveeDevice.Model, color);
|
await _APIService.SetColor(goveeDevice.DeviceId, goveeDevice.Model, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SetColorTemp(GoveeDevice goveeDevice, int value, bool useUdp = true)
|
public async Task SetColorTemp(GoveeDevice goveeDevice, int value, bool useUdp = true) {
|
||||||
{
|
if (useUdp) {
|
||||||
if (useUdp)
|
if (string.IsNullOrWhiteSpace(goveeDevice.Address))
|
||||||
{
|
throw new Exception("Device not available via Udp/Lan");
|
||||||
if (string.IsNullOrWhiteSpace(goveeDevice.Address)) throw new Exception("Device not available via Udp/Lan");
|
_UDPService.SetColorTemp(goveeDevice.Address, value);
|
||||||
await _udpService.SetColorTemp(goveeDevice.Address, value);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
|
if (string.IsNullOrWhiteSpace(GoveeApiKey))
|
||||||
_apiService.SetApiKey(GoveeApiKey);
|
throw new Exception("No Govee Api Key Set!");
|
||||||
await _apiService.SetColorTemp(goveeDevice.DeviceId, goveeDevice.Model, value);
|
_APIService.SetApiKey(GoveeApiKey);
|
||||||
|
await _APIService.SetColorTemp(goveeDevice.DeviceId, goveeDevice.Model, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,95 +1,79 @@
|
|||||||
using System.Net;
|
using GoveeCSharpConnector.Interfaces;
|
||||||
|
using GoveeCSharpConnector.Objects;
|
||||||
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
using System.Reactive.Subjects;
|
using System.Reactive.Subjects;
|
||||||
using System.Reactive.Threading.Tasks;
|
using System.Reactive.Threading.Tasks;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using GoveeCSharpConnector.Interfaces;
|
|
||||||
using GoveeCSharpConnector.Objects;
|
|
||||||
namespace GoveeCSharpConnector.Services;
|
namespace GoveeCSharpConnector.Services;
|
||||||
|
|
||||||
public class GoveeUdpService : IGoveeUdpService
|
public class GoveeUdpService : IGoveeUdpService {
|
||||||
{
|
private const string _GoveeMulticastAddress = "239.255.255.250";
|
||||||
private const string GoveeMulticastAddress = "239.255.255.250";
|
private const int _GoveeMulticastPortListen = 4002;
|
||||||
private const int GoveeMulticastPortListen = 4002;
|
private const int _GoveeMulticastPortSend = 4001;
|
||||||
private const int GoveeMulticastPortSend = 4001;
|
private readonly UdpClient _UDPClient = new();
|
||||||
private readonly UdpClient _udpClient = new();
|
private bool _UDPListenerActive = true;
|
||||||
private bool _udpListenerActive = true;
|
|
||||||
|
|
||||||
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
|
private readonly SemaphoreSlim _Semaphore = new(1, 1);
|
||||||
private readonly Subject<string> _messageSubject = new();
|
private readonly Subject<string> _MessageSubject = new();
|
||||||
private readonly Subject<GoveeUdpDevice> _scanResultSubject = new();
|
private readonly Subject<GoveeUdpDevice> _ScanResultSubject = new();
|
||||||
private readonly Subject<GoveeUdpState> _stateResultSubject = new();
|
private readonly Subject<GoveeUdpState> _StateResultSubject = new();
|
||||||
|
|
||||||
public IObservable<string> Messages => _messageSubject;
|
public IObservable<string> Messages => _MessageSubject;
|
||||||
|
|
||||||
public GoveeUdpService()
|
public GoveeUdpService() => SetupUdpClientListener();
|
||||||
{
|
|
||||||
SetupUdpClientListener();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<List<GoveeUdpDevice>> GetDevices(TimeSpan? timeout = null)
|
public async Task<List<GoveeUdpDevice>> GetDevices(TimeSpan? timeout = null) {
|
||||||
{
|
if (!_UDPListenerActive)
|
||||||
if (!_udpListenerActive)
|
|
||||||
throw new Exception("Udp Listener not started!");
|
throw new Exception("Udp Listener not started!");
|
||||||
// Block this Method until current call reaches end of Method
|
// Block this Method until current call reaches end of Method
|
||||||
await _semaphore.WaitAsync();
|
_Semaphore.Wait();
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "scan",
|
||||||
{
|
Data = new { account_topic = "reserve" }
|
||||||
cmd = "scan",
|
|
||||||
data = new { account_topic = "reserve" }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Subscribe to ScanResultSubject
|
// Subscribe to ScanResultSubject
|
||||||
var devicesTask = _scanResultSubject
|
Task<IList<GoveeUdpDevice>> devicesTask = _ScanResultSubject
|
||||||
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
|
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
|
||||||
.ToList()
|
.ToList()
|
||||||
.ToTask();
|
.ToTask();
|
||||||
|
|
||||||
// Send Message
|
// Send Message
|
||||||
SendUdpMessage(JsonSerializer.Serialize(message), GoveeMulticastAddress, GoveeMulticastPortSend);
|
SendUdpMessage(JsonSerializer.Serialize(message), _GoveeMulticastAddress, _GoveeMulticastPortSend);
|
||||||
|
|
||||||
// Return List
|
// Return List
|
||||||
return (await devicesTask).ToList();
|
return [.. (await devicesTask)];
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
} finally {
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Release Method Block
|
// Release Method Block
|
||||||
_semaphore.Release();
|
_ = _Semaphore.Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<GoveeUdpState> GetState(string deviceAddress, int uniCastPort = 4003, TimeSpan? timeout = null)
|
public async Task<GoveeUdpState> GetState(string deviceAddress, int uniCastPort = 4003, TimeSpan? timeout = null) {
|
||||||
{
|
if (!_UDPListenerActive)
|
||||||
if (!_udpListenerActive)
|
|
||||||
throw new Exception("Udp Listener not started!");
|
throw new Exception("Udp Listener not started!");
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "devStatus",
|
||||||
{
|
Data = new { }
|
||||||
cmd = "devStatus",
|
|
||||||
data = new { }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Subscribe to ScanResultSubject
|
// Subscribe to ScanResultSubject
|
||||||
var devicesTask = _stateResultSubject
|
Task<GoveeUdpState> devicesTask = _StateResultSubject
|
||||||
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
|
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
|
||||||
.ToTask();
|
.ToTask();
|
||||||
|
|
||||||
@ -98,75 +82,56 @@ public class GoveeUdpService : IGoveeUdpService
|
|||||||
|
|
||||||
// Return state
|
// Return state
|
||||||
return await devicesTask;
|
return await devicesTask;
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task ToggleDevice(string deviceAddress, bool on, int uniCastPort = 4003)
|
public void ToggleDevice(string deviceAddress, bool on, int uniCastPort = 4003) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "turn",
|
||||||
{
|
Data = new { value = on ? 1 : 0 }
|
||||||
cmd = "turn",
|
|
||||||
data = new { value = on ? 1 : 0 }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Send Message
|
// Send Message
|
||||||
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
||||||
|
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task SetBrightness(string deviceAddress, int brightness, int uniCastPort = 4003)
|
public void SetBrightness(string deviceAddress, int brightness, int uniCastPort = 4003) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "brightness",
|
||||||
{
|
Data = new { value = brightness }
|
||||||
cmd = "brightness",
|
|
||||||
data = new { value = brightness }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Send Message
|
// Send Message
|
||||||
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
||||||
|
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task SetColor(string deviceAddress, RgbColor color, int uniCastPort = 4003)
|
public void SetColor(string deviceAddress, RgbColor color, int uniCastPort = 4003) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "colorwc",
|
||||||
{
|
Data = new {
|
||||||
cmd = "colorwc",
|
color = new {
|
||||||
data = new
|
|
||||||
{ color = new
|
|
||||||
{
|
|
||||||
r = color.R,
|
r = color.R,
|
||||||
g = color.G,
|
g = color.G,
|
||||||
b = color.B
|
b = color.B
|
||||||
@ -177,131 +142,103 @@ public class GoveeUdpService : IGoveeUdpService
|
|||||||
};
|
};
|
||||||
// Send Message
|
// Send Message
|
||||||
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SetColorTemp(string deviceAddress, int colorTempInKelvin, int uniCastPort = 4003)
|
public void SetColorTemp(string deviceAddress, int colorTempInKelvin, int uniCastPort = 4003) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
// Build Message
|
// Build Message
|
||||||
var message = new GoveeUdpMessage
|
GoveeUdpMessage message = new() {
|
||||||
{
|
Msg = new Msg {
|
||||||
msg = new msg
|
Cmd = "colorwc",
|
||||||
{
|
Data = new {
|
||||||
cmd = "colorwc",
|
color = new {
|
||||||
data = new
|
|
||||||
{
|
|
||||||
color = new
|
|
||||||
{
|
|
||||||
r = 0,
|
r = 0,
|
||||||
g = 0,
|
g = 0,
|
||||||
b = 0
|
b = 0
|
||||||
},
|
},
|
||||||
colorTempInKelvin = colorTempInKelvin
|
colorTempInKelvin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Send Message
|
// Send Message
|
||||||
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
SendUdpMessage(JsonSerializer.Serialize(message), deviceAddress, uniCastPort);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async void StartUdpListener()
|
public async void StartUdpListener() {
|
||||||
{
|
_UDPListenerActive = true;
|
||||||
_udpListenerActive = true;
|
|
||||||
await StartListener();
|
await StartListener();
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public bool IsListening()
|
public bool IsListening() => _UDPListenerActive;
|
||||||
{
|
|
||||||
return _udpListenerActive;
|
|
||||||
}
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void StopUdpListener()
|
public void StopUdpListener() {
|
||||||
{
|
_UDPListenerActive = false;
|
||||||
_udpListenerActive = false;
|
_UDPClient.DropMulticastGroup(IPAddress.Parse(_GoveeMulticastAddress));
|
||||||
_udpClient.DropMulticastGroup(IPAddress.Parse(GoveeMulticastAddress));
|
_UDPClient.Close();
|
||||||
_udpClient.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SendUdpMessage(string message, string receiverAddress, int receiverPort)
|
private static void SendUdpMessage(string message, string receiverAddress, int receiverPort) {
|
||||||
{
|
UdpClient client = new();
|
||||||
var client = new UdpClient();
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
byte[] data = Encoding.UTF8.GetBytes(message);
|
byte[] data = Encoding.UTF8.GetBytes(message);
|
||||||
client.Send(data, data.Length, receiverAddress, receiverPort);
|
_ = client.Send(data, data.Length, receiverAddress, receiverPort);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Console.WriteLine(e);
|
Console.WriteLine(e);
|
||||||
throw;
|
throw;
|
||||||
}
|
} finally {
|
||||||
finally
|
|
||||||
{
|
|
||||||
client.Close();
|
client.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void SetupUdpClientListener()
|
private async void SetupUdpClientListener() {
|
||||||
{
|
_UDPClient.ExclusiveAddressUse = false;
|
||||||
_udpClient.ExclusiveAddressUse = false;
|
IPEndPoint localEndPoint = new(IPAddress.Any, _GoveeMulticastPortListen);
|
||||||
var localEndPoint = new IPEndPoint(IPAddress.Any, GoveeMulticastPortListen);
|
_UDPClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
||||||
_udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
_UDPClient.Client.Bind(localEndPoint);
|
||||||
_udpClient.Client.Bind(localEndPoint);
|
|
||||||
await StartListener();
|
await StartListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task StartListener()
|
private async Task StartListener() {
|
||||||
{
|
try {
|
||||||
try
|
_UDPClient.JoinMulticastGroup(IPAddress.Parse(_GoveeMulticastAddress));
|
||||||
{
|
|
||||||
_udpClient.JoinMulticastGroup(IPAddress.Parse(GoveeMulticastAddress));
|
|
||||||
|
|
||||||
Task.Run(async () =>
|
await Task.Run(() => {
|
||||||
{
|
while (_UDPListenerActive) {
|
||||||
while (_udpListenerActive)
|
IPEndPoint remoteEndPoint = new(IPAddress.Any, 0);
|
||||||
{
|
byte[] data = _UDPClient.Receive(ref remoteEndPoint);
|
||||||
var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
|
||||||
var data = _udpClient.Receive(ref remoteEndPoint);
|
|
||||||
|
|
||||||
var message = Encoding.UTF8.GetString(data);
|
string message = Encoding.UTF8.GetString(data);
|
||||||
|
|
||||||
UdPMessageReceived(message);
|
UdPMessageReceived(message);
|
||||||
_messageSubject.OnNext(message);
|
_MessageSubject.OnNext(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
});
|
});
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UdPMessageReceived(string message)
|
private void UdPMessageReceived(string message) {
|
||||||
{
|
GoveeUdpMessage response = JsonSerializer.Deserialize<GoveeUdpMessage>(message);
|
||||||
var response = JsonSerializer.Deserialize<GoveeUdpMessage>(message);
|
switch (response.Msg.Cmd) {
|
||||||
switch (response.msg.cmd)
|
|
||||||
{
|
|
||||||
case "scan":
|
case "scan":
|
||||||
var device = JsonSerializer.Deserialize<GoveeUdpDevice>(response.msg.data.ToString());
|
GoveeUdpDevice device = JsonSerializer.Deserialize<GoveeUdpDevice>(response.Msg.Data.ToString());
|
||||||
_scanResultSubject.OnNext(device);
|
_ScanResultSubject.OnNext(device);
|
||||||
break;
|
break;
|
||||||
case "devStatus":
|
case "devStatus":
|
||||||
var state = JsonSerializer.Deserialize<GoveeUdpState>(response.msg.data.ToString());
|
GoveeUdpState state = JsonSerializer.Deserialize<GoveeUdpState>(response.Msg.Data.ToString());
|
||||||
_stateResultSubject.OnNext(state);
|
_StateResultSubject.OnNext(state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
296
GoveeCsharpConnector.Example/.editorconfig
Normal file
296
GoveeCsharpConnector.Example/.editorconfig
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
[*.md]
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 2
|
||||||
|
[*.csproj]
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 2
|
||||||
|
[*.cs]
|
||||||
|
csharp_indent_block_contents = true
|
||||||
|
csharp_indent_braces = false
|
||||||
|
csharp_indent_case_contents = true
|
||||||
|
csharp_indent_case_contents_when_block = true
|
||||||
|
csharp_indent_labels = one_less_than_current
|
||||||
|
csharp_indent_switch_labels = true
|
||||||
|
csharp_new_line_before_catch = false
|
||||||
|
csharp_new_line_before_else = false
|
||||||
|
csharp_new_line_before_finally = false
|
||||||
|
csharp_new_line_before_members_in_anonymous_types = true
|
||||||
|
csharp_new_line_before_members_in_object_initializers = true
|
||||||
|
csharp_new_line_before_open_brace = none
|
||||||
|
csharp_new_line_between_query_expression_clauses = true
|
||||||
|
csharp_prefer_braces = false
|
||||||
|
csharp_prefer_qualified_reference = true:error
|
||||||
|
csharp_prefer_simple_default_expression = true:warning
|
||||||
|
csharp_prefer_simple_using_statement = true:warning
|
||||||
|
csharp_prefer_static_local_function = true:warning
|
||||||
|
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
|
||||||
|
csharp_preserve_single_line_blocks = true
|
||||||
|
csharp_preserve_single_line_statements = false
|
||||||
|
csharp_space_after_cast = false
|
||||||
|
csharp_space_after_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_after_comma = true
|
||||||
|
csharp_space_after_dot = false
|
||||||
|
csharp_space_after_keywords_in_control_flow_statements = true
|
||||||
|
csharp_space_after_semicolon_in_for_statement = true
|
||||||
|
csharp_space_around_binary_operators = before_and_after
|
||||||
|
csharp_space_around_declaration_statements = false
|
||||||
|
csharp_space_before_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_before_comma = false
|
||||||
|
csharp_space_before_dot = false
|
||||||
|
csharp_space_before_open_square_brackets = false
|
||||||
|
csharp_space_before_semicolon_in_for_statement = false
|
||||||
|
csharp_space_between_empty_square_brackets = false
|
||||||
|
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||||
|
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||||
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_parentheses = false
|
||||||
|
csharp_space_between_square_brackets = false
|
||||||
|
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
|
||||||
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
|
||||||
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true
|
||||||
|
csharp_style_conditional_delegate_call = true
|
||||||
|
csharp_style_deconstructed_variable_declaration = false
|
||||||
|
csharp_style_expression_bodied_accessors = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_constructors = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_indexers = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_lambdas = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_local_functions = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_methods = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_operators = when_on_single_line:warning
|
||||||
|
csharp_style_expression_bodied_properties = when_on_single_line:warning
|
||||||
|
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
|
||||||
|
csharp_style_inlined_variable_declaration = false
|
||||||
|
csharp_style_namespace_declarations = file_scoped:warning
|
||||||
|
csharp_style_pattern_local_over_anonymous_function = true:warning
|
||||||
|
csharp_style_pattern_matching_over_as_with_null_check = true:warning
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
|
||||||
|
csharp_style_prefer_index_operator = true:warning
|
||||||
|
csharp_style_prefer_not_pattern = true:warning
|
||||||
|
csharp_style_prefer_null_check_over_type_check = true
|
||||||
|
csharp_style_prefer_pattern_matching = true:warning
|
||||||
|
csharp_style_prefer_range_operator = true:warning
|
||||||
|
csharp_style_prefer_switch_expression = true:warning
|
||||||
|
csharp_style_throw_expression = true
|
||||||
|
csharp_style_unused_value_assignment_preference = discard_variable:warning
|
||||||
|
csharp_style_unused_value_expression_statement_preference = discard_variable:warning
|
||||||
|
csharp_style_var_elsewhere = false:warning
|
||||||
|
csharp_style_var_for_built_in_types = false:warning
|
||||||
|
csharp_style_var_when_type_is_apparent = false:warning
|
||||||
|
csharp_using_directive_placement = outside_namespace
|
||||||
|
dotnet_analyzer_diagnostic.category-Design.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Documentation.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Globalization.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Interoperability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Maintainability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Naming.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Performance.severity = none
|
||||||
|
dotnet_analyzer_diagnostic.category-Reliability.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Security.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-SingleFile.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Style.severity = error
|
||||||
|
dotnet_analyzer_diagnostic.category-Usage.severity = error
|
||||||
|
dotnet_code_quality_unused_parameters = all
|
||||||
|
dotnet_code_quality_unused_parameters = non_public
|
||||||
|
dotnet_code_quality.CAXXXX.api_surface = private, internal
|
||||||
|
dotnet_diagnostic.CA1001.severity = error # CA1001: Types that own disposable fields should be disposable
|
||||||
|
dotnet_diagnostic.CA1051.severity = error # CA1051: Do not declare visible instance fields
|
||||||
|
dotnet_diagnostic.CA1511.severity = warning # CA1511: Use 'ArgumentException.ThrowIfNullOrEmpty' instead of explicitly throwing a new exception instance
|
||||||
|
dotnet_diagnostic.CA1513.severity = warning # Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
|
||||||
|
dotnet_diagnostic.CA1825.severity = warning # CA1825: Avoid zero-length array allocations
|
||||||
|
dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available
|
||||||
|
dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
|
||||||
|
dotnet_diagnostic.CA1860.severity = error # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
|
||||||
|
dotnet_diagnostic.CA1862.severity = warning # CA1862: Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'
|
||||||
|
dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead.
|
||||||
|
dotnet_diagnostic.CA2201.severity = none # CA2201: Exception type System.NullReferenceException is reserved by the runtime
|
||||||
|
dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
|
||||||
|
dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name
|
||||||
|
dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2");
|
||||||
|
dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant.
|
||||||
|
dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary
|
||||||
|
dotnet_diagnostic.IDE0010.severity = none # Add missing cases to switch statement (IDE0010)
|
||||||
|
dotnet_diagnostic.IDE0028.severity = error # IDE0028: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
|
||||||
|
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
|
||||||
|
dotnet_diagnostic.IDE0048.severity = none # Parentheses preferences (IDE0047 and IDE0048)
|
||||||
|
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
|
||||||
|
dotnet_diagnostic.IDE0051.severity = error # Private member '' is unused [, ]
|
||||||
|
dotnet_diagnostic.IDE0058.severity = warning # IDE0058: Expression value is never used
|
||||||
|
dotnet_diagnostic.IDE0060.severity = error # IDE0060: Remove unused parameter
|
||||||
|
dotnet_diagnostic.IDE0074.severity = warning # IDE0074: Use compound assignment
|
||||||
|
dotnet_diagnostic.IDE0130.severity = none # Namespace does not match folder structure (IDE0130)
|
||||||
|
dotnet_diagnostic.IDE0270.severity = warning # IDE0270: Null check can be simplified
|
||||||
|
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
|
||||||
|
dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0301.severity = error #IDE0301: Collection initialization can be simplified
|
||||||
|
dotnet_diagnostic.IDE0305.severity = none # IDE0305: Collection initialization can be simplified
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.class_should_be_pascal_case.symbols = class
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.event_should_be_pascal_case.symbols = event
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.method_should_be_pascal_case.symbols = method
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.property_should_be_pascal_case.symbols = property
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||||
|
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||||
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||||
|
dotnet_naming_style.begins_with_i.required_suffix =
|
||||||
|
dotnet_naming_style.begins_with_i.word_separator =
|
||||||
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.pascal_case.required_prefix =
|
||||||
|
dotnet_naming_style.pascal_case.required_suffix =
|
||||||
|
dotnet_naming_style.pascal_case.word_separator =
|
||||||
|
dotnet_naming_style.private_of_internal_field.capitalization = pascal_case
|
||||||
|
dotnet_naming_style.private_of_internal_field.required_prefix = _
|
||||||
|
dotnet_naming_style.private_of_internal_field.required_suffix =
|
||||||
|
dotnet_naming_style.private_of_internal_field.word_separator =
|
||||||
|
dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.abstract_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.abstract_method.required_modifiers = abstract
|
||||||
|
dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.class.applicable_kinds = class
|
||||||
|
dotnet_naming_symbols.class.required_modifiers =
|
||||||
|
dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.delegate.applicable_kinds = delegate
|
||||||
|
dotnet_naming_symbols.delegate.required_modifiers =
|
||||||
|
dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.enum.applicable_kinds = enum
|
||||||
|
dotnet_naming_symbols.enum.required_modifiers =
|
||||||
|
dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.event.applicable_kinds = event
|
||||||
|
dotnet_naming_symbols.event.required_modifiers =
|
||||||
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||||
|
dotnet_naming_symbols.interface.required_modifiers =
|
||||||
|
dotnet_naming_symbols.method.applicable_accessibilities = public
|
||||||
|
dotnet_naming_symbols.method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.method.required_modifiers =
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||||
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_method.applicable_accessibilities = private
|
||||||
|
dotnet_naming_symbols.private_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.private_method.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.property.applicable_kinds = property
|
||||||
|
dotnet_naming_symbols.property.required_modifiers =
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.public_or_protected_field.required_modifiers =
|
||||||
|
dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.static_field.applicable_kinds = field
|
||||||
|
dotnet_naming_symbols.static_field.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.static_method.applicable_kinds = method
|
||||||
|
dotnet_naming_symbols.static_method.required_modifiers = static
|
||||||
|
dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.struct.applicable_kinds = struct
|
||||||
|
dotnet_naming_symbols.struct.required_modifiers =
|
||||||
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||||
|
dotnet_naming_symbols.types.required_modifiers =
|
||||||
|
dotnet_remove_unnecessary_suppression_exclusions = 0
|
||||||
|
dotnet_separate_import_directive_groups = false
|
||||||
|
dotnet_sort_system_directives_first = false
|
||||||
|
dotnet_style_allow_multiple_blank_lines_experimental = false:warning
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = true
|
||||||
|
dotnet_style_coalesce_expression = true
|
||||||
|
dotnet_style_collection_initializer = true:warning
|
||||||
|
dotnet_style_explicit_tuple_names = true:warning
|
||||||
|
dotnet_style_namespace_match_folder = true
|
||||||
|
dotnet_style_null_propagation = true:warning
|
||||||
|
dotnet_style_object_initializer = true:warning
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||||
|
dotnet_style_predefined_type_for_member_access = true:warning
|
||||||
|
dotnet_style_prefer_auto_properties = true:warning
|
||||||
|
dotnet_style_prefer_compound_assignment = true:warning
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = false
|
||||||
|
dotnet_style_prefer_conditional_expression_over_return = false
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true:warning
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
|
||||||
|
dotnet_style_prefer_simplified_boolean_expressions = true:warning
|
||||||
|
dotnet_style_prefer_simplified_interpolation = true
|
||||||
|
dotnet_style_qualification_for_event = false:error
|
||||||
|
dotnet_style_qualification_for_field = false
|
||||||
|
dotnet_style_qualification_for_method = false:error
|
||||||
|
dotnet_style_qualification_for_property = false:error
|
||||||
|
dotnet_style_readonly_field = true:warning
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members
|
||||||
|
end_of_line = crlf
|
||||||
|
file_header_template = unset
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
root = true
|
||||||
|
tab_width = 4
|
||||||
|
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822
|
||||||
|
# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig
|
||||||
|
# https://github.com/dotnet/project-system/blob/main/.editorconfig
|
||||||
470
GoveeCsharpConnector.Example/.vscode/format-report.json
vendored
Normal file
470
GoveeCsharpConnector.Example/.vscode/format-report.json
vendored
Normal file
@ -0,0 +1,470 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 11,
|
||||||
|
"CharNumber": 41,
|
||||||
|
"DiagnosticId": "IDE1006",
|
||||||
|
"FormatDescription": "error IDE1006: Naming rule violation: These words must begin with upper case characters: apiDevices"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 12,
|
||||||
|
"CharNumber": 41,
|
||||||
|
"DiagnosticId": "IDE1006",
|
||||||
|
"FormatDescription": "error IDE1006: Naming rule violation: These words must begin with upper case characters: udpDevices"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 10,
|
||||||
|
"CharNumber": 45,
|
||||||
|
"DiagnosticId": "IDE1006",
|
||||||
|
"FormatDescription": "error IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 209,
|
||||||
|
"CharNumber": 49,
|
||||||
|
"DiagnosticId": "IDE0049",
|
||||||
|
"FormatDescription": "warning IDE0049: Name can be simplified"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 32,
|
||||||
|
"CharNumber": 26,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 201,
|
||||||
|
"CharNumber": 9,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 203,
|
||||||
|
"CharNumber": 18,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 45,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 208,
|
||||||
|
"CharNumber": 9,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 53,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 73,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 221,
|
||||||
|
"CharNumber": 13,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 81,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 100,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 107,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 114,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 133,
|
||||||
|
"CharNumber": 26,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 140,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 209,
|
||||||
|
"CharNumber": 75,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 143,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 158,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 161,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 174,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 176,
|
||||||
|
"CharNumber": 17,
|
||||||
|
"DiagnosticId": "IDE0008",
|
||||||
|
"FormatDescription": "error IDE0008: Use explicit type instead of \u0027var\u0027"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "d562c9a2-c11c-4e41-a604-35e261537b88"
|
||||||
|
},
|
||||||
|
"FileName": "Program.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Program.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 234,
|
||||||
|
"CharNumber": 9,
|
||||||
|
"DiagnosticId": "IDE0058",
|
||||||
|
"FormatDescription": "warning IDE0058: Expression value is never used"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DocumentId": {
|
||||||
|
"ProjectId": {
|
||||||
|
"Id": "75bf9517-12b5-40b2-b970-ba4afd8d059c"
|
||||||
|
},
|
||||||
|
"Id": "ed819aaa-de6e-4cfb-97ac-48d5cb0923fb"
|
||||||
|
},
|
||||||
|
"FileName": "Extensions.cs",
|
||||||
|
"FilePath": "L:\\Git\\GoveeCSharpConnector\\GoveeCsharpConnector.Example\\Extensions.cs",
|
||||||
|
"FileChanges": [
|
||||||
|
{
|
||||||
|
"LineNumber": 1,
|
||||||
|
"CharNumber": 21,
|
||||||
|
"DiagnosticId": "CA1050",
|
||||||
|
"FormatDescription": "error CA1050: Declare types in namespaces"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
24
GoveeCsharpConnector.Example/.vscode/launch.json
vendored
Normal file
24
GoveeCsharpConnector.Example/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": ".NET Core Launch (console)",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "launch",
|
||||||
|
"preLaunchTask": "build",
|
||||||
|
"program": "${workspaceFolder}/bin/Debug/net8.0/GoveeCsharpConnector.Example.dll",
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"console": "externalTerminal",
|
||||||
|
"stopAtEntry": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": ".NET Core Attach",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "attach"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
5
GoveeCsharpConnector.Example/.vscode/settings.json
vendored
Normal file
5
GoveeCsharpConnector.Example/.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"cSpell.words": [
|
||||||
|
"Govee"
|
||||||
|
]
|
||||||
|
}
|
||||||
66
GoveeCsharpConnector.Example/.vscode/tasks.json
vendored
Normal file
66
GoveeCsharpConnector.Example/.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"args": [
|
||||||
|
"format",
|
||||||
|
"--report",
|
||||||
|
".vscode",
|
||||||
|
"--verbosity",
|
||||||
|
"detailed",
|
||||||
|
"--severity",
|
||||||
|
"warn"
|
||||||
|
],
|
||||||
|
"command": "dotnet",
|
||||||
|
"label": "Format",
|
||||||
|
"problemMatcher": "$msCompile",
|
||||||
|
"type": "process"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"args": [
|
||||||
|
"format",
|
||||||
|
"whitespace"
|
||||||
|
],
|
||||||
|
"command": "dotnet",
|
||||||
|
"label": "Format Whitespaces",
|
||||||
|
"problemMatcher": "$msCompile",
|
||||||
|
"type": "process"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"${workspaceFolder}/GoveeCsharpConnector.Example.csproj",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "publish",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"publish",
|
||||||
|
"${workspaceFolder}/GoveeCsharpConnector.Example.csproj",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "watch",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"watch",
|
||||||
|
"run",
|
||||||
|
"--project",
|
||||||
|
"${workspaceFolder}/GoveeCsharpConnector.Example.csproj"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
8
GoveeCsharpConnector.Example/Extensions.cs
Normal file
8
GoveeCsharpConnector.Example/Extensions.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
namespace GoveeCsharpConnector.Example;
|
||||||
|
|
||||||
|
public static class Extensions {
|
||||||
|
|
||||||
|
public static bool EqualWhenIgnoringCase(this string? value, string compare) =>
|
||||||
|
string.IsNullOrWhiteSpace(value) || value.Equals(compare, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,14 +1,11 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\GoveeCSharpConnector\GoveeCSharpConnector.csproj" />
|
<ProjectReference Include="..\GoveeCSharpConnector\GoveeCSharpConnector.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@ -1,147 +1,126 @@
|
|||||||
using System.Net.Mime;
|
using GoveeCSharpConnector.Objects;
|
||||||
using System.Reflection;
|
|
||||||
using System.Xml.Linq;
|
|
||||||
using GoveeCSharpConnector.Objects;
|
|
||||||
using GoveeCSharpConnector.Services;
|
using GoveeCSharpConnector.Services;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace GoveeCsharpConnector.Example;
|
namespace GoveeCsharpConnector.Example;
|
||||||
|
|
||||||
public class Program
|
public class Program {
|
||||||
{
|
|
||||||
private static readonly GoveeApiService GoveeApiService = new ();
|
|
||||||
private static readonly GoveeUdpService GoveeUdpService = new ();
|
|
||||||
private static List<GoveeApiDevice> _apiDevices = new ();
|
|
||||||
private static List<GoveeUdpDevice> _udpDevices = new();
|
|
||||||
|
|
||||||
public static async Task Main(string[] args)
|
private static readonly GoveeApiService _GoveeApiService = new();
|
||||||
{
|
private static readonly GoveeUdpService _GoveeUdpService = new();
|
||||||
while (true)
|
private static List<GoveeApiDevice> _APIDevices = [];
|
||||||
{
|
private static List<GoveeUdpDevice> _UDPDevices = [];
|
||||||
|
|
||||||
|
public static Task Main(string[] _) {
|
||||||
|
while (true) {
|
||||||
PrintWelcomeMessage();
|
PrintWelcomeMessage();
|
||||||
var input = Console.ReadLine();
|
string? input = Console.ReadLine();
|
||||||
HandleKeyInput(input);
|
HandleKeyInput(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void HandleKeyInput(string input)
|
private static async void HandleKeyInput(string? input) {
|
||||||
{
|
switch (input) {
|
||||||
switch (input)
|
|
||||||
{
|
|
||||||
case "1":
|
case "1":
|
||||||
HandleApiInput();
|
HandleApiInput();
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "2":
|
case "2":
|
||||||
Console.WriteLine("Requesting Devices ...");
|
Console.WriteLine("Requesting Devices ...");
|
||||||
_apiDevices = await GoveeApiService.GetDevices();
|
_APIDevices = await _GoveeApiService.GetDevices();
|
||||||
Console.WriteLine("Devices:");
|
Console.WriteLine("Devices:");
|
||||||
foreach (var device in _apiDevices)
|
foreach (GoveeApiDevice device in _APIDevices) {
|
||||||
{
|
|
||||||
Console.WriteLine($"Name: {device.DeviceName}, Device Id: {device.DeviceId}, Model: {device.Model}, Controllable {device.Controllable}");
|
Console.WriteLine($"Name: {device.DeviceName}, Device Id: {device.DeviceId}, Model: {device.Model}, Controllable {device.Controllable}");
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Total: {_apiDevices.Count} Devices.");
|
Console.WriteLine($"Total: {_APIDevices.Count} Devices.");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "3":
|
case "3":
|
||||||
if (_apiDevices.Count == 0)
|
if (_APIDevices.Count == 0) {
|
||||||
{
|
|
||||||
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Console.WriteLine("Please enter the Name of the Device:");
|
Console.WriteLine("Please enter the Name of the Device:");
|
||||||
var nameInput = Console.ReadLine()?.ToLower();
|
string? nameInput = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(nameInput) || _apiDevices.FirstOrDefault(x => x.DeviceName.ToLower() == nameInput) is null)
|
if (string.IsNullOrWhiteSpace(nameInput) || _APIDevices.FirstOrDefault(x => x.DeviceName.EqualWhenIgnoringCase(nameInput)) is null) {
|
||||||
{
|
|
||||||
Console.WriteLine("Device Name Invalid!");
|
Console.WriteLine("Device Name Invalid!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine($"Do you want to turn the Device {nameInput} on or off?");
|
Console.WriteLine($"Do you want to turn the Device {nameInput} on or off?");
|
||||||
var onOffInput = Console.ReadLine()?.ToLower();
|
string? onOffInput = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(onOffInput) || (onOffInput != "on" && onOffInput != "off"))
|
if (string.IsNullOrWhiteSpace(onOffInput) || (!onOffInput.EqualWhenIgnoringCase("on") && onOffInput.EqualWhenIgnoringCase("off"))) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input == "on")
|
if (onOffInput.EqualWhenIgnoringCase("on"))
|
||||||
{
|
await _GoveeApiService.ToggleState(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput)).DeviceId, _APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput)).Model, true);
|
||||||
await GoveeApiService.ToggleState(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput).DeviceId, _apiDevices.First(x => x.DeviceName.ToLower() == nameInput).Model, true);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
await _GoveeApiService.ToggleState(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput)).DeviceId, _APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput)).Model, false);
|
||||||
await GoveeApiService.ToggleState(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput).DeviceId, _apiDevices.First(x => x.DeviceName.ToLower() == nameInput).Model, false);
|
|
||||||
}
|
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "4":
|
case "4":
|
||||||
if (_apiDevices.Count == 0)
|
if (_APIDevices.Count == 0) {
|
||||||
{
|
|
||||||
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Console.WriteLine("Please enter the Name of the Device:");
|
Console.WriteLine("Please enter the Name of the Device:");
|
||||||
var nameInput2 = Console.ReadLine()?.ToLower();
|
string? nameInput2 = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(nameInput2) || _apiDevices.FirstOrDefault(x => x.DeviceName.ToLower() == nameInput2) is null)
|
if (string.IsNullOrWhiteSpace(nameInput2) || _APIDevices.FirstOrDefault(x => x.DeviceName.EqualWhenIgnoringCase(nameInput2)) is null) {
|
||||||
{
|
|
||||||
Console.WriteLine("Device Name Invalid!");
|
Console.WriteLine("Device Name Invalid!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine($"Please enter a Brightness Value for Device {nameInput2}. 0-100");
|
Console.WriteLine($"Please enter a Brightness Value for Device {nameInput2}. 0-100");
|
||||||
var brightnessInput = Console.ReadLine();
|
string? brightnessInput = Console.ReadLine();
|
||||||
int value = Convert.ToInt16(brightnessInput);
|
int value = Convert.ToInt16(brightnessInput);
|
||||||
if (string.IsNullOrWhiteSpace(brightnessInput) || value < 0 || value > 100)
|
if (string.IsNullOrWhiteSpace(brightnessInput) || value < 0 || value > 100) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await GoveeApiService.SetBrightness(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput2).DeviceId, _apiDevices.First(x => x.DeviceName.ToLower() == nameInput2).Model, value);
|
await _GoveeApiService.SetBrightness(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput2)).DeviceId, _APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput2)).Model, value);
|
||||||
Console.WriteLine($"Set Brightness of Device {nameInput2} to {value}%!");
|
Console.WriteLine($"Set Brightness of Device {nameInput2} to {value}%!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "5":
|
case "5":
|
||||||
if (_apiDevices.Count == 0)
|
if (_APIDevices.Count == 0) {
|
||||||
{
|
|
||||||
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
Console.WriteLine("No Devices discovered! Please use Option 2 first!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Console.WriteLine("Please enter the Name of the Device:");
|
Console.WriteLine("Please enter the Name of the Device:");
|
||||||
var nameInput3 = Console.ReadLine()?.ToLower();
|
string? nameInput3 = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(nameInput3) || _apiDevices.FirstOrDefault(x => x.DeviceName.ToLower() == nameInput3) is null)
|
if (string.IsNullOrWhiteSpace(nameInput3) || _APIDevices.FirstOrDefault(x => x.DeviceName.EqualWhenIgnoringCase(nameInput3)) is null) {
|
||||||
{
|
|
||||||
Console.WriteLine("Device Name Invalid!");
|
Console.WriteLine("Device Name Invalid!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Please choose a Color to set {nameInput3} to ... (blue, red, green)");
|
Console.WriteLine($"Please choose a Color to set {nameInput3} to ... (blue, red, green)");
|
||||||
var colorInput = Console.ReadLine()?.ToLower();
|
string? colorInput = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(colorInput) || (colorInput != "blue" && colorInput != "green" && colorInput != "red"))
|
if (string.IsNullOrWhiteSpace(colorInput) || (!colorInput.EqualWhenIgnoringCase("blue") && colorInput != "green" && colorInput != "red")) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var model = _apiDevices.FirstOrDefault(x => x.DeviceName.ToLower()== nameInput3)?.Model;
|
string? model = _APIDevices.FirstOrDefault(x => x.DeviceName.EqualWhenIgnoringCase(nameInput3))?.Model;
|
||||||
switch (colorInput)
|
switch (colorInput) {
|
||||||
{
|
|
||||||
case "blue":
|
case "blue":
|
||||||
await GoveeApiService.SetColor(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput3).DeviceId, model, new RgbColor(0, 0 ,254));
|
await _GoveeApiService.SetColor(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput3)).DeviceId, model, new RgbColor(0, 0, 254));
|
||||||
break;
|
break;
|
||||||
case "green":
|
case "green":
|
||||||
await GoveeApiService.SetColor(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput3).DeviceId, model, new RgbColor(0, 254 ,0));
|
await _GoveeApiService.SetColor(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput3)).DeviceId, model, new RgbColor(0, 254, 0));
|
||||||
break;
|
break;
|
||||||
case "red":
|
case "red":
|
||||||
await GoveeApiService.SetColor(_apiDevices.First(x => x.DeviceName.ToLower() == nameInput3).DeviceId, model, new RgbColor(254, 0 ,0));
|
await _GoveeApiService.SetColor(_APIDevices.First(x => x.DeviceName.EqualWhenIgnoringCase(nameInput3)).DeviceId, model, new RgbColor(254, 0, 0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Set Color of Device {nameInput3} to {colorInput}!");
|
Console.WriteLine($"Set Color of Device {nameInput3} to {colorInput}!");
|
||||||
@ -149,140 +128,121 @@ public class Program
|
|||||||
break;
|
break;
|
||||||
case "6":
|
case "6":
|
||||||
Console.WriteLine("Requesting Devices ...");
|
Console.WriteLine("Requesting Devices ...");
|
||||||
_udpDevices = await GoveeUdpService.GetDevices();
|
_UDPDevices = await _GoveeUdpService.GetDevices();
|
||||||
Console.WriteLine("Devices:");
|
Console.WriteLine("Devices:");
|
||||||
foreach (var device in _udpDevices)
|
foreach (GoveeUdpDevice device in _UDPDevices) {
|
||||||
{
|
Console.WriteLine($"IpAddress: {device.IP}, Device Id: {device.Device}, Model: {device.Sku}");
|
||||||
Console.WriteLine($"IpAddress: {device.ip}, Device Id: {device.device}, Model: {device.sku}");
|
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Total: {_udpDevices.Count} Devices.");
|
Console.WriteLine($"Total: {_UDPDevices.Count} Devices.");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "7":
|
case "7":
|
||||||
var selectedDevice = GetUdpDeviceSelection();
|
GoveeUdpDevice selectedDevice = GetUdpDeviceSelection();
|
||||||
|
|
||||||
Console.WriteLine($"Do you want to turn the Device {selectedDevice.ip} on or off?");
|
Console.WriteLine($"Do you want to turn the Device {selectedDevice.IP} on or off?");
|
||||||
var onOffInput2 = Console.ReadLine()?.ToLower();
|
string? onOffInput2 = Console.ReadLine()?.ToLower();
|
||||||
if (string.IsNullOrWhiteSpace(onOffInput2) || (onOffInput2 != "on" && onOffInput2 != "off"))
|
if (string.IsNullOrWhiteSpace(onOffInput2) || (onOffInput2 != "on" && onOffInput2 != "off")) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input == "on")
|
if (input == "on") {
|
||||||
{
|
_GoveeUdpService.ToggleDevice(selectedDevice.IP, true);
|
||||||
await GoveeUdpService.ToggleDevice(selectedDevice.ip, true);
|
} else {
|
||||||
}
|
_GoveeUdpService.ToggleDevice(selectedDevice.IP, false);
|
||||||
else
|
|
||||||
{
|
|
||||||
await GoveeUdpService.ToggleDevice(selectedDevice.ip, false);
|
|
||||||
}
|
}
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "8":
|
case "8":
|
||||||
var selectedDevice2 = GetUdpDeviceSelection();
|
GoveeUdpDevice selectedDevice2 = GetUdpDeviceSelection();
|
||||||
|
|
||||||
Console.WriteLine($"Please enter a Brightness Value for Device {selectedDevice2.ip}. 0-100");
|
Console.WriteLine($"Please enter a Brightness Value for Device {selectedDevice2.IP}. 0-100");
|
||||||
var brightnessInput2 = Console.ReadLine();
|
string? brightnessInput2 = Console.ReadLine();
|
||||||
int value2 = Convert.ToInt16(brightnessInput2);
|
int value2 = Convert.ToInt16(brightnessInput2);
|
||||||
if (string.IsNullOrWhiteSpace(brightnessInput2) || value2 < 0 || value2 > 100)
|
if (string.IsNullOrWhiteSpace(brightnessInput2) || value2 < 0 || value2 > 100) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await GoveeUdpService.SetBrightness(selectedDevice2.ip, value2);
|
_GoveeUdpService.SetBrightness(selectedDevice2.IP, value2);
|
||||||
Console.WriteLine($"Set Brightness of Device {selectedDevice2.ip} to {value2}%!");
|
Console.WriteLine($"Set Brightness of Device {selectedDevice2.IP} to {value2}%!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
case "9":
|
case "9":
|
||||||
var selectedDevice3 = GetUdpDeviceSelection();
|
GoveeUdpDevice selectedDevice3 = GetUdpDeviceSelection();
|
||||||
Console.WriteLine($"Please choose a Color to set {selectedDevice3.ip} to ... (blue, red, green)");
|
Console.WriteLine($"Please choose a Color to set {selectedDevice3.IP} to ... (blue, red, green)");
|
||||||
var colorInput2 = Console.ReadLine()?.ToLower();
|
string? colorInput2 = Console.ReadLine()?.ToLower();
|
||||||
if (string.IsNullOrWhiteSpace(colorInput2) || (colorInput2 != "blue" && colorInput2 != "green" && colorInput2 != "red"))
|
if (string.IsNullOrWhiteSpace(colorInput2) || (colorInput2 != "blue" && colorInput2 != "green" && colorInput2 != "red")) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (colorInput2)
|
switch (colorInput2) {
|
||||||
{
|
|
||||||
case "blue":
|
case "blue":
|
||||||
GoveeUdpService.SetColor(selectedDevice3.ip, new RgbColor(0, 0, 254));
|
_GoveeUdpService.SetColor(selectedDevice3.IP, new RgbColor(0, 0, 254));
|
||||||
break;
|
break;
|
||||||
case "green":
|
case "green":
|
||||||
GoveeUdpService.SetColor(selectedDevice3.ip, new RgbColor(0, 254, 0));
|
_GoveeUdpService.SetColor(selectedDevice3.IP, new RgbColor(0, 254, 0));
|
||||||
break;
|
break;
|
||||||
case "red":
|
case "red":
|
||||||
GoveeUdpService.SetColor(selectedDevice3.ip, new RgbColor(254, 0, 0));
|
_GoveeUdpService.SetColor(selectedDevice3.IP, new RgbColor(254, 0, 0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Set Color of Device {selectedDevice3.ip} to {colorInput2}!");
|
Console.WriteLine($"Set Color of Device {selectedDevice3.IP} to {colorInput2}!");
|
||||||
EndSegment();
|
EndSegment();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GoveeUdpDevice GetUdpDeviceSelection()
|
private static GoveeUdpDevice GetUdpDeviceSelection() {
|
||||||
{
|
int count = 1;
|
||||||
var count = 1;
|
|
||||||
Console.WriteLine("Please Choose a Device from the List:");
|
Console.WriteLine("Please Choose a Device from the List:");
|
||||||
foreach (var device in _udpDevices)
|
foreach (GoveeUdpDevice device in _UDPDevices) {
|
||||||
{
|
Console.WriteLine($"{count} - IpAddress: {device.IP}, Device Id {device.Device}, Model {device.Sku}");
|
||||||
Console.WriteLine($"{count} - IpAdress: {device.ip}, Device Id {device.device}, Model {device.sku}");
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
var input = Console.ReadLine();
|
string? input = Console.ReadLine();
|
||||||
if (string.IsNullOrWhiteSpace(input) || Int16.TryParse(input, out var result) is false)
|
if (string.IsNullOrWhiteSpace(input) || !short.TryParse(input, out short result)) {
|
||||||
{
|
|
||||||
Console.WriteLine("Invalid Input!");
|
Console.WriteLine("Invalid Input!");
|
||||||
return GetUdpDeviceSelection();
|
return GetUdpDeviceSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _udpDevices[result-1];
|
return _UDPDevices[result - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void HandleApiInput()
|
private static void HandleApiInput() {
|
||||||
{
|
while (true) {
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Please enter/paste your Govee Api Key ...");
|
Console.WriteLine("Please enter/paste your Govee Api Key ...");
|
||||||
Console.WriteLine("Your Api Key should look something like this: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
|
Console.WriteLine("Your Api Key should look something like this: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
|
||||||
var input = Console.ReadLine();
|
string? input = Console.ReadLine();
|
||||||
if (input is null || input.Length != 36)
|
if (input is null || input.Length != 36) {
|
||||||
{
|
|
||||||
Console.WriteLine("Wrong Api Key Format!");
|
Console.WriteLine("Wrong Api Key Format!");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
GoveeApiService.SetApiKey(input);
|
_GoveeApiService.SetApiKey(input);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Console.WriteLine("Api Key saved!");
|
Console.WriteLine("Api Key saved!");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void EndSegment()
|
private static void EndSegment() {
|
||||||
{
|
|
||||||
Console.WriteLine("---------------------------Press any Key to continue---------------------------");
|
Console.WriteLine("---------------------------Press any Key to continue---------------------------");
|
||||||
Console.ReadLine();
|
_ = Console.ReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void PrintWelcomeMessage()
|
private static void PrintWelcomeMessage() {
|
||||||
{
|
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine("Welcome to the GoveeCSharpConnector Example!");
|
Console.WriteLine("Welcome to the GoveeCSharpConnector Example!");
|
||||||
Console.WriteLine($"Version: {Assembly.GetEntryAssembly()?.GetName().Version}");
|
Console.WriteLine($"Version: {Assembly.GetEntryAssembly()?.GetName().Version}");
|
||||||
Console.WriteLine($"To test/explore the GoveeCSharpConnector Version: {Assembly.Load("GoveeCSharpConnector").GetName().Version}");
|
Console.WriteLine($"To test/explore the GoveeCSharpConnector Version: {Assembly.Load("GoveeCSharpConnector").GetName().Version}");
|
||||||
Console.WriteLine("----------------------------------------------------------");
|
Console.WriteLine("----------------------------------------------------------");
|
||||||
if (string.IsNullOrEmpty(GoveeApiService.GetApiKey()))
|
if (string.IsNullOrEmpty(_GoveeApiService.GetApiKey())) {
|
||||||
{
|
|
||||||
Console.WriteLine("1 - Enter GoveeApi Key - START HERE (Required for Api Service Options!)");
|
Console.WriteLine("1 - Enter GoveeApi Key - START HERE (Required for Api Service Options!)");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine("1 - Enter GoveeApi Key - Already Set!");
|
Console.WriteLine("1 - Enter GoveeApi Key - Already Set!");
|
||||||
Console.WriteLine("Api Service:");
|
Console.WriteLine("Api Service:");
|
||||||
Console.WriteLine("2 - Get a List of all Devices connected to the Api Key Account");
|
Console.WriteLine("2 - Get a List of all Devices connected to the Api Key Account");
|
||||||
|
|||||||
Reference in New Issue
Block a user