Flutter智能家居控制插件yeedart的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter智能家居控制插件yeedart的使用

简介

yeedart 是一个用于通过局域网控制Yeelight产品的Dart库。它可以帮助开发者轻松地与Yeelight设备进行交互,实现灯光控制、场景设置等功能。

安装

  1. 依赖安装

    • 使用Dart:
      $ dart pub add yeedart
      
    • 使用Flutter:
      $ flutter pub add yeedart
      

    这将向你的 pubspec.yaml 文件中添加如下依赖(并自动运行 dart pub getflutter pub get):

    dependencies:
      yeedart: ^0.3.2
    
  2. 导入库 在你的Dart代码中,可以使用以下语句导入 yeedart

    import 'package:yeedart/yeedart.dart';
    

使用示例

1. 设备发现

首先,你需要知道设备的IP地址和端口。你可以使用 Yeelight.discover() 方法来发现网络中的Yeelight设备。该方法返回一个包含 DiscoveryResponse 对象的列表。

final responses = await Yeelight.discover();
if (responses.isEmpty) {
  print("没有找到网络中的Yeelight设备");
  return;
}
final response = responses.first; // 或者根据需要过滤

每个 DiscoveryResponse 对象包含设备的IP地址、端口以及其他属性(如名称、固件版本、当前状态等)。你还可以指定发现的超时时间,默认是2秒。

注意:在Android上,设备发现需要授予 INTERNET 权限。

2. 连接到设备

连接到设备后,你可以发送命令来控制灯光。例如,打开灯光、设置颜色、调整亮度等。

final device = Device(
  address: InternetAddress("192.168.1.183"),
  port: 55443,
);

await device.turnOn(); // 打开设备

// 设置红色,平滑过渡
await device.setRGB(
  color: Colors.red,
  effect: const Effect.smooth(),
  duration: const Duration(milliseconds: 500),
);

await device.setBrightness(brightness: 70); // 设置亮度为70%

device.disconnect(); // 完成后断开连接

提示:每次发送命令时,都会自动创建一个新的TCP连接。完成操作后,记得调用 device.disconnect() 断开连接。如果你再次发送命令,会自动重新建立连接。

3. 主灯和背景灯

某些设备配备了两个灯:主灯和背景灯。默认情况下,Device 类中的方法控制的是主灯。如果你想控制背景灯,可以在调用方法时指定 lightType 参数。

// 设置主灯为红色
await device.setRGB(color: Colors.red);

// 设置背景灯为蓝色
await device.setRGB(
  color: Colors.blue,
  lightType: LightType.background,
);

// 同时切换主灯和背景灯
await device.toggle(lightType: LightType.both);

4. 流(Flow)

流(Flow)是一系列颜色过渡的组合。你可以使用 startFlow() 方法启动一个流,并提供一个 Flow 对象。Flow 对象有三个必需参数:count(循环次数)、action(流结束后的动作)和 transitions(过渡列表)。

以下是一个简单的例子,循环显示红、绿、蓝三种颜色:

await device.startFlow(
  flow: const Flow(
    count: 0, // 无限循环
    action: FlowAction.recover(), // 恢复流开始前的状态
    transitions: [
      FlowTransition.rgb(color: 0xff0000, brightness: 100), // 红色
      FlowTransition.sleep(duration: Duration(milliseconds: 500)), // 延迟500毫秒
      FlowTransition.rgb(color: 0x00ff00, brightness: 100), // 绿色
      FlowTransition.sleep(duration: Duration(milliseconds: 500)),
      FlowTransition.rgb(color: 0x0000ff, brightness: 100), // 蓝色
      FlowTransition.sleep(duration: Duration(milliseconds: 500)),
    ],
  ),
);

要手动停止流,可以使用 device.stopFlow()

5. 场景(Scene)

场景允许你将灯光设置为特定的状态。你可以使用 setScene() 方法并提供一个 Scene 对象。

例如,设置灯光为红色且亮度为100%:

await device.setScene(
  scene: Scene.color(color: 0xff0000, brightness: 100),
);

你还可以使用其他类型的场景,如色温模式、自动延迟关闭等。

完整示例Demo

以下是一个完整的示例,展示了如何使用 yeedart 控制Yeelight设备。该示例包括设备发现、连接、控制灯光颜色、亮度以及启动流。

import 'package:yeedart/yeedart.dart';

