他又来了,.net开源智能家居之小米米家的c#原生sdk【MiHome.Net】1.0.0发布,快来打造你的私人智能家居吧

net,sdk,mihome · 浏览次数 : 0

小编点评

**名称:** * moonLight * cp5pro * xiaoAi **设备规格:** * moonLight * cp5pro * xiaoAi **服务:** * switch **属性:** * moonLight * Model * Did * Token * Siid * Piid * cp5pro * Did * Aiid * Siid * Piid * xiaoAi * Did * Aiid * Siid * Piid **操作:** * moonLight.Name == "月球灯" 获取设备名称为 "月球灯" 的设备 * moonLight.Model 获取设备规格的型号 * moonLight.LocalIp 获取设备的IP地址 * moonLight.Token 获取设备的登录 token * moonLight.CallActionAsync 获取服务方法 * cp5pro.Model 获取设备规格的型号 * cp5pro.Did 获取设备的 Did * cp5pro.Token 获取设备的登录 token * cp5pro.CallActionAsync 获取服务方法 * xiaoAi.Model 获取设备规格的型号 * xiaoAi.Did 获取设备的 Did * xiaoAi.Token 获取设备的登录 token * xiaoAi.CallActionAsync 获取服务方法

正文

背景介绍

hi 大家好,我是三合,作为一个非著名懒人,智能家居简直刚需,在上一篇文章 他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧 中有靓仔提到,没有苹果设备,有一说一,苹果手机很贵,并且原生支持苹果HomeKit的智能家居设备也很贵,同时没几款可选的,还是米家的智能家居设备性价比更高同时品类更丰富,作为一个资深米粉,手机从红米note到小米6,小米8,再到小米10,接着如今全屋智能家居基本都是米家的,我对小米可谓爱的深沉,欢迎大家选购智能家居设备的时候优先选择小米,因为他真的很棒(手动狗头,雷军义父,请打钱谢谢)。但米家也有缺点,那就是米家并没有提供c#的sdk让我们能原生调用api,只能通过米家app操控设备,没有api这可玩性就太低了,神说:要有光,于是我今天便带着[MiHome.Net]来了,这个库主要参考了python的【python-miio】和【hass-xiaomi-miot】这2个项目。有了原生api就有了无限可能,大家可以尽情的发挥想象力去搞事了,接下来,我将介绍他的用法。

米家中的一些基本概念

米家中每一个智能家居设备称为一个设备(Device),每个设备拥有多个服务(Services),每个服务又有多个属性(Property)以及(0-N)个方法(Action,大家把方法理解为封装好的函数即可,我们可以直接调用方法来完成一些操作),所有设备都有设备信息服务,这个服务里包含了多个基本属性,包括设备型号,设备制造商,设备序列号等,并且设备根据功能还有另外一些独有的服务,我们以一个开关为例,开关本身就是一个设备,他拥有一个服务叫Switch,这个服务下面,有一个属性叫Switch Status,也就是开关,我们给这个属性赋值true,就代表开,赋值false,就代表关,同时米家设备支持2种操控方式,基于云端和基于本地,这两者的主要区别就在于云端需要设备以及手机有互联网连接,用户的操作指令是先发送到小米服务器,然后小米服务器下达指令给到智能设备,而基于本地则不同,他是直接通过ip和token,将指令发送给智能设备,这个过程,只需要局域网即可。所有米家智能家居设备都支持云端操作,但不是所有设备都支持本地操作,主要看设备情况。

MiHome.Net存在的意义

使用本依赖包,用户可以通过云端或者本地的方式用c#原生api来操作米家智能家居设备。

Getting Started

Nuget

接下来我将演示如何使用【MiHome.Net】,你可以运行以下命令在你的项目中安装 MiHome.Net 。

PM> Install-Package MiHome.Net

支持框架

net 6,net 8

api使用讲解

本库基于依赖注入,首先新建一个控制台应用,引入MiHome.Net的nuget包,接着添加小米米家的驱动服务,需要配置米家账号和密码,代码如下:

 var hostBuilder = Host.CreateDefaultBuilder();
 //添加小米米家的驱动服务,需要小米账号和密码
 hostBuilder.ConfigureServices(it => it.AddMiHomeDriver(x =>
 {
     x.UserName = "<这里填写米家账号>";
     x.Password = "<这里填写米家米家>";
 }));
 var host = hostBuilder.Build();
 var miHomeDriver = host.Services.GetService<IMiHomeDriver>();

