ホーム » コンピュータ (ページ 4)

コンピュータ」カテゴリーアーカイブ

システム

最近の投稿

  • この一週間の必需品
    6/22頃からの風邪の症状。鼻水と喉の痛みがあって、鼻スプレーと喉スプレーでだましだましの2週間。 […]
  • あづぃ…
    2F廊下温度35℃、WBGT30℃越え。 […]
  • gemini-cli 便利
    Gemini をコマンドラインから使えるツール gemini-cli が公開されている。 […]
  • LINE bot が動いていない… 月当たり最大数オーバー
    我が家では、以前より 自宅専用の LINE bot を動かしていて、サーバからの通知に使っていた。 […]
  • rkhunter の設定
    卒研のセキュリティの説明の中で rkhunter を紹介。説明してたら、自宅サーバにはサーバ機以降後に […]

アーカイブ

カテゴリー

CO2とファンヒータと電気代

うーん、Switchbot CO2センサーのおかげで、ファンヒータ使っててCO2濃度が 5000[ppm] 越えると、エアコンに切り替えてるけど、電気代あがってるなぁ…。灯油を買いに行く頻度は下がってるけどさぁ。

通販会社に間違った発信履歴が残ってる?

以前から、通販会社から、かけたはずのない電話だけど、着信があったので内容を確認したいとの電話がかかってくることが、だいたい月に1度ペースで発生している。ということで、下記の内容をケーブルテレビさんに以下の問い合わせのメールを送る。


(概要) 電話をかけていないのに、通販会社に電話がかかっていたと電話がかかってくる。

(詳細) 1/25(土),18:00頃に通販会社リライブから、「昨日1/24,03:30(金)に着信があったので、内容を確認したい」との電話があった。相手は昨日と言っているが、早朝の電話なので1/25,03:30の可能性もある。相手側の着信履歴のあった電話番号は 0120-652-414 (HPでリライブなのは確認済み)
別の通販(電話番号も異なる)からも同様の電話が月に1度くらいの頻度で電話がある。こういった電話がかかってくるたびに状況を相手に問い合わせをしているが、特徴としてどの電話も03:30頃の着信らしい。

  1. これらのことを踏まえ、こちらの電話番号0778-xx-xxxxからの発信履歴の有無を確認してほしい。
    以前に発信履歴の郵送サービスを利用していたが、こちらからからの発信履歴が無いにもかかわらず同様の電話があった。
  2. au 電話で間違った発信者番号通知が伝わるといったトラブルはありませんか?
  3. もしくは通販会社が電話がかかってきたという嘘の証言をしながら、商品勧誘の電話をしているという噂はありませんか?

個人的には 3. を疑ってるけど、AM3:30頃っていう変な共通点があるからなぁ…

saslauthd の起動で smtpd chroot 解除

postfix の更新が入ったようだけど、以前から postfix 更新のたびに動かなくなることが多かった saslauthd がうまく起動しないトラブルが再発。
postfix での smtpd 起動がセキュリティ対策のために chroot 起動にしていて、saslauthd が chroot のファイルを正しくアクセスできないのが原因。でも、debian の default 設定の 非chroot の設定だし、debian 推奨設定ということで chroot 起動を解除することにした。

homebridge-cmdswitch2更新とchild-bridge機能

homebridge child-bridge

homebridgeの更新の中で、child-bridge という機能が実装された様子。これによる影響なのか、Google Home でつながらない現象が発生していると思われる。homebridge-cmdswitch2 のプラグインが、child-bridge を使うように変更されている。

$ sudo ps ax | grep homebridge
22887 ?        Sl     0:21 homebridge
23934 ?        Sl     0:03 homebridge: homebridge-cmdswitch2
24010 pts/2    S+     0:00 grep homebridge

{
    "platform": "cmdSwitch2",
    "name": "cmdSwitch2",
    "switches": [
        {
            "name": "テレビ",
            --(略)--
        }
    ],
    "_bridge": {
        "username": "0E:7D:87:xx:xx:xx",
        "port": 53178
    }
}

