lifx灯泡的简单脚本解释器

bardolph的Python项目详细描述


巴道夫

阿尔·丰特斯-bardolph@fontes.org

bardolph是控制lifx灯的设施 通过简单的脚本语言。它是针对那些想 自动控制或试验他们的灯,但谁不 想学习编程语言或API。

我的目的也是让代码可以在其他python程序中使用。一 解析器和虚拟机的目标是通过 相当简单的入口。

程序不使用Internet 访问灯泡,不需要登录;它的所有通信都会发生 通过本地WiFi网络。您可以使用基本文本编辑器编辑脚本,然后 从命令行运行。

该项目严重依赖于lifxlan 访问灯泡的python库。你需要为代码安装它 在这个项目中运行。

这种语言缺少了很多你可能会想到的东西,因为它仍然 正在开发中。但是,它也非常简单,应该是可用的 非程序员。

灯泡脚本

脚本是一个纯文本文件,其中所有空格都是等效的。你可以 如果需要,可以使用制表符将其格式化,或者将整个脚本放在一行。 注释以""字符开头,并一直到行的末尾。所有 关键字在小写文本中。脚本文件名的扩展名为".ls", 意思是"灯泡脚本"。

基本知识

要设置一个或多个灯光的颜色,虚拟机将发送 灯泡的四个参数(色调、饱和度、亮度和开尔文)。

下面是一个示例:

# comment
hue 1200 # red
saturation 65500
brightness 40000
kelvin 2700
set all
on all

此脚本设置所有已知灯光的颜色,并将其全部打开。这个 数值的含义,以及灯光是如何处理它们的 通过lifx局域网协议

任何从未指定默认值为零的值,或空字符串。这会导致 以获得不需要的结果,因此每个值至少应在之前设置一次 设置任何灯光的颜色。

如果第二次未指定某个值,则会再次使用前一个值。 例如,下面使用相同的数字表示饱和度、亮度, 以及开尔文:

hue 20000 saturation 65500 brightness 45000 kelvin 2700 set all
hue 40000 set all

