Do not call update() in constructor (#7917)
This commit is contained in:
parent
b1f538b622
commit
760138ac52
10 changed files with 60 additions and 91 deletions
|
@ -32,7 +32,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
name = config.get(CONF_NAME)
|
||||
ip_address = config.get(CONF_IP_ADDRESS)
|
||||
|
||||
add_devices([DteEnergyBridgeSensor(ip_address, name)])
|
||||
add_devices([DteEnergyBridgeSensor(ip_address, name)], True)
|
||||
|
||||
|
||||
class DteEnergyBridgeSensor(Entity):
|
||||
|
|
|
@ -13,12 +13,11 @@ from datetime import timedelta, datetime
|
|||
import requests
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
import homeassistant.util.dt as dt_util
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import CONF_NAME, ATTR_ATTRIBUTION
|
||||
import homeassistant.util.dt as dt_util
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
_RESOURCE = 'https://data.dublinked.ie/cgi-bin/rtpi/realtimebusinformation'
|
||||
|
@ -36,7 +35,7 @@ CONF_ROUTE = 'route'
|
|||
DEFAULT_NAME = 'Next Bus'
|
||||
ICON = 'mdi:bus'
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
|
||||
SCAN_INTERVAL = timedelta(minutes=1)
|
||||
TIME_STR_FORMAT = '%H:%M'
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
|
@ -64,7 +63,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
route = config.get(CONF_ROUTE)
|
||||
|
||||
data = PublicTransportData(stop, route)
|
||||
add_devices([DublinPublicTransportSensor(data, stop, route, name)])
|
||||
add_devices([DublinPublicTransportSensor(data, stop, route, name)], True)
|
||||
|
||||
|
||||
class DublinPublicTransportSensor(Entity):
|
||||
|
@ -76,7 +75,7 @@ class DublinPublicTransportSensor(Entity):
|
|||
self._name = name
|
||||
self._stop = stop
|
||||
self._route = route
|
||||
self.update()
|
||||
self._times = self._state = None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -137,7 +136,6 @@ class PublicTransportData(object):
|
|||
ATTR_ROUTE: self.route,
|
||||
ATTR_DUE_IN: 'n/a'}]
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data from opendata.ch."""
|
||||
params = {}
|
||||
|
@ -149,10 +147,7 @@ class PublicTransportData(object):
|
|||
params['maxresults'] = 2
|
||||
params['format'] = 'json'
|
||||
|
||||
response = requests.get(
|
||||
_RESOURCE,
|
||||
params,
|
||||
timeout=10)
|
||||
response = requests.get(_RESOURCE, params, timeout=10)
|
||||
|
||||
if response.status_code != 200:
|
||||
self.info = [{ATTR_DUE_AT: 'n/a',
|
||||
|
@ -175,8 +170,7 @@ class PublicTransportData(object):
|
|||
if due_at is not None and route is not None:
|
||||
bus_data = {ATTR_DUE_AT: due_at,
|
||||
ATTR_ROUTE: route,
|
||||
ATTR_DUE_IN:
|
||||
due_in_minutes(due_at)}
|
||||
ATTR_DUE_IN: due_in_minutes(due_at)}
|
||||
self.info.append(bus_data)
|
||||
|
||||
if not self.info:
|
||||
|
|
|
@ -10,12 +10,11 @@ from datetime import timedelta
|
|||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import (
|
||||
CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN, CONF_UNIT_OF_MEASUREMENT)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
REQUIREMENTS = ['dweepy==0.3.0']
|
||||
|
||||
|
@ -25,7 +24,7 @@ CONF_DEVICE = 'device'
|
|||
|
||||
DEFAULT_NAME = 'Dweet.io Sensor'
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
|
||||
SCAN_INTERVAL = timedelta(minutes=1)
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Required(CONF_DEVICE): cv.string,
|
||||
|
@ -109,7 +108,6 @@ class DweetData(object):
|
|||
self._device = device
|
||||
self.data = None
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data from Dweet.io."""
|
||||
import dweepy
|
||||
|
|
|
@ -12,13 +12,12 @@ from datetime import timedelta
|
|||
import requests
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import (
|
||||
CONF_USERNAME, CONF_PASSWORD,
|
||||
CONF_NAME, CONF_MONITORED_VARIABLES)
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
REQUIREMENTS = ['pyebox==0.1.0']
|
||||
|
||||
|
@ -32,35 +31,25 @@ PERCENT = '%' # type: str
|
|||
DEFAULT_NAME = 'EBox'
|
||||
|
||||
REQUESTS_TIMEOUT = 15
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5)
|
||||
SCAN_INTERVAL = timedelta(minutes=5)
|
||||
|
||||
SENSOR_TYPES = {
|
||||
'usage': ['Usage',
|
||||
PERCENT, 'mdi:percent'],
|
||||
'balance': ['Balance',
|
||||
PRICE, 'mdi:square-inc-cash'],
|
||||
'limit': ['Data limit',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'days_left': ['Days left',
|
||||
DAYS, 'mdi:calendar-today'],
|
||||
'before_offpeak_download': ['Download before offpeak',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'before_offpeak_upload': ['Upload before offpeak',
|
||||
GIGABITS, 'mdi:upload'],
|
||||
'before_offpeak_total': ['Total before offpeak',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'offpeak_download': ['Offpeak download',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'offpeak_upload': ['Offpeak Upload',
|
||||
GIGABITS, 'mdi:upload'],
|
||||
'offpeak_total': ['Offpeak Total',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'download': ['Download',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'upload': ['Upload',
|
||||
GIGABITS, 'mdi:upload'],
|
||||
'total': ['Total',
|
||||
GIGABITS, 'mdi:download'],
|
||||
'usage': ['Usage', PERCENT, 'mdi:percent'],
|
||||
'balance': ['Balance', PRICE, 'mdi:square-inc-cash'],
|
||||
'limit': ['Data limit', GIGABITS, 'mdi:download'],
|
||||
'days_left': ['Days left', DAYS, 'mdi:calendar-today'],
|
||||
'before_offpeak_download':
|
||||
['Download before offpeak', GIGABITS, 'mdi:download'],
|
||||
'before_offpeak_upload':
|
||||
['Upload before offpeak', GIGABITS, 'mdi:upload'],
|
||||
'before_offpeak_total':
|
||||
['Total before offpeak', GIGABITS, 'mdi:download'],
|
||||
'offpeak_download': ['Offpeak download', GIGABITS, 'mdi:download'],
|
||||
'offpeak_upload': ['Offpeak Upload', GIGABITS, 'mdi:upload'],
|
||||
'offpeak_total': ['Offpeak Total', GIGABITS, 'mdi:download'],
|
||||
'download': ['Download', GIGABITS, 'mdi:download'],
|
||||
'upload': ['Upload', GIGABITS, 'mdi:upload'],
|
||||
'total': ['Total', GIGABITS, 'mdi:download'],
|
||||
}
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
|
@ -142,7 +131,6 @@ class EBoxData(object):
|
|||
self.client = EboxClient(username, password, REQUESTS_TIMEOUT)
|
||||
self.data = {}
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data from Ebox."""
|
||||
from pyebox.client import PyEboxError
|
||||
|
@ -151,5 +139,4 @@ class EBoxData(object):
|
|||
except PyEboxError as exp:
|
||||
_LOGGER.error("Error on receive last EBox data: %s", exp)
|
||||
return
|
||||
# Update data
|
||||
self.data = self.client.get_data()
|
||||
|
|
|
@ -9,13 +9,14 @@ from homeassistant.const import TEMP_FAHRENHEIT
|
|||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
DEPENDENCIES = ['ecobee']
|
||||
|
||||
ECOBEE_CONFIG_FILE = 'ecobee.conf'
|
||||
|
||||
SENSOR_TYPES = {
|
||||
'temperature': ['Temperature', TEMP_FAHRENHEIT],
|
||||
'humidity': ['Humidity', '%']
|
||||
}
|
||||
|
||||
ECOBEE_CONFIG_FILE = 'ecobee.conf'
|
||||
|
||||
|
||||
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
"""Set up the Ecobee sensors."""
|
||||
|
@ -31,7 +32,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
|
||||
dev.append(EcobeeSensor(sensor['name'], item['type'], index))
|
||||
|
||||
add_devices(dev)
|
||||
add_devices(dev, True)
|
||||
|
||||
|
||||
class EcobeeSensor(Entity):
|
||||
|
@ -39,13 +40,12 @@ class EcobeeSensor(Entity):
|
|||
|
||||
def __init__(self, sensor_name, sensor_type, sensor_index):
|
||||
"""Initialize the sensor."""
|
||||
self._name = sensor_name + ' ' + SENSOR_TYPES[sensor_type][0]
|
||||
self._name = '{} {}'.format(sensor_name, SENSOR_TYPES[sensor_type][0])
|
||||
self.sensor_name = sensor_name
|
||||
self.type = sensor_type
|
||||
self.index = sensor_index
|
||||
self._state = None
|
||||
self._unit_of_measurement = SENSOR_TYPES[sensor_type][1]
|
||||
self.update()
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
|
|
@ -10,13 +10,12 @@ from telnetlib import Telnet
|
|||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import (
|
||||
CONF_NAME, CONF_HOST, CONF_PORT, TEMP_CELSIUS, TEMP_FAHRENHEIT,
|
||||
STATE_UNKNOWN)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@ -28,7 +27,7 @@ DEFAULT_PORT = 7634
|
|||
DEFAULT_NAME = 'HD Temperature'
|
||||
DEFAULT_TIMEOUT = 5
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1)
|
||||
SCAN_INTERVAL = timedelta(minutes=1)
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
|
||||
|
@ -50,7 +49,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
_LOGGER.error("Unable to fetch the data from %s:%s", host, port)
|
||||
return False
|
||||
|
||||
add_devices([HddTempSensor(name, hddtemp)])
|
||||
add_devices([HddTempSensor(name, hddtemp)], True)
|
||||
|
||||
|
||||
class HddTempSensor(Entity):
|
||||
|
@ -62,7 +61,6 @@ class HddTempSensor(Entity):
|
|||
self._name = name
|
||||
self._state = False
|
||||
self._details = None
|
||||
self.update()
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -77,7 +75,7 @@ class HddTempSensor(Entity):
|
|||
@property
|
||||
def unit_of_measurement(self):
|
||||
"""Return the unit the value is expressed in."""
|
||||
if self.details[4] == 'C':
|
||||
if self._details[4] == 'C':
|
||||
return TEMP_CELSIUS
|
||||
else:
|
||||
return TEMP_FAHRENHEIT
|
||||
|
@ -86,8 +84,8 @@ class HddTempSensor(Entity):
|
|||
def device_state_attributes(self):
|
||||
"""Return the state attributes of the sensor."""
|
||||
return {
|
||||
ATTR_DEVICE: self.details[1],
|
||||
ATTR_MODEL: self.details[2],
|
||||
ATTR_DEVICE: self._details[1],
|
||||
ATTR_MODEL: self._details[2],
|
||||
}
|
||||
|
||||
def update(self):
|
||||
|
@ -95,8 +93,8 @@ class HddTempSensor(Entity):
|
|||
self.hddtemp.update()
|
||||
|
||||
if self.hddtemp.data is not None:
|
||||
self.details = self.hddtemp.data.split('|')
|
||||
self._state = self.details[3]
|
||||
self._details = self.hddtemp.data.split('|')
|
||||
self._state = self._details[3]
|
||||
else:
|
||||
self._state = STATE_UNKNOWN
|
||||
|
||||
|
@ -110,9 +108,8 @@ class HddTempData(object):
|
|||
self.port = port
|
||||
self.data = None
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data from hhtemp running as daemon."""
|
||||
"""Get the latest data from HDDTemp running as daemon."""
|
||||
try:
|
||||
connection = Telnet(
|
||||
host=self.host, port=self.port, timeout=DEFAULT_TIMEOUT)
|
||||
|
|
|
@ -52,7 +52,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
|
||||
add_devices([MoldIndicator(
|
||||
hass, name, indoor_temp_sensor, outdoor_temp_sensor,
|
||||
indoor_humidity_sensor, calib_factor)])
|
||||
indoor_humidity_sensor, calib_factor)], True)
|
||||
|
||||
|
||||
class MoldIndicator(Entity):
|
||||
|
@ -94,8 +94,6 @@ class MoldIndicator(Entity):
|
|||
if indoor_hum:
|
||||
self._indoor_hum = MoldIndicator._update_hum_sensor(indoor_hum)
|
||||
|
||||
self.update()
|
||||
|
||||
@staticmethod
|
||||
def _update_temp_sensor(state):
|
||||
"""Parse temperature sensor value."""
|
||||
|
|
|
@ -10,12 +10,11 @@ from datetime import timedelta
|
|||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import (
|
||||
CONF_NAME, CONF_HOST, CONF_SSL, CONF_VERIFY_SSL, CONF_MONITORED_CONDITIONS)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
_ENDPOINT = '/admin/api.php'
|
||||
|
@ -30,7 +29,7 @@ DEFAULT_NAME = 'Pi-Hole'
|
|||
DEFAULT_SSL = False
|
||||
DEFAULT_VERIFY_SSL = True
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5)
|
||||
SCAN_INTERVAL = timedelta(minutes=5)
|
||||
|
||||
MONITORED_CONDITIONS = {
|
||||
'dns_queries_today': ['DNS Queries Today',
|
||||
|
@ -67,7 +66,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
sensors = [PiHoleSensor(hass, api, name, condition)
|
||||
for condition in config[CONF_MONITORED_CONDITIONS]]
|
||||
|
||||
add_devices(sensors)
|
||||
add_devices(sensors, True)
|
||||
|
||||
|
||||
class PiHoleSensor(Entity):
|
||||
|
@ -134,7 +133,6 @@ class PiHoleAPI(object):
|
|||
|
||||
self.update()
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data from the Pi-Hole."""
|
||||
try:
|
||||
|
|
|
@ -9,12 +9,11 @@ from datetime import timedelta
|
|||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION, ATTR_TIME, ATTR_TEMPERATURE, STATE_UNKNOWN)
|
||||
from homeassistant.helpers import config_validation as cv
|
||||
ATTR_ATTRIBUTION, ATTR_TIME, ATTR_TEMPERATURE, STATE_UNKNOWN, CONF_TOKEN)
|
||||
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
|
||||
REQUIREMENTS = ['pwaqi==3.0']
|
||||
|
||||
|
@ -32,7 +31,6 @@ ATTRIBUTION = 'Data provided by the World Air Quality Index project'
|
|||
|
||||
CONF_LOCATIONS = 'locations'
|
||||
CONF_STATIONS = 'stations'
|
||||
CONF_API_TOKEN = 'token'
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10)
|
||||
|
||||
|
@ -42,7 +40,7 @@ SENSOR_TYPES = {
|
|||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_STATIONS): cv.ensure_list,
|
||||
vol.Required(CONF_API_TOKEN): cv.string,
|
||||
vol.Required(CONF_TOKEN): cv.string,
|
||||
vol.Required(CONF_LOCATIONS): cv.ensure_list,
|
||||
})
|
||||
|
||||
|
@ -51,10 +49,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
"""Set up the requested World Air Quality Index locations."""
|
||||
import pwaqi
|
||||
|
||||
dev = []
|
||||
token = config.get(CONF_API_TOKEN)
|
||||
token = config.get(CONF_TOKEN)
|
||||
station_filter = config.get(CONF_STATIONS)
|
||||
for location_name in config.get(CONF_LOCATIONS):
|
||||
locations = config.get(CONF_LOCATIONS)
|
||||
|
||||
dev = []
|
||||
for location_name in locations:
|
||||
station_ids = pwaqi.findStationCodesByCity(location_name, token)
|
||||
_LOGGER.info("The following stations were returned: %s", station_ids)
|
||||
for station in station_ids:
|
||||
|
@ -63,7 +63,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
(waqi_sensor.station_name in station_filter):
|
||||
dev.append(WaqiSensor(WaqiData(station, token), station))
|
||||
|
||||
add_devices(dev)
|
||||
print("#### Locations", locations)
|
||||
print("### Stations", station_filter)
|
||||
add_devices(dev, True)
|
||||
|
||||
|
||||
class WaqiSensor(Entity):
|
||||
|
@ -74,7 +76,6 @@ class WaqiSensor(Entity):
|
|||
self.data = data
|
||||
self._station_id = station_id
|
||||
self._details = None
|
||||
self.update()
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -156,7 +157,6 @@ class WaqiData(object):
|
|||
self._token = token
|
||||
self.data = None
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the data from World Air Quality Index and updates the states."""
|
||||
import pwaqi
|
||||
|
|
|
@ -9,11 +9,10 @@ from datetime import timedelta
|
|||
|
||||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import ATTR_ATTRIBUTION
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
REQUIREMENTS = ['yahoo-finance==1.4.0']
|
||||
|
||||
|
@ -31,7 +30,7 @@ DEFAULT_SYMBOL = 'YHOO'
|
|||
|
||||
ICON = 'mdi:currency-usd'
|
||||
|
||||
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5)
|
||||
SCAN_INTERVAL = timedelta(minutes=5)
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_SYMBOLS, default=[DEFAULT_SYMBOL]):
|
||||
|
@ -53,7 +52,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
data = YahooFinanceData(symbol)
|
||||
dev.append(YahooFinanceSensor(data, symbol))
|
||||
|
||||
add_devices(dev)
|
||||
add_devices(dev, True)
|
||||
|
||||
|
||||
class YahooFinanceSensor(Entity):
|
||||
|
@ -66,7 +65,6 @@ class YahooFinanceSensor(Entity):
|
|||
self._symbol = symbol
|
||||
self._state = None
|
||||
self._unit_of_measurement = None
|
||||
self.update()
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -120,7 +118,6 @@ class YahooFinanceData(object):
|
|||
self.prev_close = None
|
||||
self.stock = Share(self._symbol)
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
"""Get the latest data and updates the states."""
|
||||
self.stock.refresh()
|
||||
|
|
Loading…
Add table
Reference in a new issue