如何将不同的设备值合并成一个设备值

不同读写值合并为一个状态

好吧,我得承认,这个坑,不填不行了。

本来想等linkeddevice完成这个工作,结果没能完成。
后来大佬官方支持了devices这个插件,也满心欢喜的能支持,最后也是等的黄花菜都凉了半截。

之所以要等,是因为觉得我的方法很麻烦。。。

不过总胜过没有方法吧。

背景知识

  • 看完我的视频系列教程
  • 安装了script engine
  • 一丢丢的nodejs数据类型转换的语法

步骤

  1. 在Script Engine打开setObject选项

  2. 创建一个blockly自动化

  3. 导入教程后面的块

  4. 使用导入的块,添加一个多状态转换的函数实例

  5. 给新的设备状态起一个独一无二的名字,指定写状态值和读状态值。如果需要对状态值转换,也在这里设定。具体参数的含义,点击块的帮助按钮看帮助。

  6. 保存并运行自动化

  7. 指定新的状态的角色,房间和功能。


需要值转换

如果读写状态的值和新创建的值类型不一样,就需要进行值状态的转换。
我举一个80%都会遇到的情况:将布尔值转换为两个字符串,比如“ON”, “OFF”

  1. 首先在写状态转换的参数处,写这样的字符串 val? "ON": "OFF" 这是一个nodejs三目运算,意思是 如果val是真,就返回“ON”,反之返回“OFF”。原始数据就会付给val这个参数,返回的值就是“ON” 或者 “OFF”字符串。
  2. 然后在读状态转换的参数处,写这样的字符串val=="ON" 这就是如果读到的数据是“ON”则返回ture,其他返回false。
  3. 为了让新创建的设备值更完美,我们在设备值的高级设置里面,手动给设备添加可读,可写的属性,并且指定类型为bool。

如果有其他需求,再留言吧。

[mw_shl_code=html,true]







TwoObjsToOne
ZnVuY3Rpb24gY29udmVydE9iaihOZXdPYmpOYW1lLCBXcml0ZU9iamVjdCwgV3JpdGVWYWxDb252ZXJ0LCBSZWFkT2JqZWN0LCBSZWFkVmFsQ29udmVydCkgewogICAgb24oe2lkOiBSZWFkT2JqZWN0LCBjaGFuZ2U6ICJuZSJ9LCBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgbGV0IHZhbHVlID0gb2JqLnN0YXRlLnZhbAogICAgICAgIGlmIChSZWFkVmFsQ29udmVydCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgdmFsdWUgaGVyZQogICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbigndmFsJywgJ3JldHVybiAnICsgUmVhZFZhbENvbnZlcnQpOwogICAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jKHZhbHVlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCByZWFkIGZ1bmN0aW9uICR7UmVhZFZhbENvbnZlcnR9IGZvciB2YWwgJHt2YWx1ZX0gPT4gJHtlfWApOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0U3RhdGUoTmV3T2JqTmFtZSwgdmFsdWUpOwogICAgfSk7CiAgICBvbih7aWQ6IE5ld09iak5hbWUsIGNoYW5nZTogIm5lIn0sIGZ1bmN0aW9uIChvYmopIHsKICAgICAgICBsZXQgdmFsdWUgPSBvYmouc3RhdGUudmFsCiAgICAgICAgaWYgKFdyaXRlVmFsQ29udmVydCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgdmFsdWUgaGVyZQogICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbigndmFsJywgJ3JldHVybiAnICsgV3JpdGVWYWxDb252ZXJ0KTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuYyh2YWx1ZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgcmVhZCBmdW5jdGlvbiAke1dyaXRlVmFsQ29udmVydH0gZm9yIHZhbCAke3ZhbHVlfSA9PiAke2V9YCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRTdGF0ZShXcml0ZU9iamVjdCwgdmFsdWUpOwogICAgfSk7Cn0KCmNyZWF0ZVN0YXRlKE5ld09iak5hbWUsIGZ1bmN0aW9uICgpIHsKICAgIGNvbnZlcnRPYmooTmV3T2JqTmFtZSwgV3JpdGVPYmplY3QsIFdyaXRlVmFsQ29udmVydCwgUmVhZE9iamVjdCwgUmVhZFZhbENvbnZlcnQpOwp9KTsKCnJldHVybiAwOw==
将两个状态合并成一个状态
NewObjName: 新状态名字
WriteObject:用于写操作的原始状态
WriteValConvert: 如果需要写状态前先进行值转换,设置转换代码。
ReadObject:用于读操作的原始状态
ReadValConvert: 如果需要读状态后再进行值转换,设置转换代码。

转换代码格式:
传入值名字是 val
字符串必须双引号
例子:
将bool转换为字符串:val? “ON”: “OFF”
将字符串转换为bool:val==“ON”

[/mw_shl_code]