用Ansible来控制电风扇

※注意:以下内容可能含有岔。

让孩子在暑假期间,通过完成作业的同时,也学习Python和Ansible模块。让他们通过Ansible来操作风扇吧。

所需之物

・树莓派
http://akizukidenshi.com/catalog/g/gM-10414/
・红外线LED
http://akizukidenshi.com/catalog/g/gI-11845/
・红外线接收模块
http://akizukidenshi.com/catalog/g/gI-04659/
・跳线线、电阻
・面包板连接套件(有助于电路搭建)
http://akizukidenshi.com/catalog/g/gK-08892/

请注意,目前秋月电子公司正在放暑假,这些将会被准备好。

安装Ansible。

将Raspbian烧录到SD卡并启动。
设置固定IP后,使用以下Playbook在树莓派上安装Ansible。


---
- hosts: raspi
  connection: ssh
  become: true
  gather_facts: False

  tasks:
    - name: replace repo
      replace:
        path: /etc/apt/sources.list
        regexp: 'http://raspbian.raspberrypi.org/raspbian/'
        replace: 'http://ftp.jaist.ac.jp/raspbian/'

    - name: install need pack
      apt:
        name: "{{ packages }}"
        state: present
        update_cache: yes
      vars:
        packages:
          - python3-dev
          - python3-crypto
          - libffi-dev
          - libssl-dev

    - name: get-pip.py
      command: wget https://bootstrap.pypa.io/get-pip.py

    - name: pip install
      command: python3 get-pip.py

    - name: pip install ansible
      command: python3 -m pip install ansible

安装Ansible花费了一些时间,但是已经成功安装好了。

root:~/ans # ansible-playbook -i hosts install_ansible_raspi.yml

PLAY [raspi] ***************************************************************************

TASK [replace repo] ********************************************************************
changed: [192.168.0.21]

TASK [install need pack] ***************************************************************
changed: [192.168.0.21]

TASK [get-pip.py] **********************************************************************
 [WARNING]: Consider using the get_url or uri module rather than running wget.  If you
need to use command because get_url or uri is insufficient you can add warn=False to
this command task or set command_warnings=False in ansible.cfg to get rid of this
message.

changed: [192.168.0.21]

TASK [pip install] *********************************************************************
changed: [192.168.0.21]

TASK [pip install ansible] *************************************************************
changed: [192.168.0.21]

PLAY RECAP *****************************************************************************
192.168.0.21               : ok=5    changed=5    unreachable=0    failed=0

root:~/ans #

2.6.2 已经安装成功。

pi@raspberrypi:~ $ ansible --version
ansible 2.6.2
  config file = None
  configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.5/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.5.3 (default, Jan 19 2017, 14:11:04) [GCC 6.3.0 20170124]
pi@raspberrypi:~ $

循环路径

在这种方式下,我们将光敏模块和红外线LED进行如下的布线。

Untitled Sketch_ブレッドボード.png

设置红外线遥控器

根据此页面参考,使用遥控器接收器读取风扇遥控器的信号,并进行命令设置。

在以下的Playbook中,我们将安装lirc并设置/boot/config.txt。

---
- hosts: raspi
  connection: ssh
  become: true
  gather_facts: False

  tasks:
    - name: install lirc
      apt:
        name: lirc
        state: present
        update_cache: yes

    - name: add line config.txt
      lineinfile:
        path: /boot/config.txt
        line: "dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up"

已经设置完毕。

root:~/ans # ansible-playbook -i hosts install_lirc.yml

PLAY [raspi] ***************************************************************************

TASK [install lirc] ********************************************************************
changed: [192.168.0.21]

TASK [add line config.txt] *************************************************************
changed: [192.168.0.21]

PLAY RECAP *****************************************************************************
192.168.0.21               : ok=2    changed=2    unreachable=0    failed=0

root:~/ans #

我将重新启动一次。

pi@raspberrypi:~ $ sudo reboot

再启动后,确认/dev/lirc0的存在以及使用lsmod命令加载了lirc。

