Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update from asyncio_mqtt to aiomqtt #364

Merged
merged 6 commits into from
Jul 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-20.04
strategy:
matrix:
python-version: [3.7, 3.8]
python-version: [3.8]

steps:
- uses: actions/checkout@v2
Expand Down
10 changes: 5 additions & 5 deletions mqtt_io/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,11 @@ def custom_validate_main_config(config: ConfigType) -> ConfigType:
bad_configs: Dict[str, Dict[str, List[str]]] = {}

# Make sure each of the IO configs refer to an existing module config
module_and_io_sections = dict(
gpio_modules=("digital_inputs", "digital_outputs"),
sensor_modules=("sensor_inputs",),
stream_modules=("stream_reads", "stream_writes"),
)
module_and_io_sections = {
"gpio_modules": ("digital_inputs", "digital_outputs"),
"sensor_modules": ("sensor_inputs",),
"stream_modules": ("stream_reads", "stream_writes"),
}
for module_section, io_sections in module_and_io_sections.items():
validate_gpio_module_names(bad_configs, config, module_section, io_sections)

Expand Down
4 changes: 2 additions & 2 deletions mqtt_io/config/config.schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ mqtt:
description: MQTT Client implementation module path.
extra_info: |
There's currently only one implementation, which uses the
[asyncio-mqtt](https://github.com/sbtinstruments/asyncio-mqtt/) client.
[aiomqtt](https://github.com/sbtinstruments/aiomqtt/) client.
type: string
required: no
default: mqtt_io.mqtt.asyncio_mqtt
default: mqtt_io.mqtt.aiomqtt
ha_discovery:
type: dict
required: no
Expand Down
2 changes: 1 addition & 1 deletion mqtt_io/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
STREAM_TOPIC = "stream"

MODULE_IMPORT_PATH = "mqtt_io.modules"
MODULE_CLASS_NAMES = dict(gpio="GPIO", sensor="Sensor", stream="Stream")
MODULE_CLASS_NAMES = {"gpio": 'GPIO', "sensor": 'Sensor', "stream": 'Stream'}

MQTT_SUB_PRIORITY = 1
MQTT_ANNOUNCE_PRIORITY = 2
Expand Down
58 changes: 29 additions & 29 deletions mqtt_io/home_assistant.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,21 @@ def get_common_config(
Return config that's common across all HQ discovery announcements.
"""
disco_conf: ConfigType = mqtt_conf["ha_discovery"]
config = dict(name=io_conf["name"])
config = {"name": io_conf['name']}
config.update(
dict(
availability_topic="/".join(
{
"availability_topic": '/'.join(
(mqtt_conf["topic_prefix"], mqtt_conf["status_topic"])
),
payload_available=mqtt_conf["status_payload_running"],
payload_not_available=mqtt_conf["status_payload_dead"],
device=dict(
manufacturer="MQTT IO",
model=f"v{VERSION}",
identifiers=[mqtt_options.client_id],
name=disco_conf["name"],
),
)
"payload_available": mqtt_conf["status_payload_running"],
"payload_not_available": mqtt_conf["status_payload_dead"],
"device": {
"manufacturer": 'MQTT IO',
"model": f'v{VERSION}',
"identifiers": [mqtt_options.client_id],
"name": disco_conf["name"],
},
}
)
config.update(io_conf.get("ha_discovery", {}))
return config
Expand All @@ -54,12 +54,12 @@ def hass_announce_digital_input(
disco_prefix: str = disco_conf["prefix"]
sensor_config = get_common_config(in_conf, mqtt_conf, mqtt_options)
sensor_config.update(
dict(
unique_id=f"{mqtt_options.client_id}_{in_conf['module']}_input_{name}",
state_topic="/".join((mqtt_conf["topic_prefix"], INPUT_TOPIC, name)),
payload_on=in_conf["on_payload"],
payload_off=in_conf["off_payload"],
)
{
"unique_id": f'{mqtt_options.client_id}_{in_conf["module"]}_input_{name}',
"state_topic": '/'.join((mqtt_conf["topic_prefix"], INPUT_TOPIC, name)),
"payload_on": in_conf["on_payload"],
"payload_off": in_conf["off_payload"],
}
)
return MQTTMessageSend(
"/".join(
Expand Down Expand Up @@ -90,13 +90,13 @@ def hass_announce_digital_output(
disco_prefix: str = disco_conf["prefix"]
switch_config = get_common_config(out_conf, mqtt_conf, mqtt_options)
switch_config.update(
dict(
unique_id=f"{mqtt_options.client_id}_{out_conf['module']}_output_{name}",
state_topic="/".join((prefix, OUTPUT_TOPIC, name)),
command_topic="/".join((prefix, OUTPUT_TOPIC, name, SET_SUFFIX)),
payload_on=out_conf["on_payload"],
payload_off=out_conf["off_payload"],
)
{
"unique_id": f'{mqtt_options.client_id}_{out_conf["module"]}_output_{name}',
"state_topic": '/'.join((prefix, OUTPUT_TOPIC, name)),
"command_topic": '/'.join((prefix, OUTPUT_TOPIC, name, SET_SUFFIX)),
"payload_on": out_conf["on_payload"],
"payload_off": out_conf["off_payload"],
}
)
return MQTTMessageSend(
"/".join(
Expand Down Expand Up @@ -127,10 +127,10 @@ def hass_announce_sensor_input(
disco_prefix: str = disco_conf["prefix"]
sensor_config = get_common_config(sens_conf, mqtt_conf, mqtt_options)
sensor_config.update(
dict(
unique_id=f"{mqtt_options.client_id}_{sens_conf['module']}_sensor_{name}",
state_topic="/".join((prefix, SENSOR_TOPIC, name)),
)
{
"unique_id": f'{mqtt_options.client_id}_{sens_conf["module"]}_sensor_{name}',
"state_topic": '/'.join((prefix, SENSOR_TOPIC, name)),
}
)
if "expire_after" not in sensor_config:
sensor_config["expire_after"] = sens_conf["interval"] * 2 + 5
Expand Down
4 changes: 2 additions & 2 deletions mqtt_io/modules/gpio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import asyncio
import logging
from concurrent.futures import ThreadPoolExecutor
from enum import Enum, Flag, auto
from enum import Enum, Flag, IntFlag, auto
from typing import Any, Callable, Dict, Iterable, List, Optional

from ...types import ConfigType, PinType
Expand Down Expand Up @@ -48,7 +48,7 @@ class InterruptEdge(Enum):
BOTH = auto()


class InterruptSupport(Flag):
class InterruptSupport(IntFlag):
"""
Classifies the kind of support a GPIO module has for interrupts.

Expand Down
2 changes: 1 addition & 1 deletion mqtt_io/modules/gpio/mcp23017.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class GPIO(GenericGPIO):
| InterruptSupport.SET_TRIGGERS
)
PIN_SCHEMA = {
"pin": dict(type="integer", required=True, min=0, max=15),
"pin": {"type": 'integer', "required": True, "min": 0, "max": 15},
}

def setup_module(self) -> None:
Expand Down
4 changes: 2 additions & 2 deletions mqtt_io/modules/gpio/mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from . import GenericGPIO, InterruptEdge, InterruptSupport, PinDirection, PinPUD

REQUIREMENTS = ()
CONFIG_SCHEMA = dict(test=dict(type="boolean", required=False, default=False))
CONFIG_SCHEMA = {"test": {"type": 'boolean', "required": False, "default": False}}


# pylint: disable=useless-super-delegation,too-many-instance-attributes
Expand All @@ -24,7 +24,7 @@ class GPIO(GenericGPIO):
| InterruptSupport.CAPTURE_REGISTER
)
PIN_SCHEMA = {
"test": dict(type="boolean", required=False, default=False),
"test": {"type": 'boolean', "required": False, "default": False},
}

def __init__(self, config: ConfigType):
Expand Down
59 changes: 27 additions & 32 deletions mqtt_io/modules/sensor/ads1x15.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,15 @@

REQUIREMENTS = ("adafruit-circuitpython-ads1x15",)
CONFIG_SCHEMA: CerberusSchemaType = {
"chip_addr": dict(type="integer", required=False, empty=False, default=0x48),
"type": dict(
type="string",
required=True,
empty=False,
allowed=SENSOR_TYPES,
),
"pins": dict(type="list", required=True, empty=False, allowed=[0, 1, 2, 3]),
"gain": dict(
required=False,
empty=False,
allowed=[0.6666666666666666, 1, 2, 4, 8, 16],
default=1,
),
"chip_addr": {"type": 'integer', "required": False, "empty": False, "default": 0x48},
"type": {"type": 'string', "required": True, "empty": False, "allowed": SENSOR_TYPES},
"pins": {"type": 'list', "required": True, "empty": False, "allowed": [0, 1, 2, 3]},
"gain": {
"required": False,
"empty": False,
"allowed": [0.6666666666666666, 1, 2, 4, 8, 16],
"default": 1
},
}


Expand All @@ -37,20 +32,20 @@ class Sensor(GenericSensor):
"""

SENSOR_SCHEMA: CerberusSchemaType = {
"type": dict(
type="string",
required=False,
empty=False,
allowed=["value", "voltage"],
default="value",
),
"pin": dict(
type="integer",
required=True,
empty=False,
allowed=[0, 1, 2, 3],
default=0,
),
"type": {
"type": 'string',
"required": False,
"empty": False,
"allowed": ['value', 'voltage'],
"default": 'value',
},
"pin": {
"type": 'integer',
"required": True,
"empty": False,
"allowed": [0, 1, 2, 3],
"default": 0,
},
}

def setup_module(self) -> None:
Expand Down Expand Up @@ -90,10 +85,10 @@ def get_value(self, sens_conf: ConfigType) -> SensorValueType:
# acquire the lock
with self.lock:
sens_type = sens_conf["type"]
data = dict(
value=self.channels[sens_conf["pin"]].value,
voltage=self.channels[sens_conf["pin"]].voltage,
)
data = {
"value": self.channels[sens_conf['pin']].value,
"voltage": self.channels[sens_conf['pin']].voltage,
}

return cast(
float,
Expand Down
30 changes: 15 additions & 15 deletions mqtt_io/modules/sensor/adxl345.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@

REQUIREMENTS = ("adxl345",)
CONFIG_SCHEMA: CerberusSchemaType = {
"chip_addr": dict(type="integer", required=True, empty=False),
"output_g": dict(type="boolean", required=False, empty=False),
"chip_addr": {"type": 'integer', "required": True, "empty": False},
"output_g": {"type": 'boolean', "required": False, "empty": False},
}


Expand All @@ -32,13 +32,13 @@ class Sensor(GenericSensor):
"""

SENSOR_SCHEMA: CerberusSchemaType = {
"type": dict(
type="string",
required=False,
empty=False,
default="all",
allowed=["all", "x", "y", "z"],
)
"type": {
"type": 'string',
"required": False,
"empty": False,
"default": 'all',
"allowed": ['all', 'x', 'y', 'z'],
}
}

def setup_module(self) -> None:
Expand All @@ -59,10 +59,10 @@ def get_value(self, sens_conf: ConfigType) -> SensorValueType:

return cast(
float,
dict(
x=all_axes["x"],
y=all_axes["y"],
z=all_axes["z"],
all_axes=dumps(all_axes),
)[sens_type],
{
"x": all_axes['x'],
"y": all_axes['y'],
"z": all_axes['z'],
"all_axes": dumps(all_axes),
}[sens_type],
)
14 changes: 7 additions & 7 deletions mqtt_io/modules/sensor/aht20.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ class Sensor(GenericSensor):
"""

SENSOR_SCHEMA = {
"type": dict(
type="string",
required=False,
empty=False,
default="temperature",
allowed=["temperature", "humidity"],
)
"type": {
"type": 'string',
"required": False,
"empty": False,
"default": 'temperature',
"allowed": ['temperature', 'humidity'],
}
}

def setup_module(self) -> None:
Expand Down
28 changes: 14 additions & 14 deletions mqtt_io/modules/sensor/bme280.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

REQUIREMENTS = ("smbus2", "RPi.bme280")
CONFIG_SCHEMA: CerberusSchemaType = {
"i2c_bus_num": dict(type="integer", required=True, empty=False),
"chip_addr": dict(type="integer", required=True, empty=False),
"i2c_bus_num": {"type": 'integer', "required": True, "empty": False},
"chip_addr": {"type": 'integer', "required": True, "empty": False},
}


Expand All @@ -20,13 +20,13 @@ class Sensor(GenericSensor):
"""

SENSOR_SCHEMA: CerberusSchemaType = {
"type": dict(
type="string",
required=False,
empty=False,
default="temperature",
allowed=["temperature", "humidity", "pressure"],
)
"type": {
"type": 'string',
"required": False,
"empty": False,
"default": 'temperature',
"allowed": ['temperature', 'humidity', 'pressure'],
}
}

def setup_module(self) -> None:
Expand All @@ -48,9 +48,9 @@ def get_value(self, sens_conf: ConfigType) -> SensorValueType:
data = self.bme.sample(self.bus, self.address, self.calib)
return cast(
float,
dict(
temperature=data.temperature,
humidity=data.humidity,
pressure=data.pressure,
)[sens_type],
{
"temperature": data.temperature,
"humidity": data.humidity,
"pressure": data.pressure,
}[sens_type],
)
Loading
Loading