智能家居 – 控制 Shelly® 设备(第 4 部分) – 使用 PropertyDesc

本文彻底改变了 Shelly 设备管理,为初学者和高级用户提供更新、高效且功能丰富的解决方案。您将发现新的 ShellyCom2 功能,例如使用 PropertyDescriptor 进行属性操作,以及一组有价值的帮

本文彻底改变了 Shelly 设备管理,为初学者和高级用户提供更新、高效且功能丰富的解决方案。”您将发现新的 ShellyCom2 功能,例如使用 PropertyDescriptor 进行属性操作,以及一组有价值的帮助程序和命令。

介绍

本文的基础是我之前文章中的描述:

在我的上一篇文章中,我写道这个系列将结束......事情有时会与你想象的不同......

一方面,我可以访问其他设备(Shelly Button、Shelly Plug、Shelly 4pm、Shelly Bulb Vintage、Shelly Bulb Duo 和 Shelly Bulb Duo RGBW)并添加它们。对于雪莉灯泡来说,控制它们的文档并不是特别好。这就是为什么我在本文中专门用一小部分来讨论这一点。

此后,我在现有工具箱中实现了附加功能或修改了旧功能 - 也涉及 DRY 概念(不要重复)。

此外,根据我的游戏本能,我更改了操作的属性行为,以便只有适用于上下文的属性才是可见的。在本文中,我特别介绍了这些内容,它们与 Shelly 设备没有任何直接关系,但其他人可能也会感兴趣 - 使用我的工具箱中的应用程序示例。本文也可以称为使用 PropertyDescriptor 进行属性操作。

