1

以下で私の質問が失われた場合に備えて、ホーム オートメーション システムに提示する必要があるのは、セルごとに情報を取得できる配列です。

次のコードを使用して、自宅の HVAC システムをポーリングするシリアル デバイスから読み取ります (このほとんどは、ここにある他の人の投稿からのコピーが不十分です)。

import time
import serial
import StringIO

# configure the serial connections
ser = serial.Serial(
        port='/dev/ttyS0',
        baudrate=9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS
)

input=1
while 1 :
        # Use static command to debug
        input = "stats"
        # Python 3 users
        # input = input(">> ")
        if input == 'exit':
                ser.close()
                exit()
        else:
                # send the character to the device
                # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
                ser.write(input + '\r\n')
                outputFCUData = ''
                # let's wait one second before reading output (let's give device time to answer)
                time.sleep(1)
                while ser.inWaiting() > 0:
                        outputFCUData += ser.read(1)

                if outputFCUData != '':
                        fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines()
                        fcuArrayTemp.pop(0)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        print fcuArrayTemp
                        exit()

フォーマットせずにデバイスをポーリングすると、結果は次のようになります。

stats
101 ON  070F 070F  Low  Heat OK 0
102 ON  069F 069F  Low  Heat OK 0
103 ON  069F 069F  Low  Heat OK 0
104 ON  069F 070F  Low  Heat OK 0
105 OFF 072F 064F  High Heat U5 0
OK
>
>

これは、コード内の Ipop(0)pop(-1)'s を使用して、必要な 5 行以外のすべての情報を削除する場合です。興味のある方のために、最初の列 (例: "101") は私のファンコイル名で、その後にステータス、設定値、現在の温度、ファン速度、モード (加熱/冷却)、エラー コード (例: 105 には t がありません) が続きます。 -stat であるため、U5 error) があり、最後の列はデバイスにコマンドを送信する際のエラーです。現在は何もないため、「0」です。

その出力を配列に変換して、たとえばfcuStatus[i][j]コマンドを呼び出して cell(i,j) から情報を取得できるようにします。

私のコードから得られるものは次のとおりです。

['101 ON  070F 070F  Low  Heat OK 0', '102 ON  069F 069F  Low  Heat OK 0', '103 ON  069F 069F  Low  Heat OK 0', '104 ON  069F 070F  Low  Heat OK 0', '105 OFF 072F 064F  High Heat U5 0']

これは 1 行 5 列のリストです。そのリストから要素を読み取って配列に追加するだけでよいと思います。だから私はコードを追加します:

for element in fcuArrayTemp
    parts = element.split(' ')
    print parts

だから今私の出力は次のとおりです。

['101', 'ON', '', '070F', '070F', '', 'Low', '', 'Heat', 'OK', '0']
['102', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['103', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['104', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0']
['105', 'OFF', '072F', '064F', '', 'High', '', 'Heat', 'U5', '0']

これは私が望むものにかなり近いですが、二重空白があるときに単一の空白で分割した結果、いくつかの余分な列が追加されています。

私のコードはずさんで、もっと良い方法があると信じなければなりません。outputFCUData誰かが変数で受け取った文字列情報を取得し、余分なスペースなしで機能配列に変換する方法を教えてもらえますか? 常に 8 列ですが、ファンコイルがシステムに追加されると、アレイは 128 行以上に拡張できます。上記のいずれも、特定の一連のガイドラインに準拠しようとしているからではなく、よくわからないためです。提案は大歓迎です。

編集-うわー-ラジオ-私が必要としていたものを正確に手に入れました-ありがとう!

for element in fcuArrayTemp
    parts = element.split()
    print parts

この最後の部分は、これらの整理されたリストを取得して、N 行 x 8 列の行列を作成する方法です。これは、append に引数が指定されていないとエラーになります。追加するアイテム (fcuArray.append(element)) に「要素」を追加しても、そこに到達しません。

fcuArray = []
for element in parts:
    fcuArray = fcuArray.append()
    print fcuArray

再度、感謝します

編集:私に役立つ解決策を見つけました-同様のものを探している他の人のためにここに投稿してください。秘訣は、リストが生成されたときに、リストから配列に各行を追加することでした。

fcuArray = []
for element in fcuArrayTemp
    parts = element.split()
    fcuArray.append(parts)

行と位置を要求することで、配列内の任意の値を報告できるようになりました。たとえば、アレイ内の 3 番目のファンコイルの名前を報告するには、fcuArray[3][0] (つまり、「104」を返す「print fcuArray[3][0]」) を要求します。

これが私の完全なコードです:

import time
import serial
import StringIO
import pprint

# configure the serial connections
ser = serial.Serial(
       port='/dev/ttyS0',
       baudrate=9600,
       parity=serial.PARITY_NONE,
       stopbits=serial.STOPBITS_ONE,
       bytesize=serial.EIGHTBITS
)

input=1
while 1 :
        # Use static command to debug
        input = "stats"
        # Python 3 users
        # input = input(">> ")
        if input == 'exit':
                ser.close()
                exit()
        else:
                # send the character to the device
                # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
                ser.write(input + '\r\n')
                outputFCUData = ''
                # let's wait one second before reading output (let's give device time to answer)
                time.sleep(1)
                while ser.inWaiting() > 0:
                        outputFCUData += ser.read(1)

                if outputFCUData != '':
                        fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines()
                        fcuArrayTemp.pop(0)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                        fcuArrayTemp.pop(-1)
                fcuArray = []
                for element in fcuArrayTemp:
                            parts = element.split()
                fcuArray.append(parts)
                print fcuArray
                print fcuArray[3][0]
                exit()
4

1 に答える 1

1

不要な列を削除するには、 に変更element.split(' ')するだけで十分です。element.split()

>>> for element in fcuArrayTemp:
...     print element.split()
...
['101', 'ON', '070F', '070F', 'Low', 'Heat', 'OK', '0']
['102', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0']
['103', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0']
['104', 'ON', '069F', '070F', 'Low', 'Heat', 'OK', '0']
['105', 'OFF', '072F', '064F', 'High', 'Heat', 'U5', '0']
于 2013-02-26T06:31:24.430 に答える