2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【1000円】で業務用のレシートプリンタを家庭に導入し、ブラウザの右クリックでメモを印刷できるようにした

2
Posted at

ある日のことでした

image.png

ふと思いました。

家にレシートプリンタがあったら楽しいだろうな。

さらに思いました。

ブラウザで見ているページや選択した文章を、右クリックでそのまま印刷できたら最高だろうな。

この時点で「何を言っているんだ、こいつは」と思った方は正常です。今すぐこの記事を読むのをやめてください。

【やめる】 【読む】

中古の業務用レシートプリンタを家庭内LANへ接続し、Chromeの右クリックメニューから印刷できるようにします。

  • ページタイトル
  • 選択した文章
  • 元ページを開くためのQRコード

買い物メモ、料理の材料、家族への伝言などが「ジジジッ」と爆速で紙になって出てきます。インクジェットプリンタのスピードなど、目じゃありません。

機種選定、プログラム、Chrome拡張、Linuxサーバーの構築は、すべて生成AIに相談しながら進めました。

完成するとこうなる

ブラウザで文章を選択し、右クリックします。

「レシートに印刷」を選ぶと、家庭内のレシートプリンタから次のような紙が出てきます。

image.png

スマートフォンのメモでも、普通のプリンタのA4用紙でもなく、細長いレシートとして出てくる。ただそれだけのことが、妙に楽しいです。

紙になった瞬間、ただのメモが「秘密指令」のように見えてきます。

今回使ったもの

項目 使用したもの
レシートプリンタ EPSON TM-T88V(LANモデル)
用紙 80mm感熱ロール紙
サーバー Proxmox上のDebian LXC
印刷サーバー Pythonで作成した小さなWeb API
ブラウザ連携 Chrome拡張(Manifest V3)
開発支援 生成AI
プリンタ購入価格 約1,000円

構成は次のようになります。

Chrome拡張からプリンタへ直接送るのではなく、間に小さな印刷サーバーを置きました。

こうしておくと、将来はスマートフォン、Home Assistant、Slack、レシピ管理サーバーなどからも同じプリンタを使えます。

レシートプリンタを仕入れる

LANへ直接接続できる業務用レシートプリンタは、中古市場にかなり流れています。飲食店や小売店で大量に導入され、システム更新時にまとめて放出されるのでしょう。某オークションサイトを探したところ、EPSONのTM-T88Vを発見しました。

出品価格は1,000円、入札ライバルなし。送料などを含めても、5,000円札でたっぷりお釣りが来ます。

買いましょう。買いました。

購入時は、最低限次を確認すると安心です。

  • LANインターフェース搭載モデルである
  • ACアダプターが付属する
  • 80mm用紙モデルである
  • カッター不良や印字不良の記載がない
  • できればESC/POS対応モデルだと情報が多い

同じTM-T88Vでも、USB、シリアル、LANなどインターフェース違いがあります。

家庭内サーバーから使うなら、LANモデルが圧倒的に楽です。

クリームクレンザーで磨く

届いたプリンタは、いかにも「長年レジ横で働いてきました」という外観でした。業務用中古機なので当然です。

ぼろ布を固く水絞りし、少量のクリームクレンザーを付けて外装を磨きます。しばらく磨くと、かなりきれいになりました。この時点ですでに楽しく、1,000円分のもとを取った気分です。中古の業務機がきれいになると、急に「自宅設備の一員」という愛着もわきます。

初期化してLANへ接続する

本体を初期化し、DHCPでIPアドレスを取得させます。

プリンタの電源を切り、小さなボタンをクリップなどで押しながら電源を入れると、設定情報を印刷できる機種が多いです。詳しくは、AIに聞きましょう。すぐ教えてくれます。

印刷された紙から、次の情報を確認します。

  • MACアドレス
  • 現在のIPアドレス
  • DHCPの有効・無効
  • インターフェース情報

今回はDHCPでアドレスを取得させたあと、ルーター側でDHCP予約を設定しました。

例として、プリンタのアドレスを次のように固定します。

192.168.0.55

IPアドレスは、プリンタ本体へ固定値を書き込むより、DHCPサーバー側で予約するほうが管理しやすいと思います。

テスト印刷してみる

多くのLAN対応レシートプリンタは、TCPの9100番ポートへ印刷データを送ると動作します。

まずポートが開いているか確認します。

nc -vz 192.168.0.55 9100

接続できたら、ASCII文字で簡単な印刷テストをします。

printf '\x1b@HELLO WORLD!\n\n\n\x1dV\x00' \
  | nc -N 192.168.0.55 9100

