« 2019年6月 | トップページ | 2019年10月 »

2019年7月

2019年7月 5日 (金)

DZ-D100 データ転送 daemon 作成

DZ-D100 の api と exiftool を使って,ruby で DZ-D100 から自動的に画像を取り込むデーモン dzd100.rb を作って,ファイルサーバ (ubuntu 16.04) 上で走らせた。

dzd100.rb は DZ-D100 (固定アドレスに設定) が wifi に現れるのを検出して,ファイルリストを調べ,ローカルよりも増えた画像があれば,ローカルにダウンロードする。さらに画像データに患者番号が埋め込まれていた場合は,患者別 documents folder にも画像をコピーする。

今までは,撮影後にメモリカードを 診察室の iMac に刺して,documents folder に画像を手でコピーしていたが,その必要が無くなって楽になった。

2019年7月 4日 (木)

Casio DZ-D100 API の解析

サポートに api の公開予定はないと言われて,ただ引き下がっている自分ではないので,購入した DZ-D100 でどんな api が使えるのか自分で解析してみた。

SessionOpen

本体の画像ファイルをダウンロードするのに SessionOpen が必要。SessionOpen すると,他端末からのアクセスは受け付けなくなる。arg に指定する数値は何でもよいようだ。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?cmd=SessionOpen&arg=0'

レスポンス

<?xml version="1.0"?>
<ccma>
<output>
<result>OK</result>
<operation name="SessionOpen">
</operation>
</output>
</ccma>

SessionClose

SessionClose すると,DZ-D100 の画面に「通信が切断されました」と表示される。SessionClose 後は他端末からのアクセスもできるようになる。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?cmd=SessionClose'

レスポンス

<?xml version="1.0"?>
<ccma>
<output>
<result>OK</result>
<operation name="SessionClose">
</operation>
</output>
</ccma>

CheckConnection

DZ-D100 は,起動後しばらく放置すると自動的に電源が切れ,通信も切れてしまう。通信を維持したい場合は,CheckConnection を一定時間毎に送り続ける必要がある。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?cmd=CheckConnection'

レスポンス

<?xml version="1.0"?>
<ccma>
<output>
<result>OK</result>
<operation name="CheckConnection">
</operation>
</output>
</ccma>

GetFileList

DZ-D100 に保存されている画像のリストを返す。なぜか最初に必ず NotExecuted が返ってくる。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?cmd=GetFileList&arg=All'

レスポンス

<?xml version="1.0"?>
<ccma>
<output>
<result>NotExecuted</result>
<operation name="GetFileList">
</operation>
</output>
</ccma>
<?xml version="1.0"?>
<ccma>
<output>
<result>OK</result>
<operation name="GetFileList">
<argument name="FileNumber" range="All">
<value>/DCIM/100CASIO/CIMG0001.JPG</value>
<value>/DCIM/100CASIO/CIMG0002.JPG</value>
<value>/DCIM/100CASIO/CIMG0003.JPG</value>
</argument>
</operation>
</output>
</ccma>

GetFileInfo

画像の基本的なデータを返す。これも最初になぜか NoExist が返ってくる。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?cmd=GetFileInfo&arg=/DCIM/100CASIO/CIMG0001.JPG'

レスポンス

<?xml version="1.0"?>
<ccma>
<output>
<result>NotExecuted</result>
<operation name="GetFileInfo">
<argument name="Reason">
<value>NoExist</value>
</argument>
</operation>
</output>
</ccma>
<?xml version="1.0"?>
<ccma>
<output>
<result>OK</result>
<operation name="GetFileInfo">
<argument name="/DCIM/100CASIO/CIMG0001.JPG">
<value name="type">JPEG</value>
<value name="size">4507328</value>
<value name="width">5184</value>
<value name="height">3888</value>
<value name="orientation">0</value>
<value name="thumb_size">4560</value>
<value name="thumb_width">160</value>
<value name="thumb_height">120</value>
<value name="thumb_orientation">0</value>
<value name="capture_date">20190618T110209</value>
</argument>
</operation>
</output>
</ccma>

data

jpeg 画像データがバイナリで返ってくる。OpenSession していない場合は何も返ってこない。

コマンド送信例

$ curl 'http://dzd100-address/casio_dc.cgi?data=/DCIM/100CASIO/CIMG0001.JPG&arg=Original' > test.jpg

2019年7月 3日 (水)

皮膚科専用カメラ Casio DZ-D100 購入

当院では開業以来,臨床写真の撮影に Nikon D40 + AF Micro Nikkor 60mm f2.8 + マクロスピードライトを使っていた。購入後10年以上たっており,そろそろ買い換えかなーと考えていた矢先,6月の日本皮膚科学会で,Casio が新開発した皮膚科専用カメラ DZ-D100 が紹介されていた。いろいろいじってみたところ,かなり使えそうだったので早速購入した。ちなみに,D40 は 624万画素,DZ-D100 は 2,016万画素で,隔世の感がある。でも高い(27インチ iMac が買える)

Casio DZ-D100 (左・中) と Nikon D40 (右)

DZ-D100 の魅力的だと思った点を挙げてみると,まずはその軽さがある。いままで使っていた D40 は全部で 1.6 kg,一方 DZ-D100 は 400 g である。さらに,1台で通常写真とダーモスコープ写真の両方を撮ることができ,通常モードでのマクロ撮影も可能である。

患者番号と医師名が画像に埋め込めるというのも大きい。起動時や撮影中に患者番号を入力すると,その後撮影した写真に患者番号が自動的に埋め込まれる。埋め込まれた情報は exif MakerNotes の Casio_Type2_0x311e (医師名),Casio_Type2_0x311f (患者番号) で参照できる。

$ exiftool -MakerNotes:* -s -u -g CIMG0001.JPG
---- MakerNotes ----
ObjectDistance                  : 0 m
Casio_Type2_0x2068              : 5184
Casio_Type2_0x2069              : 3888
Casio_Type2_0x206a              : 0.0012
Casio_Type2_0x206b              : 29.59
Casio_Type2_0x206c              : 640
Casio_Type2_0x206d              : 480
Casio_Type2_0x206e              : 0.029
Casio_Type2_0x206f              : 0.087
RecordMode                      : Unknown (102 0)
ReleaseMode                     : Normal
Casio_Type2_0x3029              : 8
Casio_Type2_0x311e              : dr1
Casio_Type2_0x311f              : 000001
Casio_Type2_0xf010              : ���1.01#6b#.�r.SICJVBNJ�����Q..,[...]

また,DZ-D100 は wifi でネットワークにつなぐことができ,windows のソフトを使うと wifi 経由で画像の取り込みができる。しかし,当然のことながら mac は非対応。api を教えてもらえれば自分でなんとかできると思って,サポートに問い合わせてみたが,api の公開予定はないとのことだった。

2019年7月 2日 (火)

orca パッチ後の受付トラブル〜原因

土曜日の orca パッチ後のトラブルであるが,原因は api のアップデートであった。

□対応範囲:API
□管理番号:request20181010-001
□問い合わせ(不具合)及び改善内容
 ORCA APIを使い受付一覧を取得する機能がありますが,ORCA上で受付順変更を行っても,
 APIで返されるXMLには新しい順番の情報は無く,
 [Acceptlst_Information_child]の出力順も,もともとの順番と変わりがありません.
 受付変更の結果をなんらかの形で取得できるようにして下さい.
□対応内容
 API受付一覧(/api01rv2/acceptlstv2)にて受付順変更を反映するようにしました。
 ────────────────────────────────────
□対応範囲:API
□管理番号:request20181121-001 request20190115-001
□問い合わせ(不具合)及び改善内容
 ・「患者基本情報の取得(patientgetv2)」で取得できる割引、状態、入金
 方法等について、「API患者登録(patientmodv2)」で登録できるようにしてほしい
 ・「API患者登録(patientmodv2)」で登録できる保険の資格取得日を
 「患者基本情報の取得(patientgetv2)」で取得できるようにしてほしい
 患者基本情報API(/api01rv2/patientgetv2)で、公費単独の保険確認日
 を取得できるようにしてほしい。
□対応内容
 API患者情報取得(/api01rv2/patientgetv2)の返却に保険の資格取得日、公費の確認日を追加しました。
 API患者保険組合せ取得(/api01rv2/patientlst6v2)の返却に公費の確認日を追加しました。
 API患者情報一括取得(/orca51/patientbasisallv3)の返却に公費の確認日を追加しました。
 API患者登録(/orca12/patientmodev2)に減免事由、割引率、入金方法を追加しました。

公費がある場合,api で返ってくる json property に追加があったため,dolphin 側で受付時に公費情報を取りに行ったタイミングで,jackson がデシリアライズに失敗して exception を吐いていた。

dolphin サーバの open.dolphin.orca パッケージを修正して,さらに,unknown property があっても jackson が無視するように設定した。これで今後知らないうちに property が追加されることがあったとしても止まらないで済むはず。

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

ちなみに,/orca51/patientbasisallv3 というのは現状非公開の拡張 api とのこと (by サポート)。また,patientmodev2 は patientmodv2 の間違いと考えられる。

2019年7月 1日 (月)

orca パッチ後の受付トラブル

土曜日の朝,いつものように orca を立ち上げたところ,「2019-06-25 パッチ提供(第46回)◆日医標準レセプトソフト ver 5.0.0 全17件」というのが目に付いたので,何気なくプログラム更新した。診療もいつも通り始まり,普通に6人目まで診療終了。しかしその後,7人目と8人目の受付で,orca で受付しても dolphin のリストに出ないとの連絡あり。確認してみると,サーバーログに以下のような exception が出ていた。

ERROR [stderr] (XNIO-1 task-5) com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Certificate_CheckDate" (class open.dolphin.orca.orcaapi.bean.PublicinsuranceInformation), not marked as ignorable

すぐに何とかなるエラーではなさそうだったので,バックアップマシンに切り替えて対応することにした。当院のサーバは xen の dom-U で構築しており,毎日診療終了後にメインからバックアップに丸ごとコピーされるようになっている。つまり,メインの dom-U をシャットダウンしてバックアップの dom-U を立ち上げると,今朝の診療開始前 (orca にパッチを当てる前) の状態でサーバが立ち上がる。バックアップに切り替えて,既に診療済みだった 6人のデータは失われたが,その後の診療は無事終了した。

トラブルシューティングは後に回すとして,バックアップに切り替える前に診療終了している6人分のカルテをどうするか。ここで,以前作っておいた Autosave が使えるのではないかと思いついた。

バックアップマシンの dom-U をシャットダウンして,メインの dom-U を立ち上げると,トラブル発生前に診療終了していた 6人分のカルテが現れた。これらを全てエディタで開いて,開いたまま OpenDolphin を kill した。 しかる後に,メインの dom-U をシャットダウンしてバックアップの dom-U を立ち上げ,6人分の受付をしてカルテを開けると「保存されていない編集中のカルテが見つかりました」のダイアログが出て,カルテを復活させることができた。

診療中にバックアップに切り替えるのは初めての経験であったが,データロスなく乗り切ることができた。Autosave がこんな形で役に立つとは思わなかった。

« 2019年6月 | トップページ | 2019年10月 »