# 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()