此脚本将:

  1. 将所有灯设置为HSBK 20000、65500、45000、2700
  2. 将所有灯设置为HSBK 40000、65500、45000、2700
  3. < > >

    单个灯

    脚本可以按名称控制各个灯光。例如,如果你有一盏灯 命名为"table",您可以设置其颜色:

    hue 20000 saturation 65500 brightness 45000 kelvin 2700
    set "Table"
    

    灯光名称必须用引号括起来。它们可以包含空格,但可以 不包含换行符。例如:

    # Ok
    on "Chair Side"
    
    # Error
    on "Chair
    Side"
    

    如果一个脚本提到了一个没有被发现或是其他的光的名字 不可用,将错误发送到日志,并执行脚本 继续。

    电源命令

    打开或关闭灯光的命令与颜色命令类似:

    off all
    on "Table"
    

    这将关闭所有的灯,并打开名为"table"的灯。

    "开"和"关"命令对灯光的颜色没有影响。 当"on"执行时,每个灯都会有它的颜色 它被关掉了。如果灯已经打开或关闭,则 冗余电源操作将不起作用,尽管它将被发送 到灯泡。

    定时颜色变化

    脚本可以包含时间延迟和持续时间,这两个都可以表示为 以毫秒为单位。一个时间延迟指定了等待之前的时间量 向灯光发送下一个命令。传递持续时间值 到灯泡,其解释通过lifx api定义。

    例如:

    off all time 5000 duration 2000 on all off "Table"
    

    这将:

    1. 立即关闭所有灯。
    2. 等待5000毫秒。
    3. 打开所有灯,在2000毫秒内加大功率。
    4. 再次等待5000毫秒。
    5. 关掉"桌子"灯,用2000毫秒把它调暗到 黑暗。
    6. < > >

      如上所述,使用timeduration的现有值 每一个命令。在本例中,仅设置时间 一次,但每次操作之间都会有相同的延迟。

      如果要同时设置多个灯光,可以使用

      time 1000 on "Table" and "Chair Side"  # Uses "and".
      

      此脚本将:

      1. 等待1000毫秒。
      2. 同时打开两个灯
      3. < > >

        将此与:

        time 1000 on "Table" on "Chair Side"   # Does not use "and".
        

        此脚本将:

        1. 等待1000毫秒。
        2. 打开名为"table"的灯。
        3. 等待1000毫秒。
        4. 打开名为"椅子边"的灯。
        5. < > >

          关键字与设置打开关闭一起工作。当多个灯光 通过这种方式指定,解释器尝试在 一次,每次之间(理论上)没有延迟。

          如何测量时间

          需要注意的是,延迟时间的计算是基于 剧本开始了。延误不是根据完工情况计算的 上一条指令的时间。

          例如:

          time 2000
          on all
          # Do a lot of slow stuff.
          off all
          

          "关闭"指令将在 脚本已启动,"关闭"指令从该启动开始4秒 时间,

          如果脚本的一部分需要很长时间才能执行,则等待时间可能会过去 在虚拟机为下一条指令做好准备之前。在这种情况下 指令执行没有任何计时器延迟。如果延迟时间也是 简而言之,程序将继续执行 尽可能快地说明。

          暂停按键

          脚本可以等待按键,而不是使用定时延迟。为了 例如,要模拟手动红绿灯:

          # comment
          hue 1200 # red
          saturation 65500
          brightness 40000
          kelvin 2700
          set all
          on all
          
          0

          此脚本将:

          1. 将所有灯光设置为绿色(色调23000)。
          2. 等待用户按键。
          3. 将所有灯设置为黄色(9000)。
          4. 等待按键。
          5. 将灯转为红色(63800)。
          6. < > >

            脚本可以包含暂停和定时延迟。停顿之后 计时器已重置。

            组和位置

            setonoff命令可应用于组和位置。 例如,如果您有一个名为"客厅"的位置,您可以设置它们 全部相同颜色:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            1

            继续相同的示例,还可以设置 "阅读灯"组:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            2

            定义

            符号可以定义为包含常用名称或数字:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            3

            定义可参考其他现有符号:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            4

            检索当前颜色

            get命令从灯泡中检索当前设置:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            5

            此脚本检索色调饱和度亮度的值, 以及"台灯"灯泡上的开尔文。然后 仅覆盖色调。然后,设置命令将所有灯光设置为 结果颜色。

            可以检索所有灯光或组成员的颜色 或地点。在这种情况下,每个设置都是 灯。例如:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            6

            这将从该组中的所有灯光获取平均色调,然后 在任何后续的设置操作中使用的色调。同样的计算是在 饱和度、亮度和开尔文也一样。

            运行脚本

            从命令行运行脚本:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            7

            在此上下文中,"name"包含脚本的名称。这相当于:

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            8

            可以按顺序运行多个脚本。如果指定m不止一个 命令行,它将按顺序提示它们并按顺序执行它们。 例如,

            # comment
            hue 1200 # red
            saturation 65500
            brightness 40000
            kelvin 2700
            set all
            on all
            
            9

            将运行light.ls,完成后,执行dark.ls

            选项

            命令行标志可以修改脚本的运行方式。例如:

            hue 20000 saturation 65500 brightness 45000 kelvin 2700 set all
            hue 40000 set all
            
            0

            可用选项有:

            1. -r或--repeat:无限期重复脚本,直到按下ctrl-c。
            2. -v或--verbose:运行时生成完整的调试输出。
            3. -F或——假的:不要在真正的灯光下操作。相反,使用"假"灯光 只需将输出发送到stdout。这有助于调试和测试。
            4. < > >

              使用-f选项,将有5个伪灯光,并且它们的名称被固定为 "桌子"、"顶部"、"中间"、"底部"和"椅子"。两个假组织是 提供"杆子"和"桌子"。一个名为"home"的位置包含所有 还有假灯光。

              其他程序

              有些实用程序python程序可以从命令行运行。 在任何平台上运行的每个脚本都有一个小脚本 能够执行bash脚本,通常是macos和linux系统。所有的 必须从安装bardolph的目录运行这些命令。

              lsc-灯泡脚本编译器

              这相当于python-m controller.lsc。语法是 lsc name.ls。只能提供一个文件名。

              缩写lsc代表"灯泡脚本编译器"。这个元编译器 生成一个python文件,该文件包含 脚本,在名为\u generated\uuuuu.py的文件中。生成的文件可以运行 与其他python模块一样,从命令行执行以下操作:

              hue 20000 saturation 65500 brightness 45000 kelvin 2700 set all
              hue 40000 set all
              
              1

              生成的python模块仍然依赖于bardolph运行时代码,并且 需要从同一目录执行。

              如果要在自己的python代码中使用此模块,可以导入 并调用函数run_script()。但是,因为模块不是 完全独立的,Bardolphlibcontroller模块 需要在运行时导入。

              生成的程序有两个选项:

              1. -f--赝品:不要访问灯光,而是使用 只需将输出发送到日志。
              2. -d--调试:使用调试级别日志记录。
              3. < > >

                例如,在生成python程序之后:

                hue 20000 saturation 65500 brightness 45000 kelvin 2700 set all
                hue 40000 set all
                
                2

                这不会影响任何物理灯光,但会将文本发送到屏幕 指示脚本将执行的操作。

                快照

                snapshot命令是一个bash脚本,它等价于 python-m controller.snapshot

                此程序捕获灯光的当前状态并生成 请求的输出类型。默认输出是一个可读的列表 灯光。

                输出的性质由命令行选项决定。这些是 最有趣的是:

                1. -s:将灯光脚本输出到stdout。如果将输出保存到文件中 作为脚本运行,它会将灯光恢复到相同的状态, 包括颜色和功率。
                2. -t:将文本输出到stdout,在所有已知的 灯泡、组和位置。
                3. -p:基于 已知的鳞茎。结果文件与生成的输出非常相似 通过lsc命令,并且可以使用python-m\uuu generated\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu/code>运行
                4. < > >

                  系统要求

                  该程序已经在python 3.5.1和3.7.3版本上进行了测试。我没试过 但我几乎可以肯定它不会在任何2.x版本上运行。

                  我没有做任何压力测试,所以我不知道有什么限制 脚本大小。注意,应用程序将整个脚本加载到内存中 继续执行。

                  <我已经在MacOS 10.14.5、Debian Linux Stretch和 2019年6月,释放拉斯宾。对我来说,在树莓皮零W上效果很好。

                  缺少功能

                  这些是我将要研究的缺失特性之一 此优先级:

                  1. 控制流,如循环、分支和子例程。
                  2. 数学表达式。
                  3. 支持非灯泡设备。
                  4. < > >

                    项目名称来源

                    bardolph是 以圆鼓鼓的鼻子闻名。

                    欢迎加入QQ群-->: 979659372 Python中文网_新手群

                    推荐PyPI第三方库


热门话题
解释java选择方法   连接到127.0.0.1的java间歇性故障,连接到IP(eth0)时没有故障   java如何优雅地杀死hadoop作业/intercept`hadoop作业杀死`   java如何通过引导类加载器以编程方式加载另一个类?   url Java:在查询参数之前使用片段构建URI   在BroadLeaf表blc_order_属性中保存OrderAttributes值时发生java错误   安卓将功能从xml转换为java   java如何将数据写入文件?   java JPA SQL结果映射   Java中整数对象比较运算符的引用安全性   Spring测试失败:java。lang.NoClassDefFoundError:org/springframework/cglib/transform/impl/memorysafuendecaredthrowableStrategy   rich:extendedDataTable中的java行选择和数据处理   java为什么我需要在volatile上对多个线程使用synchronized?   java尽管构建成功,但为什么会出现此错误?   数组$ArrayList不能转换为java。util。java中的ArrayList   java如何根据泛型类型调用方法?   java将JLabel添加到JPanel,将JPanel添加到JFrame   如果MapStruct中的源为null,则java将父目标设置为null   JavaJBossDrools从DRL插入事实   java不同的JRE安装(windows)