获取到米家驱动服务以后,我们首先通过云端的方式调用接口,列出家庭里所有的智能家居设备,接着通过米家app里自己设置的设备名称找出自己想要操作的智能家居设备,我这里演示的是一个【米家智能插座2】,米家智能插座2
我将3D打印出来的月球灯连到了这个插座上,并在米家app里将这个插座命名为月球灯,这样就将月球灯接入了智能家居。继续讲解api,接下来通过设备型号获取设备规格,这一步的目的,主要是了解我们要操作的智能家居设备都有哪些服务,哪些方法,哪些属性,并获得它们的id,因为我们操作智能家居需要用到设备id(即did),服务id(即siid),属性id(即piid),方法id(即aiid),代码如下:

  //列出家庭里所有的智能家居设备
  var deviceList = await miHomeDriver.Cloud.GetDeviceListAsync();
  //通过米家app里自己设置的智能家居名称找出自己想要操作的智能家居设备
  var moonLight = deviceList.FirstOrDefault(it => it.Name == "月球灯");
  //通过设备型号获取设备规格
  var result = await miHomeDriver.Cloud.GetDeviceSpec(moonLight.Model);

我这里将获取到的规格结果截图出来给大家讲解一下
设备规格讲解
从上图中可以看到,这个设备总共有8个服务,逐一点开后我发现我只需要了解switch服务(即开关服务)即可,它的iid为2(即siid为2),同时这个服务下有3个属性,逐一点开查看后我发现,我只需要了解Switch Status属性即可,他的iid为1(即piid为1),同时这个属性值的格式(Format)是bool类型,即这个属性值只能为true或者false,接下来我将演示如何获取开关状态,代码如下:

 //通过本地方式获取属性值
 var r1 = await miHomeDriver.Local.GetPropertyAsync(moonLight.LocalIp, moonLight.Token, new GetPropertyPayload()
 {
     Siid = 2,
     Piid = 1
 });
 //通过云端方式获取属性值
 var r7 = await miHomeDriver.Cloud.GetPropertyAsync(new GetPropertyDto()
 {
     Did = moonLight.Did,
     Siid = 2,
     Piid = 1
 });

如上代码所示,支持本地以及云端的方式获取属性值,本地获取的方式需要传入智能家居设备的ip,智能家居设备的token,这两者都是之前通过云端设备接口GetDeviceListAsync返回的,以及参数siid和piid,这两者是我们之前通过查看设备规格获得的,通过云端的方式获取属性值,则额外需要did(即设备id),它同样是通过云端设备接口GetDeviceListAsync返回的,本地或云端调用后我们就获取到了开关当前的状态,调用结果如下图,value值为false,即代表开关当前处于关闭状态
本地调用获取属性值
云端调用获取属性值

接下来我将演示如何设置开关状态,代码如下:

 //通过本地方式设置属性值
 var r2 = await miHomeDriver.Local.SetPropertyAsync(moonLight.LocalIp, moonLight.Token, new SetPropertyPayload()
 {
     Siid = 2,
     Piid = 1,
     Value = true
 });

 //通过云端方式设置属性值
 var r8 = await miHomeDriver.Cloud.SetPropertyAsync(new SetPropertyDto()
 {
     Did = moonLight.Did,
     Siid = 2,
     Piid = 1,
     Value = true
 });

如上代码所示,支持本地以及云端的方式设置属性值,参数和获取属性值差不多,只是多了一个value参数,代表我们要设置的值,这里根据设备规格中format为bool,我们将它设置为true,即代表开。同时这些操作也支持批量获取和批量设置,代码如下

  //通过本地方式批量获取属性值
  var r3 = await miHomeDriver.Local.GetPropertiesAsync(moonLight.LocalIp, moonLight.Token, new List<GetPropertyPayload>(){new GetPropertyPayload()
  {
      Siid = 2,
      Piid = 1
  }});

  //通过云端方式批量获取属性值
  var r5 = await miHomeDriver.Cloud.GetPropertiesAsync(new List<GetPropertyDto>()
  {
      new GetPropertyDto()
      {
          Did = moonLight.Did,
          Siid = 2,
          Piid = 1
      }
  });

  //通过本地方式批量设置属性值
  var r4 = await miHomeDriver.Local.SetPropertiesAsync(moonLight.LocalIp, moonLight.Token, new List<SetPropertyPayload>(){new SetPropertyPayload()
  {
      Siid = 2,
      Piid = 1,
      Value =true
  }});


  //通过云端方式批量设置属性值
  var r6 = await miHomeDriver.Cloud.SetPropertiesAsync(new List<SetPropertyDto>()
{
    new SetPropertyDto()
    {
        Did = moonLight.Did,
        Siid = 2,
        Piid = 1,
        Value = true
    }
});

