Skip to content
Snippets Groups Projects
Commit 5d18529f authored by KERDREUX Jerome's avatar KERDREUX Jerome
Browse files

Format

parent 49f2f7a7
No related branches found
No related tags found
1 merge request!1First try of type hints
from xaal.lib import tools,Device
from xaal.schemas import devices
from pprint import pprint
from aioesphomeapi import APIClient, APIConnectionError,model
import asyncio
import logging
from aioesphomeapi import APIClient, APIConnectionError, model
from xaal.lib import Device, tools
from xaal.schemas import devices
logging.getLogger('aioesphomeapi').setLevel(logging.INFO)
logger = logging.getLogger(__name__)
......@@ -18,7 +16,9 @@ class ESPDevice:
self.port = cfg.get('port',6053)
self.key = cfg.get('key',None)
self.passwd = cfg.get('passwd',None)
self.base_addr = tools.get_uuid(cfg.get('base_addr'))
addr = tools.get_uuid(cfg.get('base_addr'))
assert addr, "Invalid base_addr"
self.base_addr = addr
self.embedded = []
self.disconnected = asyncio.Event()
......@@ -91,10 +91,12 @@ def find_device_class(info):
if type_ == model.LightInfo:
return Lamp
elif type_ == model.SwitchInfo:
return PowerRelay
return PowerRelay
elif type_ == model.SensorInfo:
if info.device_class == 'signal_strength': return WifiMeter
if info.device_class == 'power': return PowerMeter
if info.device_class == 'signal_strength':
return WifiMeter
if info.device_class == 'power':
return PowerMeter
elif type_ == model.BinarySensorInfo:
return Contact
......@@ -121,6 +123,7 @@ class EntityMixin(object):
return self.info.key
def setup_device_description(self):
assert self.dev, "Device not setup"
self.dev.vendor_id = 'ESPHome'
self.dev.product_id = self.info.unique_id
self.dev.hw_id = self.info.key
......
import platform
import logging
import platform
import pyowm
from pyowm.exceptions import OWMError
from xaal.lib import tools
from xaal.schemas import devices
from xaal.lib import helpers
from xaal.lib import helpers, tools
from xaal.schemas import devices
PACKAGE_NAME = "xaal.owm"
RATE = 300 # update every 5 min
RATE = 300 # update every 5 min
API_KEY = '3a5989bac31472cd41d69e92838bd454'
logger = logging.getLogger(PACKAGE_NAME)
def setup_dev(dev):
dev.vendor_id = "IHSEV"
dev.vendor_id = "IHSEV"
dev.product_id = "OpenWeatherMap"
dev.info = "%s@%s" % (PACKAGE_NAME,platform.node())
dev.url = "https://www.openweathermap.org"
dev.version = 0.3
dev.info = "%s@%s" % (PACKAGE_NAME, platform.node())
dev.url = "https://www.openweathermap.org"
dev.version = 0.3
return dev
class GW:
def __init__(self,engine):
def __init__(self, engine):
self.eng = engine
engine.on_stop(self.save_config)
cfg = tools.load_cfg(PACKAGE_NAME)
if cfg == None:
if cfg is None:
logger.info('New config file')
cfg = tools.new_cfg(PACKAGE_NAME)
cfg['config']['base_addr'] = str(tools.get_random_base_uuid())
self.cfg = cfg
self.setup()
self.update()
def setup(self):
""" create devices, register .."""
"""create devices, register .."""
cfg = self.cfg['config']
base_addr = tools.get_uuid(cfg['base_addr'])
if base_addr is None:
logger.error('Invalid base_addr')
return
# devices
d1 = devices.thermometer(base_addr +0)
d2 = devices.hygrometer(base_addr +1)
d3 = devices.barometer(base_addr +2)
d4 = devices.windgauge(base_addr +3)
d1 = devices.thermometer(base_addr + 0)
d2 = devices.hygrometer(base_addr + 1)
d3 = devices.barometer(base_addr + 2)
d4 = devices.windgauge(base_addr + 3)
d4.unsupported_attributes.append('gust_angle')
d4.del_attribute(d4.get_attribute('gust_angle'))
self.devs = [d1,d2,d3,d4]
gust = d4.get_attribute('gust_angle')
if gust:
d4.del_attribute(gust)
self.devs = [d1, d2, d3, d4]
# gw
gw = devices.gateway(tools.get_uuid(cfg['addr']))
gw.attributes['embedded'] = [dev.address for dev in self.devs]
group = base_addr + 0xff
for dev in (self.devs + [gw,]):
group = base_addr + 0xFF
for dev in self.devs + [gw,]:
setup_dev(dev)
if dev != gw:
dev.group_id = group
self.eng.add_devices(self.devs + [gw,])
# OWM stuff
self.eng.add_timer(self.update,RATE)
self.eng.add_timer(self.update, RATE)
# API Key
api_key = cfg.get('api_key',None)
api_key = cfg.get('api_key', None)
if not api_key:
cfg['api_key'] = api_key = API_KEY
# Place
self.place = cfg.get('place',None)
# Place
self.place = cfg.get('place', None)
if not self.place:
cfg['place'] = self.place = 'Brest,FR'
# We are ready
......@@ -78,18 +83,19 @@ class GW:
try:
self._update()
except OWMError as e:
logger.warn(e)
logger.warning(e)
def _update(self):
weather = self.owm.weather_at_place(self.place).get_weather()
self.devs[0].attributes['temperature'] = round(weather.get_temperature(unit='celsius').get('temp',None),1)
self.devs[1].attributes['humidity'] = weather.get_humidity()
self.devs[2].attributes['pressure'] = weather.get_pressure().get('press',None)
wind = weather.get_wind().get('speed',None)
if wind: wind = round(wind * 3600 / 1000, 1) # m/s => km/h
self.devs[0].attributes['temperature'] = round(weather.get_temperature(unit='celsius').get('temp', None), 1)
self.devs[1].attributes['humidity'] = weather.get_humidity()
self.devs[2].attributes['pressure'] = weather.get_pressure().get('press', None)
wind = weather.get_wind().get('speed', None)
if wind:
wind = round(wind * 3600 / 1000, 1) # m/s => km/h
self.devs[3].attributes['wind_strength'] = wind
self.devs[3].attributes['wind_angle'] = weather.get_wind().get('deg',None)
self.devs[3].attributes['gust_strength'] = weather.get_wind().get('gust',None)
self.devs[3].attributes['wind_angle'] = weather.get_wind().get('deg', None)
self.devs[3].attributes['gust_strength'] = weather.get_wind().get('gust', None)
def save_config(self):
cfg = tools.load_cfg(PACKAGE_NAME)
......@@ -97,6 +103,7 @@ class GW:
logger.info('Saving configuration file')
self.cfg.write()
def setup(engine):
gw = GW(engine)
return True
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment