1

私は Python を初めて使用し、数週間のプログラミングの学習と実践の後、ホーム オートメーション プロジェクトを開始しました。

私の目的は、私の Windows マシンで実行される C-Gate と呼ばれる Java ベースのサービスと対話することです。これは、Clipsal C-Bus 自動化システムによって送受信されるはるかに複雑なコマンドを解釈して通信します。

これまでのところ、telnelib と書き込み/読み取りコマンドを使用して 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
4

1 に答える 1

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)

Re ライブラリ ドキュメント: http://docs.python.org/2/library/re.html

更新: より詳細な whittie83 の質問に答えると、このプログラムを書く方法はたくさんあります。これはまだ Python の基本に関するものなので、少なくともいくつかのチュートリアルから学習することをお勧めします (例: http://docs.python.org/2/tutorial/ ) 。

とにかく、正規表現コードを次のように関数に入れます。

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 つにマージしたり、変数と関数をクラスに埋め込んだりできます。それはあなた次第です。

于 2013-05-24T06:38:23.373 に答える