これにより、child bridge が別の homebridge のように見えていると思われるので、Google Home 側で別デバイスとして child bridge を認識させないとダメということかな。

homebridge-cmdswitch2 の更新

ただ、cmdswitch2 だけど、プラグインの更新が必要みたい。homebridge-cmdswitch2(ver 0.2.10)は、homebridge-cmdswitch2-no-logs に移行されているようなので、こっちの方が先決かな。

homebridge-cmdswitch2-no-logs の status 監視のトラブル

homebridge-cmdswitch2 の後継プラグインの homebridge-cmdswitch2-no-logs に入れ替えたけど、各機器のON/OFF状態を cec-client でとるように設定し polling 設定をすると、頻繁に状態監視をすることになり、ほかのデバイスの on/off 監視と競合が発生する。このため、polling 設定は削除。

プラグインを更新したら、「child bridge の方がいいよ」といった説明も出てこないし、child bridge機能は見送り。

追記:homebridge-cmdswitch2 に戻す

cmdswitch2-no-logs に切り替えたけど、”OK google, テレビをつけて”と命令すると、テレビを消す動作はするものの “homebrigeに接続できません” と言われる。

しかたがないので、homebridge-cmdswitch2 に戻し、child-bridge ナシの設定とする。

Google HomeでSwitchbotを使う/メモ

Google Assistantにてシーンを音声操作する

Switchbot Requests reached the daily limit

一昨日から朝になるとSwitchbotの情報が取れなくなっている。

Requests reached the daily limit

確認すると、アクセス数の上限制限になっているようで、以下のような結果が返ってきている。nagios4 で switchbot の動作状況をモニタリングしているけど、まずは message 欄が、nagios の LOG に残るように若干プログラムを修正。

さて、アクセス回数どうやって減らすかな。

{
  "statusCode": 190,
  "body": {},
  "message": "Requests reached the daily limit"
}

Gemini に聞いてみたら、munin には graph_period というのがあるらしいな。Gemini の回答は、graph_period の後に 秒数を指定すればいいような説明をしてくれるが、実際に graph_period で検索しても “graph_period second” とか “graph_period minute” 都下の説明しかでてこない。

munin fetch は最終値取得ではない

そのほかの原因としては、munin を動かすだけでなく、異常検知の nagios や homebridge 経由で温湿度などを google home などでも参照できるようにしているのが原因と疑う。nagios で munin で取得した値を参照するためには、munin に fetch コマンドを発行していたけど、fetch で最終値を読み取るのではなく、fetch により munin のプラグインを起動しているらしい(大きな勘違い)ので、request回数を減らすのには意味がなかったのに気づく。

しかたがないので、munin のプラグインで最終値をファイルに保存する処理を加え、nagios のプラグインでは、保存した値を読み出すように機能を変更した。

この勘違いのおかげで homebridge & google-home の温湿度参照で munin のプラグインを何度も起動することになっていたのが敗因だな。

アクセス回数制限のカウンタリセットのタイミング

回数制限でデータが取れなくなった状態が復帰した時間は 09:00 ということからすると、制限のカウンタがリセットされるのは、GMT 0:00 なのかな。

朝につながらないSwitchbot

なぜか2日つづけて、朝7:00-9:00 の間に Switchbot につながらないのが発生。
LOGをみると 内部エラー(190) のステータスコードが帰ってきている。

Windows 11のミニPC

今まで使っていた Windows 10 のサポート切れもあるし、Windows 11 マシンに切り替えを検討していたが、自宅仕事なのでパワーもさほど必要がないので、GMKtec のミニPC AMD Ryzen 7 PRO 6850Hを購入。

Windows 11 pro なのもいいね。

PassMark ベンチマーク

Switchbot APIが急に動かなくなった

Switchbot のデータを、OpenWonderLabs / Switchbot API v1.1 を使って munin でグラフ化していたが、2024/12/16,16:35(JST) から急にデータが取れなくなっている。

自作の Shell Script の問題かと思ったが、Python のコードでも Forbidden が表示されるので、原因は別かな。
api.switch-bot.com のトラブルかなぁ…

