我对Python非常陌生,经过几周的学习和实践编程,我已经开始了我的家庭自动化项目。
我的目标是与在我的Windows机器上运行的基于Java的服务进行交互,称为C-Gate。然后,它解释并与发送的更复杂的命令进行通信。由我的Clipsal C-Bus自动化系统接收。
到目前为止,我已设法使用telnelib和write / read命令创建与C-Gate的连接。
我一直试图弄清楚的是如何使用C-Gate给出的响应并提取特定值(例如灯光的等级)并将其转换为我可以使用的变量。
从那里我应该能够扩展我的理解并开始构建一个界面来使用/监控这些值。
到目前为止,这是我的代码:
import telnetlib
HOST = "localhost"
PORT = "20023"
def read_until(cue, timeout=2):
print tn.read_until(cue, timeout)
def tn_write(text):
tn.write(text)
tn = telnetlib.Telnet(HOST, PORT)
tn_write('project load MYHOUSE\r\n')
read_until('200 OK.')
tn_write('project use MYHOUSE\r\n')
read_until('200 OK.')
tn_write('net open 254\r\n')
read_until('200 OK: //MYHOUSE/254')
tn_write('project start\r\n')
read_until('200 OK.')
tn_write('get 254/56/1 level\r\n')
tn_write('get 254/56/2 level\r\n')
tn_write('get 254/56/3 level\r\n')
tn_write('get 254/56/4 level\r\n')
tn_write('get 254/56/5 level\r\n')
tn_write('get 254/56/6 level\r\n')
tn_write('get 254/56/7 level\r\n')
tn_write('get 254/56/8 level\r\n')
read_until('300 //MYHOUSE/254/56/1: level=0\r\n')
然后打印以下回复:
201 Service ready: Clipsal C-Gate Version: v2.9.5 (build 2460) #cmd-syntax=1.0
200 OK.
200 OK.
200 OK: //MYHOUSE/254
200 OK.
300 //MYHOUSE/254/56/1: level=100
300 //MYHOUSE/254/56/2: level=0
300 //MYHOUSE/254/56/3: level=0
300 //MYHOUSE/254/56/4: level=0
300 //MYHOUSE/254/56/5: level=0
300 //MYHOUSE/254/56/6: level=0
300 //MYHOUSE/254/56/7: level=0
300 //MYHOUSE/254/56/8: level=0
答案 0 :(得分:1)
您可以通过几种方式执行此任务,但我建议您使用正则表达式。首先,应该稍微修改一下telnet代码:
def read_until(cue, timeout=2):
return tn.read_until(cue, timeout)
telnetReturnedValue = read_until('200 OK: //MYHOUSE/254')
将提取“级别”值的示例代码:
import re
rePattern = 'level=(\d+)'
matchTuple = re.search(rePattern,telnetReturnedValue)
if(matchTuple!=None):
levelValue = matchTuple.groups()[0]
print(levelValue)
重新库文档:http://docs.python.org/2/library/re.html。
更新: 回答更详细的whittie83的问题,有很多方法可以编写这个程序。它仍然是关于Python的基础知识所以我建议至少学习一些教程,例如:http://docs.python.org/2/tutorial/。
无论如何,我会把regexp代码放到这样的函数中:
import re
def parseTelnetOutput(output,rePattern='level=(\d+)'):
print(output)
matchTuple = re.search(rePattern,output)
if(matchTuple!=None):
someValue = matchTuple.groups()[0]
return(someValue)
#telnet functions definitions and telnet initiation
levelsList = [] #empty table for extracted levels
#some telnet commands...
tn_write('project load MYHOUSE\r\n')
print(read_until('200 OK.'))#not parsing, only printing
tn_write('net open 254\r\n')
parseResult = parseTelnetOutput(read_until('200 OK: //MYHOUSE/254/56/1'))
levelsList.append(parseResult) # adding extracted level into a table
tn_write('net open 254\r\n')
parseResult = parseTelnetOutput(read_until('200 OK: //MYHOUSE/254/56/2'))
levelsList.append(parseResult) # adding extracted level into a table
#etc...
for pr in levelsList: #iterating list of extracted levels
print(pr)
这只是一个建议。您可以将3个函数合并为1,将变量和函数嵌入到类中,依此类推。它是由你决定。