home assistant

This commit is contained in:
e2002
2022-03-04 14:56:08 +03:00
parent 06c004c16d
commit b82df43ae9
6 changed files with 255 additions and 0 deletions

View File

View File

@@ -0,0 +1,9 @@
{
"domain": "yoradio",
"name": "ёRadio",
"documentation": "https://github.com/e2002/yoradio",
"dependencies": ["http", "mqtt"],
"codeowners": ["@e2002"],
"requirements": [],
"version": "0.4.322"
}

View File

@@ -0,0 +1,216 @@
import aiohttp
import asyncio
import logging
import voluptuous as vol
import json
from homeassistant.helpers.aiohttp_client import async_get_clientsession
_LOGGER = logging.getLogger(__name__)
VERSION = '0.4.322'
DOMAIN = "yoradio"
from homeassistant.helpers import config_validation as cv
from homeassistant.components.media_player import (
MediaPlayerEntity,
PLATFORM_SCHEMA
)
from homeassistant.components.media_player.const import (
MEDIA_TYPE_MUSIC,
SUPPORT_TURN_ON, SUPPORT_TURN_OFF,
SUPPORT_VOLUME_STEP, SUPPORT_VOLUME_SET,
SUPPORT_PAUSE, SUPPORT_PLAY, SUPPORT_STOP,
SUPPORT_PREVIOUS_TRACK, SUPPORT_NEXT_TRACK,
SUPPORT_SELECT_SOURCE
)
from homeassistant.const import (
CONF_NAME,
STATE_IDLE,
STATE_PLAYING,
STATE_OFF
)
SUPPORT_YORADIO = SUPPORT_PAUSE | SUPPORT_PLAY | SUPPORT_STOP |\
SUPPORT_VOLUME_SET | SUPPORT_VOLUME_STEP | \
SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK | \
SUPPORT_SELECT_SOURCE
DEFAULT_NAME = 'yoRadio'
CONF_MAX_VOLUME = 'max_volume'
CONF_ROOT_TOPIC = 'root_topic'
YORADIO_SOURCE_TYPE = []
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_ROOT_TOPIC, default="yoradio"): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_MAX_VOLUME, default='254'): cv.string
})
def setup_platform(hass, config, add_devices, discovery_info=None):
root_topic = config.get(CONF_ROOT_TOPIC)
name = config.get(CONF_NAME)
max_volume = int(config.get(CONF_MAX_VOLUME))
session = async_get_clientsession(hass)
api = yoradioApi(root_topic, session, hass)
add_devices([yoradioDevice(name, max_volume, api)], True)
class yoradioApi():
def __init__(self, root_topic, session, hass):
self.session = session
self.hass = hass
self.mqtt = hass.components.mqtt
self.root_topic = root_topic
async def set_command(self, command):
self.mqtt.async_publish(self.root_topic + '/command', command)
async def set_volume(self, volume):
command = "vol " + str(volume)
self.mqtt.async_publish(self.root_topic + '/command', command)
async def set_source(self, source):
number = source.split('.')
command = "play " + number[0]
self.mqtt.async_publish(self.root_topic + '/command', command)
async def load_playlist(self, msg):
try:
async with aiohttp.ClientSession() as session:
async with session.get(msg.payload) as resp:
file = await resp.text()
except aiohttp.ClientConnectorError as e:
_LOGGER.error('Error downloading ' + msg.payload)
else:
file = file.split('\n')
counter = 1
for line in file:
res = line.split('\t')
station = str(counter) + '. ' + res[0]
YORADIO_SOURCE_TYPE.append(station)
counter=counter+1
class yoradioDevice(MediaPlayerEntity):
def __init__(self, name, max_volume, api):
self._name = name
self.api = api
self._state = STATE_OFF
self._current_source = None
self._media_title = ''
self._track_artist = ''
self._track_album_name = ''
self._volume = 0
self._muted = False
self._max_volume = max_volume
self.api.mqtt.subscribe(self.api.root_topic+'/status', self.status_listener, 0, "utf-8")
self.api.mqtt.subscribe(self.api.root_topic+'/playlist', self.playlist_listener, 0, "utf-8")
self.api.mqtt.subscribe(self.api.root_topic+'/volume', self.volume_listener, 0, "utf-8")
async def status_listener(self, msg):
js = json.loads(msg.payload)
self._media_title = js['title']
self._track_artist = js['name']
self._state = STATE_PLAYING if js['status']==1 else STATE_IDLE
self._current_source = str(js['station']) + '. ' + js['name']
try:
self.async_schedule_update_ha_state()
except:
pass
async def playlist_listener(self, msg):
await self.api.load_playlist(msg)
try:
self.async_schedule_update_ha_state()
except:
pass
async def volume_listener(self, msg):
self._volume = int(msg.payload) / self._max_volume
try:
self.async_schedule_update_ha_state()
except:
pass
@property
def supported_features(self):
return SUPPORT_YORADIO
@property
def name(self):
return self._name
@property
def media_title(self):
return self._media_title
@property
def media_artist(self):
return self._track_artist
@property
def media_album_name(self):
return self._track_album_name
@property
def state(self):
return self._state
@property
def volume_level(self):
return self._volume
async def async_set_volume_level(self, volume):
await self.api.set_volume(round(volume * self._max_volume,1))
@property
def source(self):
return self._current_source
@property
def source_list(self):
return YORADIO_SOURCE_TYPE
async def async_select_source(self, source):
await self.api.set_source(source)
self._current_source = source
async def async_volume_up(self):
newVol = float(self._volume) + 0.05
await self.async_set_volume_level(newVol)
self._volume = newVol
async def async_volume_down(self):
newVol = float(self._volume) - 0.05
await self.async_set_volume_level(newVol)
self._volume = newVol
async def async_media_next_track(self):
await self.api.set_command("next")
async def async_media_previous_track(self):
await self.api.set_command("prev")
async def async_turn_off(self):
await self.api.set_command("stop")
self._state = STATE_IDLE
async def async_media_stop(self):
await self.api.set_command("stop")
self._state = STATE_IDLE
async def async_turn_on(self):
await self.api.set_command("start")
self._state = STATE_PLAYING
async def async_media_play(self):
await self.api.set_command("start")
self._state = STATE_PLAYING
async def async_media_pause(self):
await self.api.set_command("stop")
self._state = STATE_IDLE

View File

@@ -0,0 +1,18 @@
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
# yoRadio entity
media_player:
- platform: yoradio
name: YoRadio (kitchen)
root_topic: yoradio/100

View File

@@ -10,6 +10,7 @@
- [Quick start](#quick-start)
- [Update](#update)
- [MQTT](#mqtt)
- [Home Assistant](#home-assistant)
- [More features](#more-features)
- [Version history](#version-history)
---
@@ -180,6 +181,17 @@ download _http://\<yoradioip\>/data/playlist.csv_ and _http://\<yoradioip\>/data
2. In the mqttoptions.h file, change the options to the ones you need
3. Well done!
---
## Home Assistant
<img src="images/ha.jpg" width="500" height="270"><br />
0. Requires [MQTT integration](https://www.home-assistant.io/integrations/mqtt/)
1. Copy directory HA/custom_components/yoradio to .homeassistant/custom_components/
2. Add yoRadio entity into .homeassistant/configuration.yaml ([see exsample](HA/exsample_configuration.yaml))
3. Restart Home Assistant
4. Add Lovelace Media Player card to UI (or [mini-media-player](https://github.com/kalkih/mini-media-player) card)
5. Well done!
---
## More features
- Сan add up to 65535 stations to a playlist. Supports and imports [KaRadio](https://github.com/karawin/Ka-Radio32) playlists (WebStations.txt)

BIN
images/ha.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB