class DeviceActionProvider implements SceneActionProvider<DeviceAction> {
    public static final String PROVIDER = "device";

    private final ThingsRegistry registry;

    @Override
    public String getProvider() {
        return DeviceActionProvider.PROVIDER;
    }

    @Override
    public DeviceAction newConfig() {
        return new DeviceAction();
    }

    @Override
    public List<String> parseColumns(DeviceAction config) {

        return config.parseColumns();
    }

    @Override
    public Flux<Variable> createVariable(DeviceAction config) {
        return config
            .getDeviceMetadata(registry, config.getProductId())
            .as(LocaleUtils::transform)
            .flatMapIterable(config::createVariables);
    }

    @Override
    public void applyRuleNode(DeviceAction device, RuleNodeModel model) {<FILL_FUNCTION_BODY>}
}

        DeviceMessageSendTaskExecutorProvider.DeviceMessageSendConfig config = new DeviceMessageSendTaskExecutorProvider.DeviceMessageSendConfig();

        config.setMessage(device.getMessage());

        if (DeviceSelectorProviders.isFixed(device)) {
            config.setSelectorSpec(FastBeanCopier.copy(device, new DeviceSelectorSpec()));
        } else {
            config.setSelectorSpec(
                DeviceSelectorProviders.composite(
                    //先选择产品下的设备
                    DeviceSelectorProviders.product(device.getProductId()),
                    FastBeanCopier.copy(device, new DeviceSelectorSpec())
                ));
        }

        config.setFrom("fixed");
        config.setStateOperator("direct");
        config.setProductId(device.getProductId());

        model.setExecutor(DeviceMessageSendTaskExecutorProvider.EXECUTOR);
        model.setConfiguration(config.toMap());
    
<no_super_class>