パパ教員の戯れ言日記

このブログの発信は個人としての発信です。こんな教員もいるのかと思っていただければ幸いです。

どのご家庭にもあるサーマルプリンタで、特定のキーワードがTwitterでつぶやかれると印刷されるようにしてみた

どのご家庭にもあるサーマルプリンタ…

細かいことは気にしないで行ってみましょうー!

ゴールはこんな感じです

サーマルプリンタの入手

どうしてもサーマルプリンタが無いご家庭は、購入するところからだと思いますが、いろいろな接続方法があります。

今回はUSB接続モデルの「TM-T88V(ヤフオクで4000円くらい」で説明していきます!

ヤフオクで買うときは、ACアダプタ付きを買いましょうね!ACアダプタだけあとで買おうとすると、独自のピンで結構な値段するのでお得感ゼロになります。

Raspberry Piの入手

今回の目的だけでしたら、Raspberry Pi Zero WHで十分です。

サクッと設定をしてしまいましょう。 

Beebotteの登録、IFTTTへのレシピ登録

Beebotteの登録については、以下のサイトが参考になりますし、1から解説しても同じ解説になりますので省略します。

qiita.com

IFTTTのレシピ登録については、私のレシピを載せておきます。

IFTTTの罠としては、escapeが "<<>>"って書いてあるのに、実際には"<<<>>>"じゃないとエスケープされないっていうことですかね…。

f:id:justsize:20191204052701j:plain

こんな感じ。

お察しの通り、Twitter検索はIFTTTで行いますので、タイムラグがあります。リアルタイムではありません。

印刷させる

こちらを参考にさせていただきました。

しかし、Twitterの発言は画像化するのがとても大変で、別の方法を使わないといけません。

kotatu99.hateblo.jp

短いワードでしたら、画像化でOKだと思いますが、Twitterの投稿は長い時もあり、短い時もあり。文字数を判別して改行入れて画像化…はちょっと骨が折れるので、直接プリンタにデータを送ってしまうことにしましょう。

参考にしたのはこちらです。

qiita.com

こちらに載っていた、日本語対応のpython-escposを入れます。

github.com

起動時に自動実行させるため、/etc/rc.local に記述するとなると、関連するライブラリはsudoして入れましょう。

pi@raspberrypi:~ $ lsusb
Bus 001 Device 002: ID 04b8:0202 Seiko Epson Corp. Receipt Printer M129C/TM-T70
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation root hub

こんな感じで、lsusbするとIDが04b8:0202となっているのを覚えておきます。

それで、こんな感じのPythonスクリプトを作ります。上記参考サイトのソースを参考にしています。

from escpos.printer import Usb
from escpos import *
import unicodedata
import sys
import io
import subprocess
import paho.mqtt.client as mqtt
import json

TOKEN = "YOURTOKENHERE"
HOSTNAME = "mqtt.beebotte.com"
PORT = 1883
TOPIC = "YOURTOPICHERE"

#プリンタの初期設定(さっき調べたIDの最初に0xをつける)
p = Usb(0x04B8, 0x0202)
p.jpInit()

#待受完了
def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(TOPIC)

#Beebotteからのメッセージ受信時
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))
    data = json.loads(msg.payload.decode("utf-8"))["data"]
    #コンソールにも一応表示
    print(data)
    #印刷させる
    p.jpText("Twitterの反応がありましたよ!\n")
    p.jpText(data)
    p.text("\n")
    #最後は用紙のカットを忘れずに
    p.cut()

#待受動作
client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
#client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

Pythonあまり触っていないので、あっていない部分があるかもですが、一応動くのでいいかなーと。笑

最後に、このスクリプトを自動起動するように、/etc/rc.localに記述しておしまいです。

pi@raspberrypi:~ $ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
/usr/bin/python3 /home/pi/tw2p.py &
/usr/bin/python /home/pi/ip.py &
exit 0

ip.pyは起動したらIPアドレスをFaebookメッセンジャーから教えてくれるスクリプトです。

こんな感じで、IFTTTでTwitterの投稿を検索→BeebotteからRaspiに通知→印刷の流れができました。

今回、「こんな感じ」って言いすぎ…

得意分野以外の説明が下手すぎますね。精進します!