Thanks, my simplified code now looks like this:
import json
import logging
import asyncio
import serial_asyncio
import voluptuous as vol
from homeassistant.components.fan import (FanEntity, PLATFORM_SCHEMA, SUPPORT_SET_SPEED, ATTR_PERCENTAGE )
from homeassistant.const import (CONF_NAME, STATE_OFF, STATE_ON, STATE_UNKNOWN)
from homeassistant.core import callback
from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE, EVENT_HOMEASSISTANT_STOP
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__)
CONF_SERIAL_PORT = "serial_port"
CONF_BAUDRATE = "baudrate"
DEFAULT_NAME = "USB Dongle"
DEFAULT_BAUDRATE = 115200
CONF_UNIQUE_ID = 'unique_id'
CONF_DEVICE_CODE = 'device_code'
CONF_CONTROLLER_DATA = "controller_data"
CONF_DELAY = "delay"
CONF_POWER_SENSOR = 'power_sensor'
ATTR_PERCENTAGE = "percentage"
#******************************************************************************************#
# #
# Params #
# #
#******************************************************************************************#
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_SERIAL_PORT): cv.string,
vol.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): cv.positive_int,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
}
)
#******************************************************************************************#
# #
# Setup #
# #
#******************************************************************************************#
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
"""Set up the Serial fan platform."""
name = config.get(CONF_NAME)
port = config.get(CONF_SERIAL_PORT)
baudrate = config.get(CONF_BAUDRATE)
value_template = config.get(CONF_VALUE_TEMPLATE)
if value_template is not None:
value_template.hass = hass
fan = FanEntity(name, port, baudrate, value_template)
async_add_entities([fan], True)
#******************************************************************************************#
# #
# FAN CLASS #
# #
#******************************************************************************************#
class FanEntity(Entity):
"""Representation of a Serial fan."""
def __init__(self, name, port, baudrate, value_template):
"""Initialize the Serial fan."""
self._name = name
self._attr_unique_id = "123456"
self._state = None
self._attr_percentage = None
self._port = port
self._baudrate = baudrate
self._serial_write_task = None
self._serial_read_task = None
self._template = value_template
self._attributes = []
self._last_on_speed = 2
self._speed = 1
async def async_added_to_hass(self):
"""Handle when an entity is about to be added to Home Assistant."""
@property
def unique_id(self):
"""Return a unique ID."""
return self._attr_unique_id
@property
def name(self):
"""Return the name of the fan."""
return self._name
@property
def should_poll(self):
"""No polling needed."""
return False
@property
def state(self):
"""Return the state of the fan."""
return self._state
@property
def percentage(self):
"""Return speed percentage of the fan."""
return self._attr_percentage
@property
def extra_state_attributes(self):
"""Platform specific attributes."""
return {
'last_on_speed': self._last_on_speed,
}
I can see the attribute “last_on_speed” in my automations, but I would like to see (and control) the percentage as well, what can be wrong here?