『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: dream9407

[信息发布] 如何让小爱AI音箱DLNA再次能用

[复制链接]

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-12 17:20:43 | 显示全部楼层
本帖最后由 yangyanch 于 2018-12-12 22:46 编辑
liuje 发表于 2018-12-12 15:07
[configuration.yaml]
..............................
shell_command:

如法炮制,只改了小爱的ip,音乐地址在浏览器播放测试亦无问题…但还是不行
Error running command: `ssh -l root 192.168.50.197 '/usr/bin/mphelper' tone '{{song}}'`, return code: 255
[color=var(--paper-item-body-secondary-color, var(--secondary-text-color))]下午10:29 /usr/local/lib/python3.6/site-packages/homeassistant/components/shell_command.py (ERROR)

shell_command是自带的功能吧?但我没找到/usr/local/lib/python3.6/site-packages/homeassistant/components/shell_command.py 这个目录
回复

使用道具 举报

2

主题

171

帖子

1175

积分

金牌会员

Rank: 6Rank: 6

积分
1175
金钱
1004
HASS币
10
发表于 2018-12-12 22:56:28 | 显示全部楼层
yangyanch 发表于 2018-12-12 17:20
如法炮制,只改了小爱的ip,音乐地址在浏览器播放测试亦无问题…但还是不行
Error running command: `ssh  ...

應該就是你少了這個檔案所造成的問題,

你可以自己建立此檔試看看..

"/usr/local/lib/python3.6/site-packages/homeassistant/components/shell_command.py"


"""
Exposes regular shell commands as services.

For more details about this platform, please refer to the documentation at
[url]https://home-assistant.io/components/shell_command/[/url]
"""
import asyncio
import logging
import shlex

import voluptuous as vol

from homeassistant.exceptions import TemplateError
from homeassistant.core import ServiceCall
from homeassistant.helpers import config_validation as cv, template
from homeassistant.helpers.typing import ConfigType, HomeAssistantType


DOMAIN = 'shell_command'

_LOGGER = logging.getLogger(__name__)

CONFIG_SCHEMA = vol.Schema({
    DOMAIN: vol.Schema({
        cv.slug: cv.string,
    }),
}, extra=vol.ALLOW_EXTRA)


async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
    """Set up the shell_command component."""
    conf = config.get(DOMAIN, {})

    cache = {}

    async def async_service_handler(service: ServiceCall) -> None:
        """Execute a shell command service."""
        cmd = conf[service.service]

        if cmd in cache:
            prog, args, args_compiled = cache[cmd]
        elif ' ' not in cmd:
            prog = cmd
            args = None
            args_compiled = None
            cache[cmd] = prog, args, args_compiled
        else:
            prog, args = cmd.split(' ', 1)
            args_compiled = template.Template(args, hass)
            cache[cmd] = prog, args, args_compiled

        if args_compiled:
            try:
                rendered_args = args_compiled.async_render(service.data)
            except TemplateError as ex:
                _LOGGER.exception("Error rendering command template: %s", ex)
                return
        else:
            rendered_args = None

        if rendered_args == args:
            # No template used. default behavior

            # pylint: disable=no-member
            create_process = asyncio.subprocess.create_subprocess_shell(
                cmd,
                loop=hass.loop,
                stdin=None,
                stdout=asyncio.subprocess.PIPE,
                stderr=asyncio.subprocess.PIPE,
                )
        else:
            # Template used. Break into list and use create_subprocess_exec
            # (which uses shell=False) for security
            shlexed_cmd = [prog] + shlex.split(rendered_args)

            # pylint: disable=no-member
            create_process = asyncio.subprocess.create_subprocess_exec(
                *shlexed_cmd,
                loop=hass.loop,
                stdin=None,
                stdout=asyncio.subprocess.PIPE,
                stderr=asyncio.subprocess.PIPE,
                )

        process = await create_process
        stdout_data, stderr_data = await process.communicate()

        if stdout_data:
            _LOGGER.debug("Stdout of command: `%s`, return code: %s:\n%s",
                          cmd, process.returncode, stdout_data)
        if stderr_data:
            _LOGGER.debug("Stderr of command: `%s`, return code: %s:\n%s",
                          cmd, process.returncode, stderr_data)
        if process.returncode != 0:
            _LOGGER.exception("Error running command: `%s`, return code: %s",
                              cmd, process.returncode)

    for name in conf.keys():
        hass.services.async_register(DOMAIN, name, async_service_handler)
    return True


回复

使用道具 举报

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-12 23:28:20 | 显示全部楼层
本帖最后由 yangyanch 于 2018-12-13 01:54 编辑
liuje 发表于 2018-12-12 22:56
應該就是你少了這個檔案所造成的問題,

你可以自己建立此檔試看看..

谢谢大佬回复,还是不行……由于我是虚拟机上装ubuntu基础上再装的hassio,可能文件夹位置稍有不同,但其实还是能搜到刚刚那个文件的。
回复

使用道具 举报

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-13 00:24:52 | 显示全部楼层
本帖最后由 yangyanch 于 2018-12-13 00:34 编辑
liuje 发表于 2018-12-12 22:56
應該就是你少了這個檔案所造成的問題,

你可以自己建立此檔試看看..

/usr/bin/mphelper tone http://d2agljdoug3z0j.cloudfront.net/radio-H
TTP/cr2-hd.3gp/chunklist.m3u8

用这个命令,在小爱ssh直接输入,除了mp3格式,m3u8的格式也能播放(上面的是一个电台的地址,又或者http://data.kufm.cn/channel2/462/24这样的电台也能播)…………但我在ha中一直调用不了
回复

使用道具 举报

2

主题

171

帖子

1175

积分

金牌会员

Rank: 6Rank: 6

积分
1175
金钱
1004
HASS币
10
发表于 2018-12-13 07:22:51 | 显示全部楼层
yangyanch 发表于 2018-12-13 00:24
/usr/bin/mphelper tone http://d2agljdoug3z0j.cloudfront.net/radio-H
TTP/cr2-hd.3gp/chunklist.m3u8

我自己安裝的是HA,  沒有玩過Hassio ,  然後HA版本是0.82.0
這樣就幫不了你了..   
回复

使用道具 举报

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-13 13:24:43 | 显示全部楼层
liuje 发表于 2018-12-13 07:22
我自己安裝的是HA,  沒有玩過Hassio ,  然後HA版本是0.82.0
這樣就幫不了你了..     ...

研究下能不能在node red输入命令了……对于初学者,有点难
回复

使用道具 举报

2

主题

171

帖子

1175

积分

金牌会员

Rank: 6Rank: 6

积分
1175
金钱
1004
HASS币
10
发表于 2018-12-13 14:02:13 | 显示全部楼层
yangyanch 发表于 2018-12-13 13:24
研究下能不能在node red输入命令了……对于初学者,有点难

如果是 node-red , 我可能會這樣做.....   

1. 從 "input" 控件中選 "mqtt" ,  監聽特定的主題(先自定義好),  消息內容就是 mp3 的連結地址.  
   (HA中可以自由發送MQTT訊息的)  

2.  從 "advanced" 控件中使用 "exec" 功能,  這功能可以運行shell代碼,  把收到mp3地址夾帶進去.

這樣應該可以解決你的問題.   但細節你要自己處理, node-red我也只是會用, 並不熟.
回复

使用道具 举报

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-13 14:04:50 | 显示全部楼层
liuje 发表于 2018-12-13 14:02
如果是 node-red , 我可能會這樣做.....   

1. 從 "input" 控件中選 "mqtt" ,  監聽特定的主題(先自定義 ...

谢谢大佬的指导,只能慢慢研究了……只是想看看能不能加几个小爱本身没有的电台来听
回复

使用道具 举报

7

主题

220

帖子

749

积分

高级会员

Rank: 4

积分
749
金钱
524
HASS币
20
发表于 2018-12-13 17:26:58 | 显示全部楼层
liuje 发表于 2018-12-13 14:02
如果是 node-red , 我可能會這樣做.....   

1. 從 "input" 控件中選 "mqtt" ,  監聽特定的主題(先自定義 ...

终于搞定了,对于一个代码小白,说多了都是泪……

用的是node-red中的bigssh套件,而且需要在node-red容器里先生成秘钥,传到小爱里,实现无密码登录。这样在小爱中可以实现声控打开网络电台或者播歌之类的功能
回复

使用道具 举报

2

主题

171

帖子

1175

积分

金牌会员

Rank: 6Rank: 6

积分
1175
金钱
1004
HASS币
10
发表于 2018-12-13 21:02:26 | 显示全部楼层
yangyanch 发表于 2018-12-13 17:26
终于搞定了,对于一个代码小白,说多了都是泪……

用的是node-red中的bigssh套件,而且需要在node-red容 ...



我另外發現,  如果要通過ssh命令讓小愛播放MP3,  必須先在HA/hassio本機端, 先以ssh登入一次,
因為它會詢問是否接受公鑰,  如果沒有選 "yes",  那直接調用是不會成功的.
做過一次之後,  之後在HA/hassio才能正常運行.  (公鑰會自動記錄在 /root/.ssh/known_hosts  檔案裡)

2018-12-13_20-55-17.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 11:33 , Processed in 0.086448 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表