hthiery/python-lacrosse

View on GitHub
pylacrosse/cli_tool.py

Summary

Maintainability
A
45 mins
Test Coverage
# Copyright (c) 2017 Heiko Thiery
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
# USA

import argparse
import codecs
import logging
import os
import time
try:
    from ConfigParser import (SafeConfigParser, NoOptionError)
except ImportError:
    from configparser import (SafeConfigParser, NoOptionError)

import pylacrosse

_LOGGER = logging.getLogger(__name__)

DEFAULT_DEVICE = '/dev/ttyUSB0'
def get_known_sensor_name(sensor_id, config):
    try:
        if str(sensor_id) in config.sections():
            name = config.get(str(sensor_id), 'name')
            return name
    except NoOptionError as e:
        return 'unknown'
    except AttributeError:
        return 'unknown'
    return 'unknown'


def scan_callback(sensor, config):
    name = get_known_sensor_name(sensor.sensorid, config)
    print('%s name=%s' % (sensor, name))


def configure(lacrosse, config, args):
    if args.frequency_rfm1:
        lacrosse.set_frequency(args.frequency_rfm1, 1)
    if args.frequency_rfm2:
        lacrosse.set_frequency(args.frequency_rfm2, 2)

    if args.datarate_rfm1:
        lacrosse.set_datarate(args.datarate_rfm1, 1)
    if args.datarate_rfm2:
        lacrosse.set_datarate(args.datarate_rfm1, 2)

    if args.toggle_mask_rfm1:
        lacrosse.set_toggle_mask(args.toggle_mask_rfm1, 1)
    if args.toggle_mask_rfm2:
        lacrosse.set_toggle_mask(args.toggle_mask_rfm2, 2)

    if args.toggle_interval_rfm1:
        lacrosse.set_toggle_interval(args.toggle_interval_rfm1, 1)
    if args.toggle_interval_rfm2:
        lacrosse.set_toggle_interval(args.toggle_interval_rfm1, 2)


def scan(lacrosse, config, args):
    lacrosse.register_all(scan_callback, user_data=config)
    lacrosse.start_scan()
    while True:
        time.sleep(1)

def get_info(lacrosse, config, args):
    info = lacrosse.get_info()
    print('name:     {}'.format(info['name']))
    print('version:  {}'.format(info['version']))
    if 'rfm1name' in info:
        print('rfm1name: {}'.format(info['rfm1name']))
        print('rfm1frequency: {}'.format(info['rfm1frequency']))
        print('rfm1datarate: {}'.format(info['rfm1datarate']))
        print('rfm1toggleinterval: {}'.format(info['rfm1toggleinterval']))
        print('rfm1togglemask: {}'.format(info['rfm1togglemask']))

def led(lacrosse, config, args):
    state = args.led_state.lower() == 'on'
    lacrosse.led_config(state)

def main(args=None):
    parser = argparse.ArgumentParser('LaCrosse sensor CLI tool.', formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument('-v', action='store_true', dest='verbose',
            help='be more verbose')
    parser.add_argument('-d', '--device', type=str, dest='device',
            help='set local device e.g. \'{0}\' or\n'
                 'set remote device e.g. \'rfc2217://[IP]:[PORT]\'\n'
                 'default: \'{0}\''.format(DEFAULT_DEVICE),
            default=DEFAULT_DEVICE)
    parser.add_argument('-f', type=str, dest='frequency_rfm1',
            help='set the frequency for RFM1')
    parser.add_argument('-F', type=str, dest='frequency_rfm2',
            help='set the frequency for RFM2')
    parser.add_argument('-t', type=str, dest='toggle_interval_rfm1',
            help='set the toggle interval for RFM1')
    parser.add_argument('-T', type=str, dest='toggle_interval_rfm2',
            help='set the toggle interval for RFM2')
    parser.add_argument('-m', type=str, dest='toggle_mask_rfm1',
            help='set the toggle mask for RFM1')
    parser.add_argument('-M', type=str, dest='toggle_mask_rfm2',
            help='set the toggle mask for RFM2')
    parser.add_argument('-r', type=str, dest='datarate_rfm1',
            help='set the datarate for RFM1')
    parser.add_argument('-R', type=str, dest='datarate_rfm2',
            help='set the datarate for RFM2')

    _sub = parser.add_subparsers(title='Commands')

    # list all devices
    subparser = _sub.add_parser('scan',
            help='Show all received sensors')
    subparser.set_defaults(func=scan)

    subparser = _sub.add_parser('info',
            help='Get configuration info')
    subparser.set_defaults(func=get_info)

    subparser = _sub.add_parser('led',
            help='Set traffic LED state')
    subparser.add_argument('led_state', type=str, choices=['on', 'off'],
            metavar="STATE", help='LED state')
    subparser.set_defaults(func=led)

    args = parser.parse_args(args)

    logging.basicConfig()
    if args.verbose:
        _LOGGER.setLevel(logging.DEBUG)

    try:
        config = SafeConfigParser()
        config.readfp(codecs.open(os.path.expanduser(
                '~/.lacrosse/known_sensors.ini'), 'r', 'UTF-8'))
    except IOError:
        config = None

    lacrosse = None
    try:
        lacrosse = pylacrosse.LaCrosse(args.device, 57600)
        lacrosse.open()
        configure(lacrosse, config, args)
        args.func(lacrosse, config, args)

    finally:
        if lacrosse is not None:
            lacrosse.close()

if __name__ == '__main__':
    main()