printf:後ろに書いた文字や制御コードを出力するコマンド
|:その出力を、右側のコマンドへ渡す
nc:受け取ったデータを、LAN経由でプリンタへ送る

つまり全体では、

printfで印刷データを作り、ncでレシートプリンタへ送る

というコマンドです。このコマンドは、次の内容をプリンタへ送っています。

\x1b@:プリンタを初期化する命令
HELLO WORLD!:実際に印刷する文字
\n\n\n:3行分、紙を送る
\x1dV\x00:印刷した紙をカットする命令
nc -N 192.168.0.55 9100:これらをプリンタへネットワーク経由で送る

コマンドを実行すると、プリンタが動きました。

HELLO WORLD!

業務用なので、印刷は一瞬です。そして最後に「シャキン」と紙が切れました。
自分が送った数バイトのデータによって、業務用プリンタが音を立てて紙を吐き出す。

この時点で楽しさ倍増、1,000円の倍は元を取った気分です。

日本語とQRコードは画像として印刷する

単純な文字送信だけでも印刷できますが、日本語には少し問題があります。

レシートプリンタ本体が持っている文字コードや内蔵フォントへ合わせる必要があり、機種依存が大きいからです。

そこで今回は、次の方法にしました。

  1. サーバー側で文字を画像へ描画する
  2. QRコードも同じ画像へ配置する
  3. 完成した画像を白黒へ変換する
  4. ESC/POSのラスターデータとしてプリンタへ送る

この方式なら、日本語フォントの種類や文字サイズ、改行、中央揃えなどをサーバー側で制御できます。

TM-T88Vの80mmモデルは横方向576ドットですが、端まで使うと環境によって見切れることがありました。

最終的には左右に少し余白を取り、有効幅を536ドットとして使っています。

この「仕様上は入るはずなのに、実機では少し切れる」という調整も、中古業務機遊びの味わいです。

Proxmoxに印刷サーバーを作る

今回はProxmox上に、印刷専用の小さなDebian LXCコンテナを作りました。

大げさな性能は必要ありません。

  • 1 vCPU
  • メモリ512MB~1GB
  • ディスク数GB
  • Debian
  • Python
  • 日本語フォント
  • Pillow
  • QRコード生成ライブラリ

これで十分です。

プリンタへ直接届く家庭内LANに接続し、Web APIを80番ポートで公開します。

生成AIには、次のように依頼しました。

Debian上で動く、家庭内LAN専用のレシート印刷Web APIを作ってください。

プリンタはEPSON TM-T88VのLANモデルです。
IPアドレスは192.168.0.55、TCP 9100番ポートへ送信します。

POSTされたJSONから以下を受け取ってください。

- header: 見出し
- body: 本文
- url: QRコードにするURL

要件:
- 日本語はNoto Sans CJK JPで画像化する
- 用紙幅は80mm、画像幅は536ドット
- 見出しは太字で大きくする
- 本文は自動改行する
- URLがあれば縦横比を変えずにQRコードを付ける
- 最後に紙送りしてカットする
- /healthで死活確認できる
- systemdで自動起動する
- ログをjournalctlで確認できる
- インターネットには公開しない
- 必要なファイルと、貼り付けるだけの構築コマンドを順番に提示する

ポイントは、単に「印刷サーバーを作って」と頼むのではなく、入出力と完成条件を具体的に書くことです。

特に次の条件を先に決めておくと、AIとの往復が少なくなります。

  • プリンタの機種
  • 接続方法
  • 印刷幅
  • 受け取るデータ形式
  • 日本語の扱い
  • QRコードの有無
  • 自動起動
  • エラー確認方法

完成したAPIへ、まず手動でテスト送信します。

curl -X POST http://receipt-server/print \
  -H 'Content-Type: application/json' \
  -d '{
    "header": "家庭内レシートプリンタ",
    "body": "印刷テストに成功しました。",
    "url": "https://example.com/"
  }'

日本語の見出し、本文、QRコードが印刷されれば、サーバー側は完成です。

Chrome拡張を作る

次は、ブラウザの右クリックメニューから印刷できるようにします。

今回の動作は単純です。

  1. Webページ上で文章を選択する
  2. 右クリックする
  3. 「レシートに印刷」を選ぶ
  4. Chrome拡張が印刷サーバーへJSONを送る

送信内容は次のようにしました。

印刷項目 ブラウザから取得する内容
ヘッダー ページタイトル
本文 選択した文章
QRコード 現在のページURL

生成AIへの依頼は、次のようにしました。

Chrome Manifest V3対応の拡張機能を作ってください。

Webページで文章を選択して右クリックすると、
「レシートに印刷」というメニューを表示します。

選択されたら、家庭内の印刷サーバーへPOSTしてください。

