【语音控制】0成本实现小爱远程开关电脑

背景:之前使用HACS/网页版实现了电脑网络唤醒,但不能关机,不支持小爱

问题:不能语音关机,不支持小爱

环境:支持WOL的主板电脑,python 3.X环境(我这里用了群晖)

解法:1.使用小爱添加第三方设备

           2.第三方平台提供API,

          3.找台服务器运行Python脚本虚拟一个开关设备,定义开关触发bash脚本

  • 方案评估:在评估方案时,在网上查资料最终方案为点灯科技 Blinker

  • 系统架构:一番研究后最终系统架构和步骤如下:

  •  Python程序逻辑如下

流程、架构理清了,开始执行:

1.准备python3.X的环境,确保pip3 命令可用,群晖没有PIP3可以装,但是后面很多库、依赖安装出错,最终放弃,我直接使用docker python环境

已经搞好的(包含依赖环境)上传到了:https://hub.docker.com/r/realwang/blinker-wol

 2.在python环境中安装Blinker依赖环境,参考官方教程

  点灯科技-点灯物联网解决方案

3.手机端操作

1.下载个点灯科技APP,注册账户

2. 添加设备-->独立设备-->WIFI接入-->阿里云-->复制key

3. 右上角编辑-->添加按钮-->修改键名为"btn-pc1"类型勾选开关按键

4. 右拉添加个调试组件,锁定退出

4.编写python脚本,确保服务器81端口闲置

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 本代码引用arduino论坛 南岛孤云
# 直接拿去用需要改5处,1,密匙,2,局域网电脑的固定IP,3,电脑ssh用户名,4,电脑ssh密码 5,电脑的MAC地址

from Blinker import Blinker, BlinkerButton, BlinkerNumber, BlinkerMIOT
from Blinker.BlinkerConfig import *
from Blinker.BlinkerDebug import *
from wakeonlan import send_magic_packet
import paramiko
import time
import subprocess

auth = 'xxxxxxxxxx'  # 1,点灯app上获得的密匙

BLINKER_DEBUG.debugAll()

Blinker.mode("BLINKER_WIFI")
Blinker.miotType('BLINKER_MIOT_OUTLET')
Blinker.begin(auth)

staticip = "192.168.1.200"  # 2,电脑局域网固定IP,用于检测电脑开关状态以及利用SSH关机,改为你的设置
pcusr = 'xxxxxx'  # 3,电脑ssh用户名
pcpw = 'xxxxxx'  # 4,电脑ssh密码

pcmac = 'ff.ff.ff.ff.ff.ff'  # 5,MAC地址,改成你自己电脑网卡的

button1 = BlinkerButton("btn-pc1")  # 数据键,在App里设置一个一样的开关,类型为 '开关按键',图标用滑动开关,其他随意,文本可为空
cmd1 = "timeout 0.1 ping -c 1 " + staticip  # 电脑开关检测就是一个局域网内的ping,超时我设置为100ms,貌似太短或太长小爱都容易出错
lockbutton1 = False

oState = ''

def miotPowerState(state):
    ''' '''

    global oState

    BLINKER_LOG('need set power state: ', state)

    oState = state
    BlinkerMIOT.powerState(state)
    BlinkerMIOT.print()
# 小爱控制的实际部分放在上报状态之后,因为电脑开机实际时间很长,小爱等久了她会以为没开
    if state == 'true':
        button1_callback('on')
    elif state == 'false':
        button1_callback('off')

def miotQuery(queryCode):
    ''' '''

    global oState

# 问小爱电脑开了吗,ping一次获得电脑实际状态
    if subprocess.call(cmd1, shell=True)==0:
        oState = 'true'
    else:
        oState = 'false'

    BLINKER_LOG('MIOT Query codes: ', queryCode)

    if queryCode == BLINKER_CMD_QUERY_ALL_NUMBER :
        BLINKER_LOG('MIOT Query All')
        BlinkerMIOT.powerState(oState)
        BlinkerMIOT.print()
    elif queryCode == BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
        BLINKER_LOG('MIOT Query Power State')
        BlinkerMIOT.powerState(oState)
        BlinkerMIOT.print()
    else :
        BlinkerMIOT.powerState(oState)
        BlinkerMIOT.print()

# 关机部分用paramiko的sshclient,不用密码的话可以改用密匙,具体查阅paramiko用法
def shutdownpc():

    global staticip
    global pcusr
    global pcpw

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(staticip, username=pcusr, password=pcpw)
    stdin, stdout, stderr = client.exec_command('shutdown -s -f -c "小爱将在10秒内关闭这个电脑" -t 10')  

    if client is not None:
        client.close()
        del client, stdin, stdout, stderr

# 开关键,集成了开关功能,状态报告给小爱,开关过程中的运行保护,开关后状态的更新。
def button1_callback(state):
    """ """
    global lockbutton1
    global oState
    global pcmac
    dtimeout = 60  # 开关机超时默认60秒

    if lockbutton1==False:
        BLINKER_LOG('get button state: ', state)
        if state=='on':
            if subprocess.call(cmd1, shell=True)==0:
                oState = 'true'
                Blinker.print("检测到电脑已开,按钮状态已更新")
                button1.text('已开机')
                button1.print(state)
            else:
                Blinker.print("发送开机指令...")
                oState = 'true'
                lockbutton1 = True
                tic = time.perf_counter()
                toc = time.perf_counter()
                send_magic_packet(pcmac)  # 发魔术包开机
                while subprocess.call(cmd1, shell=True)!=0 and toc-tic<dtimeout+2:
                    time.sleep(2)
                    toc = time.perf_counter()
                if toc-tic >= dtimeout:
                    Blinker.print("开机超时!")
                    button1.text('已关机')
                    button1.print('off')
                else:
                    button1.text('已开机')
                    button1.print(state)
                lockbutton1 = False
        elif state=='off':
            if subprocess.call(cmd1, shell=True)==0:
                Blinker.print("发送关机指令...")
                oState = 'false'
                lockbutton1 = True
                tic = time.perf_counter()
                toc = time.perf_counter()
                shutdownpc()  # 关机
                while subprocess.call(cmd1, shell=True)==0 and toc-tic<dtimeout+2:
                    time.sleep(2)
                    toc = time.perf_counter()
                if toc-tic >= dtimeout:
                    Blinker.print("关机超时!")
                    button1.text('已开机')
                    button1.print('on')
                else:
                    button1.text('已关机')
                    button1.print(state)
                lockbutton1 = False
            else:
                oState = 'false'
                Blinker.print("检测到电脑已关闭,按钮状态已更新")
                button1.text('已关机')
                button1.print(state)
    else:
        Blinker.print("正在开机或关机中..")