该下载包含完整的工具箱,其中包含所有当前组件(VB.NET 和 C# 版本),基本上完全取代了之前文章的下载。

ShellyCom2 内的新功能

这里添加了一些新函数和助手:

帮手
Shelly_CheckIp 检查传递的IP地址是否合法,是否实际存在,导致一个Shelly设备,并且该设备也可以用于该任务。由于此处检查了属性的输入,因此所有违规行为都会作为消息框消息输出。
JsonPrettify 将传递的 JSON 字符串转换为更易读的格式
ConvertUnixTimestamp 将 Shelly 使用的 Unix 时间戳转换为 MicrosoftDateTime格式
Shelly_GetStatusString 返回任何要传递的 Shelly 请求的状态字符串
Shelly_ShowDeviceInfo 提供DeviceInfo传递的 IP 地址处的 Shelly 设备的信息以用于显示目的
CheckColorIsKnown 检查从 Shelly 设备传递的值是否Color.ARGB对应于已知的颜色分配

 

要求
Shelly_GetType 确定传递的 IP 地址处的 Shelly 类型。现在这里存储的类型比我实际检查的要多。但传递的标识符是正确的......
Shelly_GetInfo 在传递的IP地址处传递Shelly设备的基本信息
Shelly_GetBaseType 返回传递的 IP 地址处的 Shelly 设备的基本类型(输入、输出单通道、输出多通道、调光器、灯)
Shelly_GetNrOutputs 返回 Shelly 设备在传递的 IP 地址处的可用输出数量
   
Shelly_DimmerRGBW_GetStatus 提供 RGBW 设备的状态。

 

命令
AssignAction 根据传输,选择相关的功能例程来执行命令。由于每个组件中基本上都使用了该方法,因此我将其从组件中删除并作为收集例程存储在这里。
Shelly_SetRoller 为Shelly Pro Dual Cover准备,因为这里可以配置和使用2个百叶窗
Shelly_ToggleRoller
Shelly_SetLamp+ 1 覆盖层 将相应的数据分配给位于传输的 IP 地址的灯
Shelly_ToggleLamp+ 1 覆盖层 使用相应的数据切换所传递的 IP 地址处的灯的状态

控制雪莉灯泡

不同的雪莉灯泡有非常不同的行为和可能性:

  • Shelly-Bulb Vintage 基本上与 Shelly Dimmer 具有相同的行为 - 因此可以以相同的方式对其进行处理。
  • Shelly-Bulb Duo 还提供改变白色颜色的选项。
  • 最后,Shelly-Bulb RBGW 有 2 种操作模式。在 中Mode=White,它的行为与 Bulb Duo 相同,只是temp色温 (3000 ... 6500) 使用具有不同值范围的不同属性 ( )。还有一种Mode=Color可以使用 Windows RGB 颜色表来控制灯并且可以操纵其亮度。还可以选择效果。Shelly_SetLamp我已在相关方法或中考虑了这些方面Shelly_ToggleLamp

不同组件的项目定义

最初,每个组件都有自己的项目定义 - 我现在已经为所有组件总结了这一点。因此,在定义文件中,只有 和SceneActionDefinitionControlActionDefinition它派生自SceneActionDefinition.

这些定义的基本结构保持不变 - 仅添加了一些额外必需的属性...以及...接口ICustomTypeDescriptor,它允许根据PropertyGrid预选使 中的各个属性可见或不可见。我将在下面描述它是如何工作的。

此外,作为一种噱头,还UITypeEditor Symbol2Property添加了在其中2个属性前面显示图像符号的功能。为了使其工作,必须将包含的图形作为资源导入到项目中。我还将在下面更详细地描述这一点。

最后的待遇是TypeConverter SelectionOnOffConverter,它现在代表ON和 ,OFF而不是TRUEFALSE代表State财产。下面我也会谈到这一点。

选择开关转换器

此转换器将变量属性的标准输出boolTrue/更改FalseOnOff

首先,它的代码:

 
Imports System
Imports System.ComponentModel

Public Class SelectionOnOffConverter
    Inherits BooleanConverter

    Public Overloads Overrides Function CanConvertTo_
    (ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
        If destinationType Is GetType(String) Then Return True

        'allow converting to String
        Return MyBase.CanConvertTo(context, destinationType)
    End Function

    Public Overloads Overrides Function ConvertTo_
           (ByVal context As ITypeDescriptorContext, _
            ByVal culture As System.Globalization.CultureInfo, _
            ByVal value As Object, ByVal destinationType As Type) As Object
        If destinationType Is GetType(String) Then
            'converting to String
            Dim result As Boolean
            Try
                result = CBool(value)
            Catch ex As Exception
                result = False
            End Try

            If Not result Then
                Return "Off"
            Else
                Return "On"
            End If
        End If

        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function

    Public Overloads Overrides Function CanConvertFrom_
           (ByVal context As ITypeDescriptorContext, _
            ByVal sourceType As Type) As Boolean
        If sourceType Is GetType(String) Then Return True

        'allow converting from String
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overloads Overrides Function ConvertFrom_
           (ByVal context As ITypeDescriptorContext, _
            ByVal culture As System.Globalization.CultureInfo, _
            ByVal value As Object) As Object
        If (TypeOf value Is String) Then
            'converting from String
            If value.ToString.ToLower.Trim = "off" Then
                Return False
            Else
                Return True
            End If
        End If

        Return MyBase.ConvertFrom(context, culture, value)
    End Function

End Class

PropertyGrid本身基本上代表了显示在那里的每个变量,无论它是什么类型,作为文本(即string)。因此,转换器string从每个属性生成一个。对于系统已知的所有变量,都有一个相应使用的转换器。但是......您当然也可以指定一个完全不同的转换器,甚至您自己创建的转换器应该用于该属性。在本系列的上一篇文章中,我已经介绍了DropDownConverter作为一种工具。

CodeProject 已经撰写了许多关于TypeConverters 主题的文章 - 因此,如果您有兴趣自己创建类似的内容,我建议您只

本文来自网络,不代表本站立场,转载请注明出处: 智能家居 – 控制 Shelly® 设备(第 4 部分) – 使用 PropertyDesc
/addon/skin1/images/4c2ed7.png
本文彻底改变了 Shelly 设备管理,为初学者和高级用户提供更新、高效且功能丰富的解决方案。您将发现新的 ShellyCom2 功能,例如使用 PropertyDescriptor 进行属性操作,以及一组有价值的帮