distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ if __name__ == '__main__': exit('Please use "client.py"') try: from logger import root_logger except ImportError as ex: exit("{} - {}".format(__name__, ex.msg)) import serial logger = root_logger.getChild(__name__) class SmartMeterSerial: """ Access a smart meter serial port. !!! Customized for Landis & Gyr E350 !!! http://www.mayor.de/lian98/doc.de/html/g_iec62056_struct.htm http://www.december.com/html/spec/ascii.html https://pyserial.readthedocs.io/en/latest/ http://www.baer-gmbh.com/downl/MBus-Komm-Modul-Beschreibung.pdf https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/e350 """ init_telegram = '\x2f\x3f\x21\x0d\x0a'.encode() # '/?! CR LF'
from collections import defaultdict from dataclasses import dataclass, astuple, field, asdict import time from logger import root_logger import pydantic from noolite import const APPROVAL_TIMEOUT = 5 MODE_SEND = 1 MODE_RECIEVE = 2 _toggles = defaultdict(lambda: 0) lg = root_logger.getChild('noolite') class MqttCommand(pydantic.BaseModel): """ Контейнер для безопасного переноса команды из json """ mode: int = 0 ctr: int = 0 togl: int = 0 ch: int = 0 cmd: int = 0 fmt: int = 0 d0: int = 0 d1: int = 0 d2: int = 0 d3: int = 0
from asyncio_mqtt import client as ac from asyncio_mqtt import Client, Will from logger import root_logger import noolite as noo import json import yaml from yaml.loader import FullLoader from logging import DEBUG import os loop = asyncio.get_event_loop() with open('/data/options.json') as f: cfg = json.load(f) print(str(cfg)) lg = root_logger.getChild('noolite_mqtt') lg.setLevel(cfg['log_level']) DEFAULT_LIGHT_TIMEOUT = 12 * 60 * 60 # все команды на включение света должны выполняются в форме TEMPORARY_ON с # дефолтным временем 12 часов на случай если кто-то забыл выключить свет он гарантировано выключится через 12 часов PREFIX = cfg['mqtt_prefix'] HA_PREFIX = f'homeassistant/{PREFIX}' ERR_PREFIX = f'{PREFIX}/err' ONLINE_TOPIC = f'{HA_PREFIX}/online' OFFLINE = dict( topic=ONLINE_TOPIC, payload='offline', ) MQTT_CONF = { 'hostname': cfg['mqtt_host'], 'username': cfg['mqtt_user'],