20
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WanoグループAdvent Calendar 2022

Day 24

STREAM DECK互換の仮想デバイスの紹介

Last updated at Posted at 2022-12-25

この記事は Wano Group Advent Calendar 2022の24日目の記事となります。
4日目Product-Led Growthまとめと25日目Notionとtandemで作る相談しやすいリモートワーク開発のすすめにも記事を書いているので、そちらもどうぞ。
また、グループ会社のEDOCODE(メインで仕事してます)のAdvent Calendar もありますので、よろしければそちらもどうぞ。

この記事に書いていること

個人的に開発しているSTREAM DECK互換の仮想ボタンデバイスのMyDeckについて書きます。

MyDeck とは?

STREAM DECKと互換性のある仮想ボタンデバイスです。実物のSTREAM DECKデバイスをLinuxから使うのが不便だったので作り始めたのですが、実物がなくても開発したいとか、ブラウザでエミュレートできれば、色々面白いんじゃないか?
というところで、もともと、MyStreamDeckという名前で作っていましたが、MyDeckと変更しました。

デバイスを操作するライブラリはすでにあるpython-elgato-streamdeckを使っているので、それをラッピングするような形で作っています。

なお、まだまだ荒削りなところが多いです。というのと、Pythonはそんなにわかっていません。

MyDeckの特徴

  • STREAM DECKのデバイス制御を行うPython実装にラッピングする形で、仮想Deck及び物理STREAM DECKにアクセスできる
  • 言語はPython。仮想Deckの実装はVue.js
  • Python のスレッドでアプリケーションやゲームを動かすことが可能

ブラウザ上で動くものなので、スマートフォンのブラウザ上に表示しておけば、STREAME DECKを買わなくてもそれっぽく使えなくはないです。PC上のデスクトップの端っこに置いて便利ショートカットとして使うのもありかもしれません(Electronアプリでも作れば良いのかも)。

MyDeckの仮想Deckでできること

  • ボタンのPush(クリック)
  • ボタンへの画像表示
  • 右クリックでボタン設定

課題

  • メモリリークしてるっぽい...
  • 色々やってるうちにキーの反応が悪くなった...(↑が原因かも)

というのは、調査中です。

MyDeckのデモ

どんな感じで動くのデモです。

MyDeckの動作フロー

ざっくりなデバイスを動かすまでのフロー。

仮想デバイスについて

仮想デバイスは、python-elgato-streamdeck の StreamDeckクラスと(だいたい)互換性があるVirutalDeckのインスタンスです。

MyDeckのアプリの仕組み

MyDeckではボタンに表示するアプリを動かす仕組みがあります。
app_*から始まるソースコードにアプリのコードがあります。

アプリが動く仕組み

ざっくりとこんな感じで動きます。

簡単なアプリの例

デジタル時計をボタン上に表示するアプリの例です。

from PIL import Image, ImageDraw, ImageFont
from mydeck import ThreadAppBase, ImageOrFile
import datetime

# whole image size
X: int = 100
Y: int = 100

class AppClockDigital(ThreadAppBase):
    def set_image_to_key(self, key: int, page: str):
        now = datetime.datetime.now()
        im = Image.new('RGB', (X, Y), (0, 0, 0))
        font = ImageFont.truetype(self.mydeck.font_path, 25)
        draw = ImageDraw.Draw(im)
        time_text = "{0:02d}:{1:02d}:{2:02d}".format(now.hour, now.minute, now.second)
        draw.text((2, 33), font=font, text=time_text, fill="white")

        self.mydeck.update_key_image(
            key,
            self.mydeck.render_key_image(
                ImageOrFile(im),
                "",
                'black',
                True,
            )
        )

おしまい

ということで、MyDeckのご紹介でした。実際のスースコードは、GitHubを参照してください。

ちなみに、これを開発するために、STREAM DECKを2台買いました(1台はメルカリですが)。そして、最近、STREAM DECK +が出ましたね。さすがに買わないと思うので、対応はしないかも。

人材募集

現在、Wanoグループでは人材募集をしています。興味のある方は下記を参照してください。
JOBS | Wano Group

EDOCODEについては、以下をご参照ください。
Jobs at EDOCODE

20
5
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
20
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?