t=1734352549278
nonce=83e7a2f9-7ece-4971-9157-9aac14cd229f
sign=Frytn5FFDK0dUYE9XUEQF+v30V1WhAGKIo4qHAMiy7I=
{
  "message": "Forbidden"
}

(2024-12-17追記)

2024/12/17(火) 12:00 に復旧した様子。こっちで特に何かしたわけでもなく、勝手に復帰した。
やっぱりサーバの問題だろうな。
復帰状態でブラウザで https://api.switch-bot.com/ にアクセスすると、Forbidden じゃなく { “message”:”Missing Authentication Token” } が表示される。(昨日トラブル時は Forbiddenだった)

Switchbot さんには、先日 温度計の battery 項目が 100% で正しい値が取れないって報告してるし、その辺の修正が利いてないかと期待したけど、相変わらず 100% だな。

MuninでSwitchBot CO2センサーのプラグイン

Muninで、Switchbot の CO2 センサーをモニタリングするためのプラグイン

#!/bin/bash                                                                                                     

#%# family=auto                                                                                                 
#%# capabilities=autoconf                                                                                       

available="yes"

#
# SwitchBot
#
token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
swbot_url="https://api.switch-bot.com"

# for v1.1                                                                       
url_list_v11="${swbot_url}/v1.1/devices"
t=$(/bin/date +%s%3N)   # time = Epoch time 13 digits                                                           
nonce=$(/usr/bin/uuidgen)   # uuid                                                                              
sign=$(echo -n "$token$t$nonce" | /usr/bin/openssl dgst -sha256 -hmac "$secret" -binary | /usr/bin/base64 -w 0)

# SwitchBot meter CO2センサーのデバイスID
deviceId="xxxxxxxxxxxx"

function status() {
    url_list_v11_meter="${url_list_v11}/${deviceId}/status"
    /usr/bin/curl -s --request GET \
          -H "Content-Type: application/json" -H "Authorization: ${token}" \
          -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \
          "${url_list_v11_meter}" \
    | /usr/bin/jq -r '.body | "temperature.value " + (.temperature|tostring) + "\nhumidity.value " + (.humidity\
|tostring) + "\nCO2.value " + (.CO2|tostring)'
}
case $1 in
    autoconf )
        if [ "$available" = "yes" ]; then
            echo "yes"
            exit 0
        fi
        ;;
    config)
        echo "graph_title     SWBOT Meter CO2 温度/湿度/CO2 (リビング)"
        echo "graph_category  sensors"
        echo "graph_vlabel    温度[C]/湿度[%]/CO2[ppm]"
        echo "graph_args      -l 0 -u 70"

        echo "temperature.label   温度[C]"
        echo "temperature.draw    LINE2"
        echo "temperature.colour  00FF00"
        echo "temperature.warning 30"

        echo "humidity.label  湿度[%]"
        echo "humidity.draw   LINE2"
        echo "humidity.colour 00E0FF"

        echo "CO2.label     CO2[ppm]/100"
        echo "CO2.draw      LINE2"
        echo "CO2.cdef      CO2,0.01,*"
        #echo "CO2.warning  25"                                                                                 
        exit 0
        ;;
esac
status

Muninで取得した値を、nagios4 で確認するためのプラグイン。

#!/usr/bin/perl

use strict ;
use warnings ;

use Net::Telnet ;

my $telnet = new Net::Telnet( Host => "127.0.0.1" , Port => 4949 , Timeout => 30 ) ;

$telnet->open() or die( "Can't connect" ) ;
$telnet->waitfor( '/#.*$/' ) ;

# munin で読み込む項目を指定
$telnet->print( "fetch switchbot_meter_co2\n" ) ;

my $flag = 0 ;
my %value = () ;

# データを読み込む
while( my $line = $telnet->getline() ) {
    last if ( $line =~ /^\.$/ )  ;
    if ( $line =~ /^([0-9a-zA-Z_]+)\.value\s+([\.0-9]+)\s*$/ ) {
	$value{$1} = $2 ;
	$flag = 1 ;
    }
}
# nagios プラグインとして範囲を確認
my $st = 0 ;
my $item = "-" ;