送信先:
http://receipt-server/print

JSON:
{
  "header": ページタイトル,
  "body": 選択中の文章,
  "url": 現在のページURL
}

要件:
- Manifest V3を使う
- contextMenus APIを使う
- service workerからfetchする
- 家庭内HTTPサーバーへのhost_permissionsを設定する
- 印刷成功と失敗を通知する
- 拡張機能の全ファイルを提示する
- Chromeへの読み込み方も説明する

生成された拡張機能をフォルダーへ保存し、Chromeで次の画面を開きます。

chrome://extensions/

「デベロッパーモード」を有効にして、「パッケージ化されていない拡張機能を読み込む」を選びます。

作成したフォルダーを指定すると、右クリックメニューに「レシートに印刷」が追加されました。

最初の実用印刷

ブラウザでレシピを開き、材料欄を選択します。

右クリックして「レシートに印刷」。

プリンタが動き出します。

鶏もも肉のソテー

鶏もも肉 2枚
長ねぎ 1/2本
しょうゆ 大さじ2
酢 大さじ1

[元ページのQRコード]

台所へ持っていけば買い物メモになります。

QRコードをスマートフォンで読めば、元のレシピもすぐ開けます。

単なるWebページだった情報が、手のひらサイズの物体になりました。

これは、かなり楽しいです。

使い道を考える

一度、家庭内のどこからでも印刷できるようになると、用途はどんどん増えます。

  • 買い物リスト
  • レシピの材料
  • 今日の献立
  • 家族への伝言
  • 宅配便の発送メモ
  • Wi-Fi接続用QRコード
  • あとで読むWebページ
  • 家事のお願いカード
  • 服薬メモ
  • 「冷蔵庫にプリンがあります。1人1個」という家庭内速報

何を印刷しても、レシートの形になるだけで妙に業務感が出ます。

家族への伝言も、普通の付箋ではなく「正式に発券された案件」に見えてきます。

AIを使って便利だったこと

今回、AIにコードを書かせたこと自体よりも、実機で起きた問題を一つずつ相談できたことが役立ちました。

たとえば、次のような調整です。

  • 日本語が文字化けする
  • QRコードが小さすぎる
  • 右端が少し切れる
  • 本文が長いと用紙幅を超える
  • Chrome拡張からHTTPへ接続できない
  • OS再起動後にサーバーが起動しない
  • 印刷に失敗しても理由が分からない

エラーメッセージ、設定ファイル、印刷結果の写真をAIへ渡し、次の一手だけを出してもらいました。

特に実機を扱う場合は、最初から巨大な完成コードを作らせるより、

  1. プリンタとの疎通確認
  2. 英数字の印刷
  3. 日本語の画像印刷
  4. QRコード
  5. Web API
  6. Chrome拡張
  7. 自動起動

という順番で、動作確認を積み上げるほうがうまくいきます。

セキュリティ上の注意

今回の印刷サーバーは家庭内LAN専用です。

インターネットへ公開してはいけません。

公開すると、知らない誰かから延々とレシートを印刷される可能性があります。技術的には少し面白いですが、感熱紙代と家族の信頼を失います。

最低限、次の対策を行います。

  • ルーターで外部からの接続を許可しない
  • 印刷サーバーを家庭内LANだけで待ち受ける
  • 利用元IPをファイアウォールで制限する
  • Chrome拡張の接続先を固定する
  • APIへ送れる本文の長さを制限する
  • 印刷回数の上限を設ける
  • ログを残す

また、感熱紙は熱や日光で変色します。長期保存したい記録には向きません。

この「重要そうな紙なのに、やがて消える」という性質も、家庭内指令書にはちょうどよい気がします。

おしまい

某オークションでの仕入れ時間を除けば、所要時間はおよそ2時間でした。

手に入ったものは、家庭内LAN対応のレシートプリンタと、Chromeから右クリックで情報を物理化できる仕組みです。

実用性だけを考えれば、スマートフォンでメモを見れば済みます。

A4プリンタもあります。

それでも、ボタンを押すと「ジジジッ」と音を立て、細長い紙が出てきて、最後に「シャキン」と切れる。

その体験には、効率とは別の楽しさがあります。

業務用として生まれ、どこかの店舗で働き、1,000円で引き取られてきたレシートプリンタは、いまでは我が家で、

  • 買い物メモを出し
  • レシピを出し
  • 家族への伝言を出し
  • QRコードを出しています

中古の業務機と、小さなLinuxサーバーと、少しのAI。

それだけで、ブラウザの中にあった情報が、生活の中へ飛び出してきました。

家にレシートプリンタがある。

もう、その時点で楽しいのです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?