Windowsをホームサーバーにします。
ラズパイ側でコマンドを作って送信、Windows側でメモなどを印刷してもらいます。
印刷にはちょっとしたメモ程度のものを手ごろに扱えるサーマルプリンターを使ってみます。
「今から言うことをメモして」->「印刷して」という発話を認識してメモを生成。終了したら印刷するということを想定。
音声認識でコマンドを作る場合JuliusとGoogle Assistantの連携
現行のAssistantだとフレーズの後に無音が入ると速攻次のリクエスト待ちに変わります。この辺を処理する方法はちょっとトリッキーになってしまいます(tt;)。GoogleHomeの場合はクラウドサービスで処理しているようですが….。コードは公開準備中。
IFTTTを使ってもできると思いますが、クラウドサービスを使わない場合はこういうやりかたもあるってことで。
今回はコマンドを作成した後工程です。
サーマルプリンターの設定
今回はこれを使います。動作確認環境:Windows 10 (64bit)
Symcode 58MM USB サーマルレシートプリンター ESC/POS(Amazonで3699円)
質感・デザイン・サイズともにダサイですが、この値段なら……….?
ドライバーのインストールは付属のCDで行いますが、特に問題になる部分はないです。
USBポートはUSB001にして、「USB Port Check」が”Not USB Printer”というメッセージを出す場合がありますが無視していいです。
デバイス設定では、58x210mmにしておきます。これは1ページに排出する用紙の長さで、これより長いと無駄に用紙が消費されます。
Windowsのメモ帳などでフォントや余白も設定しておきます。
以下の設定だと、1ページに13x52=676文字印刷できます。
用紙はコクヨの感熱ロールペーパー ハンディターミナル用 RP-TH584H
幅58mm、外形40mm、長さ20m
これだと1巻で大体95ページ分使えます。5巻パックで1100円くらい。
ランニングコストは大体2.3円/ページ。ちなみに、キャノンのインクジェットの場合は
詰め替えインクを使った場合、A4では1枚当たり2.0~2.7円だそうです。
End of Pageのコードを送れれば無駄がなくなるんだけど…..。要調査
ロールペーパーのセットはいたって簡単。カバーを開けて放り込んで、端っこを少し出しておいて、パカンと閉じるだけ。
印刷はこんな感じ。
左は、GoogleAssistantに今日の天気を聞いた結果をメモとして印刷したもの。
右は676文字をフル印刷した結果。
Windows側
途中で改行が入っている場合1ページに収める処理は未実装です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket import threading # import json import urllib.parse # import tempfile import win32api import win32print PORT = 51000 MAX_MESSAGE = 8192 NUM_THREAD = 4 def print_out(text): filename = tempfile.mktemp (".txt") open (filename, "w").write (text) win32api.ShellExecute ( 0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter (), ".", 0 ) def text_shaping(text): line = text.split("\n") text = "" for x in line: if(len(x) > 13): temp = x while len(temp) > 13: left = temp[:13] text += left + "\n" right = temp[13:] temp = right text += right + "\n" else: text += x + "\n" return text def com_receive(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip_info = socket.gethostbyname_ex(socket.gethostname()) ip_list = ip_info[2] #print(ip_list) for x in ip_list: ip = x octet_list = ip.split(".") if(int(octet_list[2]) == 0): ip_address = ip break print("HOST:" + ip_address) sock.bind ((ip_address, PORT)) sock.listen (NUM_THREAD) #print ('receiver ready, NUM_THREAD = ' + str(NUM_THREAD)) while True: try: conn,addr = sock.accept() reception = conn.recv(MAX_MESSAGE).decode('utf-8') conn.close() obj = json.loads(reception) print_txt = obj['print'] if(print_txt != ""): print_txt = urllib.parse.unquote(print_txt) print_txt = text_shaping(print_txt) print_out(print_txt) except: print('Error') sock.close() def com_start(): th=threading.Thread(target=com_receive) th.start() if __name__ == "__main__": com_start() |
ラズパイ側
途中で改行が入っている場合1ページに収める処理は未実装です。
HOSTアドレスのXXは書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket import urllib.parse HOST = '192.168.0.<span style="color: #ff0000;">XX</span>' PORT = 51000 def com_send(mess): while True: try: # 通信の確立 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) # メッセージ送信 sock.send(mess.encode('utf-8')) # 通信の終了 sock.close() break except: print ('Error: ' + mess) if __name__ == "__main__": print_txt = "政府の記者会見では「気候変動に対処し強固な社会を築くために、化石燃料が必要ない福祉国家を目指します。" if(len(print_txt) > 676): print_txt = print_txt[:676] print_txt = urllib.parse.quote(print_txt) json_txt = '{"print":"' + print_txt +'"}' com_send(json_txt) |
Windowsをホームサーバーにする
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(1)
WindowsでWebブラウジング
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(2)
Windowsに接続しているサーマルプリンターでメッセージを印刷(プリントサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(3)
Windowsに保存した音源やビデオ再生、ストリーミング(メディアサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(4)
Windowsに接続した学習リモコンで家電制御(リモコンサーバー)
それぞれのWindowsなどの端末にメッセージを同時配信
Leave a Reply