# 心跳加入了电脑状态检测,更新按钮
def heartbeat_callback():

    global oState

    if subprocess.call(cmd1, shell=True)==0:
        oState = 'true'
        button1.text('已开机')
        button1.print("on")
    else:
        oState = 'false'
        button1.text('已关机')
        button1.print("off")

button1.attach(button1_callback)
Blinker.attachHeartbeat(heartbeat_callback)

BlinkerMIOT.attachPowerState(miotPowerState)
BlinkerMIOT.attachQuery(miotQuery)

if __name__ == '__main__':

    while True:
        Blinker.run()

5.运行脚本,如果报错,缺什么补什么

6.电脑安装openssh,ssh测试一下到win10

6.跑起来手机上的设备会显示在线,手动操作开机后用小爱测试下

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 车间自动化系统配合MES的改造有以下要求: 1. 数据采集:车间自动化系统需要具备可靠、高效地采集数据的能力,包括生产过程中的设备状态、生产物料、人员信息等。 2. 数据处理:车间自动化系统需要能够将采集到的数据进行存储、处理和分析,以便为MES系统提供数据支持。 3. 接口标准:车间自动化系统需要支持MES系统所需的数据接口标准,能够将数据按照标准格式传输,并保证数据的一致性和可靠性。 4. 设备状态监测:车间自动化系统需要能够监测设备状态,并能够自动检测设备故障,提供报警信息,以便及时维修设备,减少生产停机时间。 5. 工艺过程控制:车间自动化系统需要能够控制和优化整个生产过程,提高生产效率和产品质量。 6. 报表查询与分析:车间自动化系统需要提供查询和分析数据的功能,为制定生产计划和调整生产流程提供依据。 ### 回答2: 车间自动化系统配合MES(制造执行系统)的改造需要满足以下要求: 1. 数据集成能力:车间自动化系统必须具备数据集成能力,能够将实时采集的生产数据,包括设备状态、生产进度、产品质量等,与MES系统进行实时数据交互。实现数据的集中管理和共享,确保数据的准确性和及时性,方便生产调度和决策。 2. 设备互联互通能力:车间自动化系统需要与MES系统实现良好的设备互联互通能力,包括与多种设备的通信协议兼容、设备状态的实时监控与控制等。通过设备的互联互通,实现对生产过程的可视化管理和控制,提高生产效率和质量。 3. 业务流程集成能力:车间自动化系统与MES系统需要能够实现业务流程的集成。包括生产订单的下达、作业任务的分配、生产过程的监控和控制、产品追溯等。确保生产流程的顺畅运行,减少人为干预和错误。 4. 数据安全性:车间自动化系统在与MES系统进行数据交互时,需确保数据的安全性。包括数据传输的加密和完整性验证、权限管理等。避免数据被篡改和泄漏,保护企业的核心技术和商业秘密。 5. 系统可扩展性:车间自动化系统的改造需具备良好的可扩展性,能够适应企业发展和变化的需求。可以随着生产规模、产品种类的增加进行灵活的调整和扩展,以满足未来的发展需求。 以上是车间自动化系统配合MES的改造所需满足的要求,通过实现数据集成、设备互联互通、业务流程集成、数据安全性和系统可扩展性,可以将车间生产与管理更加高效地结合起来,提升生产效率和质量,实现企业的可持续发展。 ### 回答3: 车间自动化系统配合MES(制造执行系统)的改造需要满足以下几个要求: 首先,集成性要求。车间自动化系统应该能够与MES系统进行无缝集成,实现数据共享和互联互通。通过集成,车间自动化系统的数据可以及时传输到MES系统中,为企业提供统一的数据平台,更好地管理和监控生产过程。 其次,实时性要求。车间自动化系统需要能够实时收集和传输数据,为MES系统提供准确的实时信息。这样,MES系统可以根据实时数据作出及时的调度和决策,确保生产过程的高效运行。 此外,可拓展性要求。车间自动化系统应该具备良好的可拓展性,能够根据企业的需求进行系统扩展和升级。随着企业规模的扩大和生产需求的变化,车间自动化系统需要能够适应新的生产线、设备和工艺流程,为企业的生产提供持续的支持。 再者,稳定性要求。车间自动化系统应该具备高度的稳定性和可靠性,能够长时间稳定运行。这样可以避免因系统故障而导致的生产中断和生产损失。 最后,安全性要求。车间自动化系统与MES系统的通信和数据传输需要具备良好的安全性保障措施,确保数据的机密性和完整性。防止未经授权的访问和数据篡改,确保生产过程的安全性和可信度。 综上所述,车间自动化系统配合MES的改造要求集成性、实时性、可拓展性、稳定性和安全性。这些要求能够帮助企业实现生产过程的优化和协同,提升生产效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值