pi@raspberrypi:~ $ ls -l /dev/lirc*
crw-rw---- 1 root video 243, 0 Aug 12 14:45 /dev/lirc0
pi@raspberrypi:~ $ lsmod | grep lirc
lirc_rpi               16384  0
lirc_dev               16384  1 lirc_rpi
pi@raspberrypi:~ $ 

按下遥控器并将其对准光电模块进行读取。

pi@raspberrypi:~ $ irrecord -n -d /dev/lirc0 rimokon.conf

将已创建的文件复制到文件夹中。

pi@raspberrypi:~ $ sudo cp senpuuki.lircd.conf /etc/lirc/lircd.conf.d/

编辑设定文件。

pi@raspberrypi:~ $ sudo vi /etc/lirc/lirc_options.conf
11 driver          = default
12 device          = /dev/lirc0

我将启动服务并进行确认。

pi@raspberrypi:~ $ sudo systemctl restart lircd
pi@raspberrypi:~ $ irsend LIST "" ""

devinput
devinput
senpuuki
pi@raspberrypi:~ $ irsend LIST "senpuuki" ""

0000000000000001 off
0000000000000002 on
0000000000000003 up
pi@raspberrypi:~ $

我会通过命令来确认它是否有效。

pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki on
pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki up
pi@raspberrypi:~ $ irsend SEND_ONCE senpuuki off

创建senpuuki模块

如果确认了通过命令运行的功能后,我会尝试将其变成一个模块。
根据查看各个模块的源代码,如果遵守以下规范,应该会很好。

・首先调用未来函数
・写一个叫做ANSIBLE_METADATA的东西,虽然不知道是什么
・从Playbook接收参数
・如果成功,调用exit_json,如果失败,调用fail_json

抱歉,我还没有阅读你提到的文件,哈哈。

最后变成了这样的感觉。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from __future__ import absolute_import, division, print_function
__metaclass__ = type

from ansible.module_utils.basic import AnsibleModule

ANSIBLE_METADATA = {'metadata_version': '1.1',
                    'status': ['stableinterface'],
                    'supported_by': 'community'}

def main():

    module = AnsibleModule(
        argument_spec=dict(
            power_state=dict(type='str', required=True)
        )
    )

    power = module.params['power_state']

    if power == "on":
        cmd = "irsend SEND_ONCE senpuuki on"
    elif power == "up":
        cmd = "irsend SEND_ONCE senpuuki up"
    elif power == "on-up":
        cmd = "irsend SEND_ONCE senpuuki on && irsend SEND_ONCE senpuuki up"
    else:
        cmd = "irsend SEND_ONCE senpuuki off"

    (rc, out, err) = module.run_command(cmd)
    if rc == 0:
        module.exit_json(msg="OK", changed=True)

if __name__ == '__main__':
    main()

只是运行命令的 run_command。
哦…好像没有处理错误…我会在31日之前写好。
因为改变了风扇的状态,所以返回了 changed=True。

将创建的文件放置在/usr/local/lib/python3.5/dist-packages/ansible/modules目录下。
Playbook可以像这样。

---
- hosts: localhost
  connection: local
  gather_facts: False

  tasks:
  - name: 扇風機つけるお
    raspberrypi_senpuuki:
      power_state: on
    register: result

  - debug:
      var: result

我会试一试。

pi@raspberrypi:~/an $ ansible-playbook -i hosts senpuuki.yml

PLAY [localhost] ***********************************************************************

TASK [扇風機つけるお] *************************************************************************
changed: [localhost]

TASK [debug] ***************************************************************************
ok: [localhost] => {
    "result": {
        "changed": true,
        "failed": false,
        "msg": "OK"
    }
}

PLAY RECAP *****************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

pi@raspberrypi:~/an $

我的房间里的风扇打开了。(虽然可能不太清楚,但请传达给你)

使用树莓派来运行Ansible,我十分了解这并不是其原本的用途,
但是我将尝试将其作为成人的自由研究项目,结合电子工程、Python和Ansible玩耍。

结束了。

广告
将在 10 秒后关闭
bannerAds