Dateien nach "/" hochladen

main
thomas 2023-08-13 21:47:37 +00:00
commit b354d81cd1
1 changed files with 113 additions and 0 deletions

113
BS21.py 100644
View File

@ -0,0 +1,113 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'thomas'
import serial
import os
import argparse
##from datetime import datetime
verbosity=False
def log(param):
if verbosity:
print param
class BS21:
def __init__(self, dev='/dev/tty.BS21-21-000000-0-A-SPPDev', pin='1234'):
self.dev = dev
self.pin = pin
self.resp=None
def openSerialPort(self):
"""
open the serial port for the bluetooth SDP/RFCOMM connection
"""
try:
s = serial.Serial(
port=self.dev,
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=10)
#s.open() ## is alerady open? Ouch!
except serial.SerialException as e:
print "ERROR: "+e.message
s = None
log("... failed to open the serial port!")
return s
def command(self, cmd):
bs21 = self.openSerialPort()
if bs21==None:
log("something wrong, quitting")
print "ERROR"
exit()
log("connection established, write command "+cmd+"...")
bs21.write(cmd+"#"+ self.pin + "\r\n")
log("command transmitted, now waiting for response...")
resp = self.getResponse(bs21)
dollar=(resp[0][0]=='$')
if not dollar:
log("unexpected response: "+self.resp)
print "ERROR"
elif resp[0]=='$OK':
pass
elif resp[0][1:3]=='BS':
(hw, ver, unknown, hh, mm, ss) = resp[0].split(' ')
(str_bs, str_21, serialId, state, str_A) = hw.split('-')
print "Model "+str_bs[1:3]+"-"+str_21+" Serial ID="+serialId
print " Revision "+ver
if state == '1':
print " Power switch = ON"
elif state == '0':
print " Power switch = OFF"
else:
print " Power switch = UNKNOWN ("+state+")"
print " Time: "+hh+":"+mm+":"+ss
bs21.close()
def getResponse(self, bs21):
self.resp=bs21.readline().strip()
log("... got response: '"+self.resp+"'")
return self.resp.split('|')
if __name__=="__main__":
parser = argparse.ArgumentParser(
description='control Renkforce BS21 via Bluetooth',
epilog='''
Valid commands are either raw BS21 protocol like RELX, REL0, REL1, INFO, CLEAR00 (all uppercase)
or complex commands (all lowercase):
timer
...
optional: store bluetooth device in environment variable $BS21_DEV and the PIN in $BS21_PIN
''')
parser.add_argument('-v', '--verbose', help='increase verbosity', action="store_true")
parser.add_argument('-d', '--device', type=str, help='path to the device file for bluetooth connection')
parser.add_argument('-p', '--pin', type=str, help='the PIN to access BS21')
parser.add_argument('command', type=str, nargs='+', help='command (+args) to execute')
args = parser.parse_args()
if args.pin:
PIN=args.pin
else:
PIN=os.environ.get('BS21_PIN')
if not PIN:
PIN=raw_input("Enter the PIN: ").strip()
if args.device:
#TODO: check for existence
DEV=args.device
else:
DEV=os.environ.get('BS21_DEV')
if not DEV:
#TODO: search for resonable device /dev/tty.BS....
DEV="/dev/tty.BS-21-00NNNN-0-A-SPPDev"
if args.verbose:
verbosity=True
print "calling BS21 with device=%s and PIN=%s" % (DEV, PIN)
sw=BS21(DEV, PIN)
sw.command(' '.join(args.command))