用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
2019-10-16 00:44:57 SchumyHao ioBroker开发者 楼主 0138
本文为SchumyHao原创文章,未经许可,严禁转载!
如经许可转载时务必注明原作者SchumyHao及原始链接,并注明“发表于ioBroker中国”,转载不得对作品进行修改。 https://bbs.iobroker.cn/thread-357-1-1.html

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

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

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

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

不过总胜过没有方法吧。

背景知识

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

步骤

  1. 在Script Engine打开setObject选项
    enable_setObject.png

  2. 创建一个blockly自动化

  3. 导入教程后面的块
    importfunction.png

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

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

  6. 保存并运行自动化
    run.png

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

需要值转换

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

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

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



[HTML] 纯文本查看 复制代码
<block xmlns="http://www.w3.org/1999/xhtml" type="procedures_defcustomreturn" id="_MoqmX+Bu,vXrvqPm|N=" x="12.54296875" y="12.3046875">
  <mutation statements="false">
    <arg name="NewObjName" varid="8da905//V9RS@L.Y0bnb"></arg>
    <arg name="WriteObject" varid="-`u(~51E7Rizl*4OVod2"></arg>
    <arg name="WriteValConvert" varid="S7Mg{uq-)1*~)zC=%,f@"></arg>
    <arg name="ReadObject" varid="|a2x{*j7U:rgW*$3_QD6"></arg>
    <arg name="ReadValConvert" varid="z)6KAQT]~MXr|*0.Nrsy"></arg>
  </mutation>
  <field name="NAME">TwoObjsToOne</field>
  <field name="SCRIPT">ZnVuY3Rpb24gY29udmVydE9iaihOZXdPYmpOYW1lLCBXcml0ZU9iamVjdCwgV3JpdGVWYWxDb252ZXJ0LCBSZWFkT2JqZWN0LCBSZWFkVmFsQ29udmVydCkgewogICAgb24oe2lkOiBSZWFkT2JqZWN0LCBjaGFuZ2U6ICJuZSJ9LCBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgbGV0IHZhbHVlID0gb2JqLnN0YXRlLnZhbAogICAgICAgIGlmIChSZWFkVmFsQ29udmVydCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgdmFsdWUgaGVyZQogICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbigndmFsJywgJ3JldHVybiAnICsgUmVhZFZhbENvbnZlcnQpOwogICAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jKHZhbHVlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCByZWFkIGZ1bmN0aW9uICR7UmVhZFZhbENvbnZlcnR9IGZvciB2YWwgJHt2YWx1ZX0gPT4gJHtlfWApOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0U3RhdGUoTmV3T2JqTmFtZSwgdmFsdWUpOwogICAgfSk7CiAgICBvbih7aWQ6IE5ld09iak5hbWUsIGNoYW5nZTogIm5lIn0sIGZ1bmN0aW9uIChvYmopIHsKICAgICAgICBsZXQgdmFsdWUgPSBvYmouc3RhdGUudmFsCiAgICAgICAgaWYgKFdyaXRlVmFsQ29udmVydCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgdmFsdWUgaGVyZQogICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbigndmFsJywgJ3JldHVybiAnICsgV3JpdGVWYWxDb252ZXJ0KTsKICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuYyh2YWx1ZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgcmVhZCBmdW5jdGlvbiAke1dyaXRlVmFsQ29udmVydH0gZm9yIHZhbCAke3ZhbHVlfSA9PiAke2V9YCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRTdGF0ZShXcml0ZU9iamVjdCwgdmFsdWUpOwogICAgfSk7Cn0KCmNyZWF0ZVN0YXRlKE5ld09iak5hbWUsIGZ1bmN0aW9uICgpIHsKICAgIGNvbnZlcnRPYmooTmV3T2JqTmFtZSwgV3JpdGVPYmplY3QsIFdyaXRlVmFsQ29udmVydCwgUmVhZE9iamVjdCwgUmVhZFZhbENvbnZlcnQpOwp9KTsKCnJldHVybiAwOw==</field>
  <comment pinned="false" h="80" w="160">将两个状态合并成一个状态
NewObjName: 新状态名字
WriteObject:用于写操作的原始状态
WriteValConvert: 如果需要写状态前先进行值转换,设置转换代码。
ReadObject:用于读操作的原始状态
ReadValConvert: 如果需要读状态后再进行值转换,设置转换代码。

转换代码格式:
传入值名字是 val
字符串必须双引号
例子:
将bool转换为字符串:val? "ON": "OFF"
将字符串转换为bool:val=="ON"
  </comment>
</block>

使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册