Future<void> main() async {
  // 1. 发现设备
  final responses = await Yeelight.discover();
  if (responses.isEmpty) {
    print("没有找到网络中的Yeelight设备");
    return;
  }
  final response = responses.first;
  print("发现设备: ${response.name}, IP: ${response.address}, 端口: ${response.port}");

  // 2. 连接到设备
  final device = Device(address: response.address, port: response.port!);

  // 3. 获取设备属性
  final props = await device.getProps(
    id: 1,
    parameters: [
      'name',
      'model',
      'fw_ver',
      'power',
      'color_mode',
      'bright',
      'ct',
      'rgb',
      'hue',
      'sat',
    ],
  );
  print("设备属性: $props");

  // 4. 打开灯光
  await device.turnOn();
  print("灯光已打开");

  // 5. 设置颜色为红色,平滑过渡
  await device.setRGB(
    color: Colors.red,
    effect: const Effect.smooth(),
    duration: const Duration(milliseconds: 500),
  );
  print("灯光已设置为红色");

  // 6. 设置亮度为70%
  await device.setBrightness(brightness: 70);
  print("亮度已设置为70%");

  // 7. 启动颜色流,循环显示红、绿、蓝
  await device.startFlow(
    flow: const Flow(
      count: 0, // 无限循环
      action: FlowAction.recover(), // 恢复流开始前的状态
      transitions: [
        FlowTransition.rgb(color: 0xff0000, brightness: 100), // 红色
        FlowTransition.sleep(duration: Duration(milliseconds: 500)), // 延迟500毫秒
        FlowTransition.rgb(color: 0x00ff00, brightness: 100), // 绿色
        FlowTransition.sleep(duration: Duration(milliseconds: 500)),
        FlowTransition.rgb(color: 0x0000ff, brightness: 100), // 蓝色
        FlowTransition.sleep(duration: Duration(milliseconds: 500)),
      ],
    ),
  );
  print("颜色流已启动");

  // 8. 等待几秒钟后停止流
  await Future<void>.delayed(const Duration(seconds: 10));
  await device.stopFlow();
  print("颜色流已停止");

  // 9. 关闭灯光
  await device.turnOff();
  print("灯光已关闭");

  // 10. 断开连接
  device.disconnect();
  print("已断开连接");
}

更多关于Flutter智能家居控制插件yeedart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter智能家居控制插件yeedart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成并使用yeedart插件来控制智能家居设备,特别是Yeelight品牌的设备,是一个相对直接的过程。yeedart是一个Flutter包,用于与Yeelight设备通信和控制。以下是一个简单的代码示例,展示了如何使用yeedart来发现和控制Yeelight设备。

首先,确保你已经在pubspec.yaml文件中添加了yeedart依赖:

dependencies:
  flutter:
    sdk: flutter
  yeedart: ^最新版本号  # 请替换为当前可用的最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个完整的Flutter应用示例,展示如何使用yeedart

import 'package:flutter/material.dart';
import 'package:yeedart/yeedart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final YeelightController _controller = YeelightController();
  List<Device> _devices = [];
  bool _isDiscovering = false;

  @override
  void initState() {
    super.initState();
    _startDiscovery();
  }

  @override
  void dispose() {
    _stopDiscovery();
    super.dispose();
  }

  Future<void> _startDiscovery() async {
    setState(() {
      _isDiscovering = true;
    });
    try {
      _devices = await _controller.discoverDevices();
    } catch (e) {
      print("Discovery error: $e");
    } finally {
      setState(() {
        _isDiscovering = false;
      });
    }
  }

  Future<void> _stopDiscovery() async {
    // 在这个例子中,我们只是在初始化时开始发现,所以没有特定的停止逻辑
    // 但如果你需要在运行时停止发现,你可能需要实现一些机制来管理发现过程
  }

  Future<void> _turnOnDevice(Device device) async {
    try {
      await device.turnOn();
    } catch (e) {
      print("Failed to turn on device: $e");
    }
  }

  Future<void> _turnOffDevice(Device device) async {
    try {
      await device.turnOff();
    } catch (e) {
      print("Failed to turn off device: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Yeelight Control'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              if (_isDiscovering)
                CircularProgressIndicator(),
              Expanded(
                child: ListView.builder(
                  itemCount: _devices.length,
                  itemBuilder: (context, index) {
                    final device = _devices[index];
                    return Card(
                      child: ListTile(
                        title: Text(device.name ?? 'Unknown Device'),
                        trailing: Row(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            IconButton(
                              icon: Icon(Icons.lightbulb_outline),
                              onPressed: () async {
                                if (await device.isOn()) {
                                  await _turnOffDevice(device);
                                } else {
                                  await _turnOnDevice(device);
                                }
                                setState(() {}); // 更新UI以反映设备状态变化(如果需要)
                              },
                            ),
                          ],
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个YeelightController实例来管理Yeelight设备的通信。
  2. initState方法中,我们启动了设备发现过程。
  3. 发现的设备被存储在_devices列表中,并在UI中显示。
  4. 对于每个设备,我们提供了一个按钮来切换其电源状态。

请注意,这个示例假设你已经正确配置了Yeelight设备,并且它们在你的网络上可用。此外,实际应用中可能需要更复杂的错误处理和状态管理,特别是当你需要处理多个设备或更复杂的操作时。

确保在实际部署前充分测试你的应用,并查看yeedart的文档以获取更多功能和配置选项。

回到顶部