接下来我给大家演示如何通过云端或者本地的方式调用设备服务里的方法,因为米家智能插座2没啥方法可以调用,所以我将使用【Gosund智能排插CP5 Pro】和【小爱音箱Play增强版】来给大家演示调用,先来【Gosund智能排插CP5 Pro】,这个排插长这样
Gosund智能排插CP5 Pro
他上面的4个插座都支持独立控制,我个人非常喜欢,强烈推荐(手动狗头,厂家打钱!),接下来我将演示调用4个插座其中插座3的方法来控制插座3的开关,
和上面一样,我们首先查规格,代码如下

var cp5pro = deviceList.FirstOrDefault(it => it.Name == "Gosund智能排插CP5 Pro");
var result3 = await miHomeDriver.Cloud.GetDeviceSpec(cp5pro.Model);

获得的规格如下图
Gosund智能排插CP5 Pro规格
如上图可以看出,插座3有一个方法(即action)叫toggle,这个方法主要就是改变插座3当前的状态,如果原来是关,调用即为开,如果原来是开,调用即为关,同时iid为1(即aiid为1),服务id为5(即siid为5),入参in为空数组,即不需要传入参数,out也为空数组,表示调用没有返回,不多说了,上代码:

//使用云端方式调用Gosund智能排插CP5 Pro中4个开关中第3个开关的toggle方法
var r11 = await miHomeDriver.Cloud.CallActionAsync(new CallActionInputDto()
{
    Did = cp5pro.Did,
    Aiid = 1,
    Siid = 5,
    In = new List<string>() { }
});

//使用本地方式调用Gosund智能排插CP5 Pro中4个开关中第3个开关的toggle方法
var r10 = await miHomeDriver.Local.CallActionAsync(cp5pro.LocalIp, cp5pro.Token, new CallActionPayload()
{
    Siid = 5,
    Aiid = 1,
    In = new List<string>() {  }
});

如上代码所示,和设置/获取属性不同,调用方法是通过服务id(即siid)和方法id(即aiid)以及入参in来实现的。
接下来演示调用【小爱音箱Play增强版】的服务方法来播放自定义文本,先上图
小爱音箱Play增强版
和上面一样,我们首先查规格,代码如下

var xiaoAi = deviceList.FirstOrDefault(it => it.Name == "小爱音箱Play增强版");
var result2 = await miHomeDriver.Cloud.GetDeviceSpec(xiaoAi.Model);

获得的规格如下图
小爱音箱Play增强版规格

如上图可以看出,小爱音箱有一个方法(即action)叫Play Text,这个方法用来播放自定义语音,同时iid为3(即aiid为3),服务id为5(即siid为5),入参in为数组,需要传入一个参数,即我们的自定义文本,out为空数组,表示调用没有返回,同时这个方法只支持云端调用,不支持本地调用,为啥我知道?因为我试过了,本地方法没反应,这个应该是需要服务器把文本转为语音,再回传到小爱音箱来播放,不多说了,上代码:

 //使用小爱音箱Play增强版播放我们的自定义文字
 var r9 = await miHomeDriver.Cloud.CallActionAsync(new CallActionInputDto()
 {
     Did = xiaoAi.Did,
     Aiid = 3,
     Siid = 5,
     In = new List<string>() { "门前大桥下,游过一群鸭" }
 });

开源地址,欢迎star

本项目基于MIT协议开源,地址为
https://github.com/TripleView/MiHome.Net

同时感谢以下项目

  1. python-miio

  2. hass-xiaomi-miot

写在最后