my %status = ( 0 => "OK" , 1 => "Warning" , 2 => "Critical" , 3 => "Unknown" ) ;

if ( exists( $value{'temperature'} ) ) {
    if ( $value{'temperature'} > $ARGV[1] ) {
	$st = 2 ; $item = "temperature" ;
    } elsif ( $value{'temperature'} > $ARGV[0] ) {
	$st = 1 ; $item = "temperature" ;
    }
}

if ( exists( $value{'CO2'} ) ) {
    if ( $value{'CO2'} > $ARGV[3] ) {
	$st = 2 ; $item = "CO2" ;
    } elsif ( $value{'CO2'} > $ARGV[2] ) {
	$st = 1 ; $item = "CO2" ;
    }
}

if ( !$flag ) {
    $st = 3 ; $item = "Error" ;
}

# 最終結果の出力
printf( "SBMT_MeterCO2 %s %s %2.1f[C] %2.0f[%%] %4.0f[ppm]\n" ,
	$status{$st} , $item ,
	$value{'temperature'} , $value{'humidity'} , $value{'CO2'} ) ;

exit $st ;

Nagios のプラグインを Perl で書いておいたけど、少しでも軽い処理にしたいので lua(lua50) で書き直し

#!/usr/bin/lua

local temp , hum , co2 ;
local temp_w_max , temp_c_max = 25 , 30
local hum_w_max ,  hum_c_max  = 11 , 22
local co2_w_max ,  co2_c_max  = 2500 , 5000

function find_value( str , pattern )
   local p_start , p_end = string.find( str , pattern )
   local s_val = string.sub( str , p_end + 1 )
   local p_nl  = string.find( s_val , "\n" )
   local val   = string.sub( s_val , 1 , p_nl )
   return tonumber( val )
end

-- 温度条件
if table.getn(arg) >= 2 then
   temp_w_max = tonumber( arg[1] )
   temp_c_max = tonumber( arg[2] )
end

-- 湿度条件
-- if table.getn(arg) >= 2 then
--    hum_w_max = tonumber( arg[1] )
--    hum_c_max = tonumber( arg[2] )
-- end

-- CO2条件
if table.getn(arg) >= 4 then
   co2_w_max = tonumber( arg[3] )
   co2_c_max = tonumber( arg[4] )
end

fh = assert( io.popen( "/usr/bin/echo -e 'fetch switchbot_meter_co2\nQUIT\n' | /bin/nc 127.0.0.1 4949" , "r" ) )
lines = fh:read("*a")
fh:close()

temp = find_value( lines , "temperature.value" )
hum  = find_value( lines , "humidity.value" )
co2  = find_value( lines , "CO2.value" )

if temp >= temp_c_max then
   mes = "Critical temperature"
   ret = 2
elseif temp >= temp_w_max then
   mes = "Warning temperature"
   ret = 1
elseif co2 >= co2_c_max then
   mes = "Critical CO2"
   ret = 2
elseif co2 >= co2_w_max then
   mes = "Warning CO2"
   ret = 1
else
   mes = "OK -"
   ret = 0
end

-- 結果を返す
print( string.format( "SWBT_MeterCO2 %s %3.1f[C] %2.0f[%%] %3.0f[ppm]" , mes , temp , hum , co2 ) )
os.exit( ret )

比較検証

「/usr/bin/time -v コマンド」を用いて、各プログラムのメモリ使用量などで比較してみた。lua で書いたものが一番軽量。luac でコンパイルも試したけど、luac で生成されたバイトコードを起動するために、lua コマンドを使うため、コンパイルの効果は薄かった。

Munin の Shell を使った SwitchBot 参照 --    最大メモリ使用量 17,960 kB
nagios4 の Munin 参照の Perl プログラム --   最大メモリ使用量 10,176 kB
nagios4 の Munin 参照の lua5.0 プログラム -- 最大メモリ使用量  2,604 kB

Google 検索

My Google   Yahoo

Microsoft

ファンサイト