如果各位靓仔觉得这个项目不错,欢迎一键三连(推荐,star,关注),有了【MiHome.Net】和【Homekit.Net】,想必各位靓仔应该能自己写程序将米家智能家居设备桥接到HomeKit生态里去了,反正我自己已经用了很久了,然后希望大家不要过于频繁的进行云端调用,以免对米家服务器造成不良影响。如果你也对智能家居很感兴趣,欢迎添加我的vx,hezp666。

与他又来了,.net开源智能家居之小米米家的c#原生sdk【MiHome.Net】1.0.0发布,快来打造你的私人智能家居吧相似的内容:

他又来了,.net开源智能家居之小米米家的c#原生sdk【MiHome.Net】1.0.0发布,快来打造你的私人智能家居吧

背景介绍 hi 大家好,我是三合,作为一个非著名懒人,智能家居简直刚需,在上一篇文章 他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧 中有靓仔提到,没有苹果设备,有一说一,苹果手机很贵,并且原生支持苹果Hom

上周热点回顾(4.22-4.28)

热点随笔: · 上架即封神!3.6k Star 的开源游戏模拟器,Delta 冲上 App Store 免费榜 (削微寒)· DDD领域驱动设计总结和C#代码示例 (Eric zhou)· 见鬼了!我家的 WiFi 只有下雨天才能正常使用... (米开朗基杨)· 他又来了,.net开源智能家居之小米

Solution -「ARC 106E」Medals

Desc. Link. 你有 \(n\) 个朋友,他们会来你家玩,第 \(i\) 个人 \(1...A_i\) 天来玩,然后 \(A_i+1...2A_i\) 天不来,然后 \(2A_i+1...3A_i\) 又会来,以此类推; 每天你会选一个来玩的人,给他颁个奖,如果没人来玩,你就不颁奖。 你要给

B 站和小红书又又又崩了,罪魁祸首竟然又是他。。。

大家好,我是凌晨。 今天上午10点左右,我打开B站发现无法刷新视频列表和评论区,收藏夹和弹幕也均不可用。 原以为是手机网络问题,换网络重启手机都还是不行,第一时间打开微博,果然,B站崩了的新闻荣登榜首,小红书崩了的新闻也紧随其后。 不过,一般情况下,像这种大规模平台的这么多功能一起崩溃了显然是不太对

记一次 .NET 某餐饮小程序 内存暴涨分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序内存异常高,用 vs诊断工具 加载时间又太久,让我帮忙看一下到底咋回事,截图如下: 确实,如果dump文件超过 10G 之后,市面上那些可视化工具分析起来会让你崩溃的,除了时间久之外这些工具大多也不是用懒加载的方式,比如 dotmemory 会

声音好听,颜值能打,基于PaddleGAN给人工智能AI语音模型配上动态画面(Python3.10)

借助So-vits我们可以自己训练五花八门的音色模型,然后复刻想要欣赏的任意歌曲,实现点歌自由,但有时候却又总觉得少了点什么,没错,缺少了画面,只闻其声,却不见其人,本次我们让AI川普的歌声和他伟岸的形象同时出现,基于PaddleGAN构建“靓声靓影”的“懂王”。 PaddlePaddle是百度开源

搞懂设计模式——代理模式 + 原理分析

举个栗子,众所周知,我们是可以在京东上购买机票的。 但机票是航司提供的,我们本质上是代理销售而已。 那为什么航司要让我们代理销售呢? 我们又是如帮他做代理的呢? 别急,本文将展开说说他们之间的关系。。。

Blazor Server 发起HttpPost请求,但是多参数

一、介绍 今天突然想起之前工作上遇到的一个问题,在做Blazor 开发时后端给的一个接口请求方式是Post ,但是他需要携带多个参数,新建一个公共类又觉得麻烦,我就尝试着怎么在Post请求中携带多个参数,由于接触Asp .Net Core 的时间不够长,所以这些都不是太了解, 今天写下这篇文章做个记

.NET周刊【4月第2期 2024-04-21】

国内文章 他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧 https://www.cnblogs.com/hezp/p/18142099 三合是一位不喜欢动态编程语言的开发者,对集成米家智能家居到苹果Home

[转帖]word 字号 与 px pt 对应关系

零一 ​关注他 3 人赞同了该文章 字号word pointpixel (96dpi)毫米 初号 42pt 56px 14.82mm 小初 36pt 48px 12.70mm 一号 26pt 34.7px 9.17mm 小一 24pt 32px 8.47mm 二号 22pt 29.3px 7.76m