2017年11月3日金曜日

FON2405Eのフラッシュメモリを交換→成功→LEDE・Openwrt導入

約1年ほど前にFON2405Eのフラッシュメモリを交換して失敗した。
http://continue-to-challenge.blogspot.jp/2016/11/fon2405e_28.html
またまた魔が差して、 他の基板からMX25L6405D (8192 Kbytes)を引っぺがして交換してみた。
もともと乗っていたのがMX25L8006Eだから上位品?。
すんなりU-Bootでのファーム書き換えはできた。

せっかくなので、OpenwrtからスピンオフしたというLEDEを導入してみることにした。


手順0 フラッシュ交換メモ

忘れそうなので・・・。
0.u-boot他を旧フラッシュからバックアップ
cat /dev/mtdblock0 > /tmp/mtdblock0.img  <Uboot>
cat /dev/mtdblock1 > /tmp/mtdblock1.img  <Config>
cat /dev/mtdblock2 > /tmp/mtdblock2.img  <RF>
3と4はu-bootから書き込むからここではバックアップしない
 mtdblock0-2.imgはPCに退避させておく

1.u-bootの起動メニューで「2」入力しコンソール?に入る
2.通電状態でフラッシュ交換する(ハイリスク!)
3.ファーム書き換えを実行
  KernelとRootFSが書き換えられ、その後linuxのブートに入る
4.新フラッシュにu-boot他を書き込む
cp /tmp/mtdblock0.img /dev/mtdblock0
cp /tmp/mtdblock1.img /dev/mtdblock1
cp /tmp/mtdblock2.img /dev/mtdblock2
今思えばu-bootさえ書き込めれば、あとはLEDE書き込むから
別にやらなくても良かった。

手順1 LEDEのカーネルソース入手

基本的には以下の手順だけど
https://lede-project.org/docs/guide-developer/the-source-code
https://lede-project.org/docs/guide-developer/use-buildsystem

具体的な手順は次のような感じ。簡単だね。
git clone https://git.lede-project.org/source.git
./scripts/feeds update -a
./scripts/feeds install -a 

手順2 FON2405E用にカスタマイズ・Device Tree Source (dts)を作成

オリジナルのFON2405Eとは違うのでFON2405EKAI(改)とした。
変更点をpatchにしてみた。 
完成するまでは紆余曲折あって大変だったけど。 改めてみると変更点って大したこと無いね。
(実は9月末くらいから悩みながらやっていた)
diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh
index 4411bab..2b2db97 100644
--- a/target/linux/ramips/base-files/etc/diag.sh
+++ b/target/linux/ramips/base-files/etc/diag.sh
@@ -304,6 +304,9 @@ get_status_led() {
zbt-wg3526-32M)
status_led="zbt-wg3526:green:status"
;;
+ fon2405ekai)
+ status_led="fon2405ekai:green:wps"
+ ;;
esac
}
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 07e776c..61c9fb2 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -457,6 +457,9 @@ ramips_board_detect() {
*"RT-G32 B1")
name="rt-g32-b1"
;;
+ *"FON2405E Kai")
+ name="fon2405ekai"
+ ;;
*"RT-N10+")
name="rt-n10-plus"
;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index 99ebe35..8e7df68 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -58,6 +58,7 @@ platform_check_image() {
f7c027|\
firewrt|\
fonera20n|\
+ fon2405ekai|\
freestation5|\
gb-pc1|\
gl-mt300a|\
diff --git a/target/linux/ramips/dts/FON2405EKAI.dts b/target/linux/ramips/dts/FON2405EKAI.dts
index e69de29..f811ca1 100644
--- a/target/linux/ramips/dts/FON2405EKAI.dts
+++ b/target/linux/ramips/dts/FON2405EKAI.dts
@@ -0,0 +1,94 @@
+/dts-v1/;
+
+#include "rt3050.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ compatible = "fon,fon2405ekai", "ralink,rt3050-soc";
+ model = "FON2405E Kai";
+
+ gpio-keys-polled {
+ compatible = "gpio-keys-polled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ poll-interval = <20>;
+
+ reset {
+ label = "reset";
+ gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_RESTART>;
+ };
+
+ wps {
+ label = "wps";
+ gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_WPS_BUTTON>;
+ };
+ };
+ gpio-leds {
+ compatible = "gpio-leds";
+ wan {
+ label = "fon2405ekai:green:wan";
+ gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+ };
+ LAN {
+ label = "fon2405ekai:green:lan";
+ gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
+ };
+ WPS {
+ label = "fon2405ekai:green:wps";
+ gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+ };
+ };
+};
+
+&spi0 {
+ status = "okay";
+
+ m25p80@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <10000000>;
+
+ partition@0 {
+ label = "u-boot";
+ reg = <0x0 0x10000>;
+ read-only;
+ };
+
+ devconf: partition@10000 {
+ label = "devconf";
+ reg = <0x10000 0x10000>;
+ read-only;
+ };
+ firmware: partition@20000 {
+ label = "firmware";
+ reg = <0x20000 0x7b0000>;
+ };
+ };
+};
+
+&pinctrl {
+ state_default: pinctrl0 {
+ gpio {
+ ralink,group = "i2c", "jtag", "rgmii", "mdio", "uartf";
+ ralink,function = "gpio";
+ };
+ };
+};
+
+&ethernet {
+ mtd-mac-address = <&devconf 0x4>;
+};
+
+&esw {
+ mediatek,portmap = <0x2f>;
+};
+
+&wmac {
+ ralink,mtd-eeprom = <&devconf 0>;
+};
diff --git a/target/linux/ramips/image/rt305x.mk b/target/linux/ramips/image/rt305x.mk
index 4e82eb4..b6ff7c0 100644
--- a/target/linux/ramips/image/rt305x.mk
+++ b/target/linux/ramips/image/rt305x.mk
@@ -623,6 +623,14 @@ define Device/rt-g32-b1
endef
TARGET_DEVICES += rt-g32-b1
+define Device/fon2405ekai
+ DTS := FON2405EKAI
+ BLOCKSIZE := 4k
+ IMAGE_SIZE := $(ralink_default_fw_size_8M)
+ DEVICE_TITLE := FON FON2405E KAI
+endef
+TARGET_DEVICES += fon2405ekai
+
define Device/rt-n10-plus
DTS := RT-N10-PLUS
BLOCKSIZE := 64k
diff --git a/target/linux/ramips/rt305x/config-4.9 b/target/linux/ramips/rt305x/config-4.9
index d7b5303..309094f 100644
--- a/target/linux/ramips/rt305x/config-4.9
+++ b/target/linux/ramips/rt305x/config-4.9
@@ -110,6 +110,7 @@ CONFIG_IRQ_FORCED_THREADING=y
CONFIG_IRQ_INTC=y
CONFIG_IRQ_MIPS_CPU=y
CONFIG_IRQ_WORK=y
+CONFIG_LEDS_GPIO=y
CONFIG_LIBFDT=y
CONFIG_MDIO_BOARDINFO=y
CONFIG_MIPS=y
@@ -192,6 +193,5 @@ CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
CONFIG_SYS_SUPPORTS_MIPS16=y
CONFIG_TICK_CPU_ACCOUNTING=y
-CONFIG_USB_SUPPORT=y
CONFIG_USE_OF=y
CONFIG_WATCHDOG_CORE=y

手順3 カーネルイメージ作成

適宜、設定を行う
make menuconfig
make kernel_menuconfig
そして
make -j4 V=99

lede-ramips-rt305x-fon2405ekai-initramfs-kernel.bin
lede-ramips-rt305x-fon2405ekai-squashfs-sysupgrade.bin
が作成される

手順4 ファームアップ

まずは、u-bootからファームアップを行う
 lede-ramips-rt305x-fon2405ekai-initramfs-kernel.bin
を使う。
これで起動すると・・・。
[    4.689131] m25p80 spi0.0: mx25l6405d (8192 Kbytes)
[    4.699191] 3 ofpart partitions found on MTD device spi0.0
[    4.710330] Creating 3 MTD partitions on "spi0.0":
[    4.720086] 0x000000000000-0x000000010000 : "u-boot"
[    4.733996] 0x000000010000-0x000000020000 : "devconf"
[    4.749129] 0x000000020000-0x0000007d0000 : "firmware"
と、rootfsがない状態になる。
設定変更しても反映されない悲しい状態。
どうやらsysupgradeにて再度ファームアップが必要みたい(たぶん)。
sysupgrade -v /tmp/lede-ramips-rt305x-fon2405ekai-squashfs-sysupgrade.bin
このあと起動すると
[    0.614392] m25p80 spi0.0: mx25l6405d (8192 Kbytes)
[    0.624447] 3 ofpart partitions found on MTD device spi0.0
[    0.635587] Creating 3 MTD partitions on "spi0.0":
[    0.645343] 0x000000000000-0x000000010000 : "u-boot"
[    0.659229] 0x000000010000-0x000000020000 : "devconf"
[    0.674223] 0x000000020000-0x0000007d0000 : "firmware"
[    1.385424] 2 uimage-fw partitions found on MTD device firmware
[    1.397553] 0x000000020000-0x000000147454 : "kernel"
[    1.411314] 0x000000147454-0x0000007d0000 : "rootfs"
[    1.426108] mtd: device 4 (rootfs) set to be root filesystem
[    1.439008] 1 squashfs-split partitions found on MTD device rootfs
[    1.451676] 0x000000331000-0x0000007d0000 : "rootfs_data"
となった。やったー。
Luciも開けた!

諦めずにやってよかったー。
//SST26VF032bもどうにかしないと
<参考>
https://wiki.openwrt.org/doc/devel/add.new.platform
https://wiki.openwrt.org/doc/devel/add.new.device
https://wiki.openwrt.org/doc/howto/build
https://wiki.openwrt.org/doc/techref/flash.layout
https://lede-project.org/docs/user-guide/extroot_configuration
http://rainbowdevil.jp/?p=1247

http://www.srchack.org/article.php?story=20150829103857687

2017年9月5日火曜日

ZoneMinderの検知画像と動画をSlackに投稿する

ZoneMinderでは動体検出時等にメール通知する機能があるみたい。
それをなんとか使えないかと思ったけど、面倒くさいと思ってしまった。

すごく邪道な方法で検出時の画像と動画をSlackに投稿する方法を考えた。
それは、zmの吐き出すログをイベントトリガーとするもの。

ついでに検出時に音を鳴らすようにした。

1.インストール
  sudo apt-get install ffmpeg

2.ZoneMinderの画像保存先を漁るスクリプト
  /usr/local/bin/Victrola4ZM.sh
  sudo chown syslog Victrola4ZM.sh
  これは、NanoPIの/etc/rsyslog.conf内の"$FileOwner syslog"のため
#!/bin/bash
#Victrola For ZoneMinder (Victrola4ZM)
logger -p local1.info "[V4ZM] Victrola For ZoneMinder (Victrola4ZM) $1"
#PSOT方法設定(SELF or AMIS_SERVER)
POST_MODE=SELF
POST_CMD="/usr/local/Gillie/Post2slack.js file"
POST_CHANNEL=********
#作業ディレクトリ設定
ZMPATH=/usr/share/zoneminder/www/events/Monitor-2
TMPPATH=/tmp
TRIGFLG=victrola.trigflg
#通知用LED設定 NOTFI_BLINK_CNT*NOTFI_BLINK_SEC*2が通知時間
NOTFI_PORTwPI=5
NOTFI_BLINK_CNT=10
NOTFI_BLINK_SEC=0.1
#通知用サウンド設定
NOTFI_SOUND=/usr/local/etc/Victrola/blink1.mp3
#動画作成用環境設定
MOVIEFPS=4
TRIGER_HEADER_IMG=/usr/local/etc/Victrola/img/header-img.png
# Slackへプッシュする
# $1:FPATH $2:MdyDT
function pushSlack() {
FPATH=$1
MdyDT=$2
#ファイル名単体取り出し
FNAME="${FPATH##*/}"
FDT_STRING=$(date -d @$MdyDT +"%Y%m%d%H%M%S")
logger -p local1.info "[V4ZM] Upload to Slack ($POST_MODE) $FNAME - $FDT_STRING"
if [ "$POST_MODE" = "SELF" ]; then
echo "[Upload to Slack(Self)] FileName="$FNAME
echo "[Upload to Slack(Self)] DateTime="$FDT_STRING
#channel,filename,filepath,title,text,cleanup
$(nodejs $POST_CMD $POST_CHANNEL $FNAME $FPATH $FNAME $SLACK_MESSAGE 'false')
logger -p local1.info "[V4ZM] nodejs $POST_CMD $POST_CHANNEL $FNAME $FPATH $FNAME $SLACK_MESSAGE 'false'"
fi
}
function blinkLED(){
#検知LED点灯
gpio mode $NOTFI_PORTwPI out
for ((i=0;i<$NOTFI_BLINK_CNT;i++)); do
gpio write $NOTFI_PORTwPI 0
sleep $NOTFI_BLINK_SEC
gpio write $NOTFI_PORTwPI 1
sleep $NOTFI_BLINK_SEC
done
}
function searchDIR(){
# ディレクトリを探す
Cdate=$(date "+%-y/%m/%d")
Cwk=$(ls -altr /usr/share/zoneminder/www/events/Monitor-2/$Cdate/ | grep '^l' | tail -1)
set $Cwk
Cdir=$9
ZJSEARCH=$ZMPATH/$Cdate/$Cdir/*-analyse.jpg
ZJPATH=$(ls -tr $ZJSEARCH | head -1)
MdyDT=$(stat -c %Y $ZJPATH)
}
function prepare_video(){
SECONDS=0
# 検出時の赤画像
convert $ZJPATH -resize 160x120 $WKDIR/${ZJPATH##*/}.mpc
ls -tr $ZMPATH/$Cdate/$Cdir/*-capture.jpg | while read line
do
convert $line -background black -extent 320x360 $WKDIR/${line##*/}.mpc
APATH=${line//-capture/-analyse}
if [ -e $APATH ]; then
convert $APATH -resize 160x120 $WKDIR/${APATH##*/}.mpc
#元画像
#赤枠画像
#解析画像 の順
convert $WKDIR/${line##*/}.mpc \
$WKDIR/${ZJPATH##*/}.mpc -gravity northwest -geometry +0+240 -compose over -composite \
$WKDIR/${APATH##*/}.mpc -gravity northwest -geometry +160+240 -compose over -composite \
$TRIGER_HEADER_IMG -gravity northwest -geometry +0+240 -compose over -composite \
$WKDIR2/${line##*/}
else
convert $WKDIR/${line##*/}.mpc \
$WKDIR/${ZJPATH##*/}.mpc -gravity northwest -geometry +0+240 -compose over -composite \
$TRIGER_HEADER_IMG -gravity northwest -geometry +0+240 -compose over -composite \
$WKDIR2/${line##*/}
fi
done
# 終了待ち
#wait
time=$SECONDS
logger -p local1.info "[V4ZM] SET Processing time=$time"
}
function prepare_video3(){
#1.リサイズ
logger -p local1.info "[V4ZM] Resize and Extent Image=$ZMPATH/$Cdate/$Cdir/*-*.jpg"
#処理時間計測開始
SECONDS=0
ls -tr $ZMPATH/$Cdate/$Cdir/*-capture.jpg | while read line
do
APATH=${line//-capture/-analyse}
if [ -e $APATH ]; then
#アナライズ画像リサイズ
convert $APATH -resize 160x120 $WKDIR/${APATH##*/} &
fi
convert $line -background black -extent 320x360 $WKDIR/${line##*/} &
done
#終了待ち
wait
time=$SECONDS
logger -p local1.info "[V4ZM] Resize and Extent Processing time=$time"
#2.検出画像 ファイル名のみ取得しWKと結合する
SECONDS=0
ZJPATH=$WKDIR/${ZJPATH##*/}
# 検出時の赤画像
convert $ZJPATH -resize 160x120 $WKDIR/${ZJPATH##*/}
#3.静止画作成
ls -tr $WKDIR/*-capture.jpg | while read line
do
#echo $line
#logger -p local1.info "[V4ZM] Synthesis Image=$line"
APATH=${line//-capture/-analyse}
if [ -e $APATH ]; then
convert $line \
$ZJPATH -gravity northwest -geometry +0+240 -compose over -composite \
$APATH -gravity northwest -geometry +160+240 -compose over -composite \
$TRIGER_HEADER_IMG -gravity northwest -geometry +0+240 -compose over -composite \
$WKDIR2/${line##*/} &
else
convert $line \
$ZJPATH -gravity northwest -geometry +0+240 -compose over -composite \
$TRIGER_HEADER_IMG -gravity northwest -geometry +0+240 -compose over -composite \
$WKDIR2/${line##*/} &
fi
done
#終了待ち
wiat
time=$SECONDS
logger -p local1.info "[V4ZM] Synthesis Processing time=$time"
}
#スタートの通知
if [ $1 = "start" ]; then
#flag on
touch $TMPPATH/$TRIGFLG
#サウンド再生
logger -p local1.info "[V4ZM] mpg123 $NOTFI_SOUND"
mpg123 $NOTFI_SOUND&
#検知LED点灯
blinkLED&
#ディレクトリを探す
searchDIR
#検出した静止画(赤線あり)を送信する
SLACK_MESSAGE=":home:ZM検出画像"
logger -p local1.info "[V4ZM] TriggerImage=$ZJPATH"
pushSlack $ZJPATH $MdyDT
exit 0
fi
#検知LED点灯
gpio mode $NOTFI_PORTwPI out
gpio write $NOTFI_PORTwPI 1
# ディレクトリを探す
searchDIR
# 記録された静止画を動画に結合して送信する
#0.作業用ディレクトリ作成
WKDIR=$TMPPATH/$Cdir
WKDIR2=$TMPPATH/$Cdir"2"
mkdir $WKDIR
mkdir $WKDIR2
#
prepare_video3
#4.動画化
SECONDS=0
ZJSEARCH=$WKDIR2/%05d-capture.jpg
ZMNAME=$(date -d @$MdyDT +"%Y-%m-%d_%H-%M-%S")
ZJPATH=$WKDIR2/$ZMNAME.mp4
logger -p local1.info "[V4ZM] Create Video=$ZJPATH"
ffmpeg -r $MOVIEFPS -i $ZJSEARCH -vcodec h264 -y -f mp4 $ZJPATH
time=$SECONDS
logger -p local1.info "[V4ZM] Create Video Processing time=$time"
#5.slackに通知
SLACK_MESSAGE=":home:ZM検出動画"
logger -p local1.info "[V4ZM] Movie=$ZJPATH"
pushSlack $ZJPATH $MdyDT
#6.後片付け
rm -rf $WKDIR
rm -rf $WKDIR2
#flag off
rm -f $TMPPATH/$TRIGFLG
#検知LED消灯
gpio write $NOTFI_PORTwPI 0
view raw Victrola4ZM.sh hosted with ❤ by GitHub
  /usr/local/Gillie/Post2slack.js
  これはSlackAPIのトークンが含まれるためowner(=syslog)以外参照させないchmod 700
 
//Post2slack.js
var request = require('request');
var fs = require('fs');
var slackApiKey = '********';
var slackurl = "https://slack.com/api/chat.postMessage";
var slackurlTest = "https://slack.com/api/auth.test";
var slackurlFile = "https://slack.com/api/files.upload";
//ヘッダーを定義
var headers = {
'Content-Type':'application/x-www-form-urlencoded'
}
console.log(process.argv.length);
if(process.argv.length >= 3){
if(process.argv[2]=="text"){
//テキストの投稿
//channel,emoji,pretext,color,title,text
if(process.argv.length == 9){
channel = process.argv[3];
emoji = process.argv[4];
pretext = process.argv[5];
color = process.argv[6];
title = process.argv[7];
text = process.argv[8];
//attachments
var att = {
'pretext' :emoji+pretext,
'fallback':pretext,
'color' :color,
'title' :title,
'text' :text
}
//オプションを定義
var options = {
url : slackurl,
method : 'POST',
headers: headers,
form: {
'token' :slackApiKey,
'channel' :'#'+channel,
'as_user' :'true',
'attachments':JSON.stringify([att])
}
}
//リクエスト送信
console.log(att);
request(options, function (error, response, body) {
//コールバック
if (!error && response.statusCode == 200) {
console.log(body);
}else{
console.log('error: '+ response.statusCode);
}
});
}else{
console.log("引数が必要:channel,emoji,pretext,color,title,text");
}
}else if(process.argv[2]=="test"){
//auth.test
//オプションを定義
var options = {
url : slackurlTest,
method : 'POST',
headers: headers,
form: {
'token' :slackApiKey
}
}
//リクエスト送信
request(options, function (error, response, body) {
//コールバック
if (!error && response.statusCode == 200) {
console.log(body);
}else{
console.log('error: '+ response.statusCode);
}
});
}else if(process.argv[2]=="file"){
//ファイルのアップロード
//channel,filename,filepath,title,text,cleanup
if(process.argv.length == 9){
channel = process.argv[3];
filename= process.argv[4];
filepath= process.argv[5];
title = process.argv[6];
text = process.argv[7];
cleanup = process.argv[8];
//オプションを定義
var options = {
url : slackurlFile,
method : 'POST',
formData: {
'token' :slackApiKey,
'channels' :'#'+channel,
'filename' :filename,
'file' :fs.createReadStream(filepath),
'title' :title,
'initial_comment' : text
}
}
//リクエスト送信
console.log(options);
request(options, function (error, response, body) {
//コールバック
if (!error && response.statusCode == 200) {
// console.log(body);
var jbody = JSON.parse(body);
console.log(jbody);
if(cleanup.toLowerCase()=="true"){
//ファイルを削除する
fs.unlinkSync(filepath);
}
}else{
console.log('error: '+ response.statusCode);
}
});
}else{
console.log("引数が必要:channel,filename,filepath,title,text,cleanup");
}
}
}else{
console.log("err:引数が不足している");
}
view raw Post2slack.js hosted with ❤ by GitHub
3.ZoneMinderのログを漁るスクリプト
  /etc/rsyslog.d/Victrola4ZM.conf
  sudo systemctl restart rsyslog
if ( $msg contains 'Monitor-2' ) and ( $msg contains 'alarm start' ) then action(type="omprog" binary="/usr/local/bin/Victrola4ZM.sh start")
if ( $msg contains 'Monitor-2' ) and ( $msg contains 'alarm end' ) then action(type="omprog" binary="/usr/local/bin/Victrola4ZM.sh end")
4.音を鳴らすために
  usermod -aG audio syslog

5.実行結果



2017年8月20日日曜日

NanoPi NEOを監視カメラに(ZoneMinder+nginxで動体検出)

先日入手した「NanoPi NEO」で監視カメラ(動体検出)を構築してみた。

動体検出としてはmotion一番有名だと思っているが、
今回は外部トリガー(例えば、焦電センサーとかSlackからの要求とか)に対応したく
ZoneMinderを使用してみた。

motion
 導入事例が多い、外部トリガーには対応していない?
ZoneMinder (github)
 導入事例がmotionに比べて少ない、設定項目が多く、プログラム自体も巨大?
 外部トリガーが出来るっぽい

ただし、ZoneMinderはwebサーバーにapacheが必要みたい。
なんとなく軽量にしてみたく、nginxを使用するように変更。

1.インストール
  sudo apt-get install zoneminder
  sudo apt-get install nginx-extras fcgiwrap php7.0-fpm
  sudo apt-get install mariadb-server

2.セットアップ
  (1) nginx
   /etc/nginx/sites-available/default の変更
    ・cgi-binとfastcgi_paramsのところ
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php7.0-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php7.0-fpm:
# fastcgi_pass unix:/run/php/php7.0-fpm.sock;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
location /zoneminder/cgi-bin {
gzip off;
root /usr/lib;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/zoneminder/cgi-bin/nph-zms;
fastcgi_intercept_errors on;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
location /zoneminder/ {
gzip off;
alias /usr/share/zoneminder/www/;
index index.php;
location ~ \.php$ {
include fastcgi_params;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~* /zoneminder/.*\.(txt|log)$ {
deny all;
}
location ~* /zoneminder/.*\.(m4a|mp4|mov)$ {
mp4;
mp4_buffer_size 5M;
mp4_max_buffer_size 10M;
}
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
view raw default hosted with ❤ by GitHub
  アクセス権付与し、再起動
  chown www-data:www-data /etc/zm/zm.conf
  systemctl restart nginx

 (2)mariadb
  ※ユーザー・パスワードは適宜変更、 /etc/zm/zm.confと合わせる
  create user 'zmuser'@'localhost' identified by 'zmpass';
  grant all on zm .* to zmuser;
  create database zm;
  mysql -u zmuser -p zm < /usr/share/zoneminder/db/zm_create.sql

 (3)php
  /etc/php/7.0/fpm/php.ini の変更
  「date.timezone = "Asia/Tokyo"」
  再起動
  /etc/init.d/php7.0-fpm restart

 (4)カメラへのアクセス権付与
  usermod -aG video www-data
  ※要再起動
  
 (5)その他
  /etc/sysctl.confを変更
  kernel.shmall = 268435456
  kernel.shmmax = 268435456
  sysctl -p
  ※本当に必要かわからない。 Orz
  8/30 追記
  ここに設定方法があった。
  使用しているNanoPi NEOは256MBだから半分の128MBにした
  
  kernel.shmall = 32768
  kernel.shmmax = 134217728


   ipcs -l 実行結果は以下の通り

------ Messages Limits --------
max queues system wide = 989
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 131072 = 128MB
max total shared memory (kbytes) = 131072 = 128MB
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

 (6)webページにアクセス
  http://[NanoPiNeoのIPアドレス]/zoneminder/index.php

  設定 > Paths > PATH_ZMSを変更
  /zoneminder/cgi-bin/nph-zms

3.映像確認
こんな感じ




手順まとめると大したことなかったけど、
もろもろ1週間位かかっているOrz

最後に自動起動するようにしておく
systemctl enable zoneminder
systemctl start zoneminder

あと、ディスク容量が逼迫した場合に古い記録から消す設定
How can I stop ZoneMinder filling up my disk?
http://zoneminder.readthedocs.io/en/latest/faq.html

次は検知時の映像をslackに投稿するぞー!

参考
 ・https://chiralsoftware.com/idea/nginx-ubuntu-and-zoneminder


NanoPi NEOを使ってみる(導入)

たまたま安価なlinuxボードを求めてさまよっていたら秋月電子で「Nano Pi NEO」 が売られているのを発見した。 しかも@1,680で。
ヒートシンク(@400)とSDカード、電源があれば動いてしまう!

世の中的には、Raspberry Pi Zero Wなんだろうけど、入手できないし・・・。
 こっちはUSBポートが3つあるので、いろいろ繋げられそう。
ただし、HDMI出力とかないので、セットアップ時は、シリアルコンソール必須だと思う。

 この手のlinuxボードはパット見安いけど、結局SDカードやら、電源やらで高くなるのがネックだ。
お金ないし。その点、FONはSDカードいらないけど、出来ること限られるしUSBがあるこっちの方がどうしても使い勝手は良いよね・・・。

そんな感じで、試しに使ってみることにした
合計:3,600円
 結構かかった。SDカード買っていたらもっと高くなってる!!
 ACアダプターなんだけど、トラッキング対策されていないOrz。 いいのかこれ。

組み立て


ちっこくてかわいい


OSの選択
公式?のnanopiOSは8GB以上のSDカードが必要っぽいので、
armbianを使ってみることにした。こっちだと1.8GBだし。
nanopi OS
armbian

簡単3ステップでOK
 1.SDカードにOSを入れて
 2.デバック用の端子にUSBシリアルケーブル接続
   接続先はURAT0で115,200-8-N-1

 3.電源ON!  -  armbian-configで環境設定



2017年5月27日土曜日

3Dプリンターの発熱対策

X軸のステッピングモーターの発熱が気になる・・・。

 効果は未知数
用意したものは
・ヒートシンク(http://akizukidenshi.com/catalog/g/gP-05051/)×2個
・ 熱伝導シート(http://akizukidenshi.com/catalog/g/gP-08256/)×2枚
・ヒートシンク抑え:3Dプリンターで作った


よくよく考えたらY軸も発熱がやばいかねぇ・・・。



2017年5月14日日曜日

3Dプリンターの導入(HICTOP Reprap Prusa i3 3dp-08bk)

ついにというか、ようやくというか、念願?の3Dプリンターを導入した。
これ「HICTOP Reprap Prusa i3 3dp-08bk」

https://www.hic3dprinter.com/collections/3d-printers/products/hictop-prusa-i3-3d-desktop-printer-diy-high-accuracy-cnc-self-assembly-tridimensional

■雑感
 GWからポツポツと組み立てを始めた。
・同梱されていたCDはなぜか空のCDRとして認識されてしまい。中身が見れなかった
 ・電源ケーブルは先駆者が指摘しているとおり、非常に細く心許ないものだった
→手持ちの太めのケーブルに変更した。
  

 ・amazonレビューの情報もとても参考になった。
  →といってもそこまでひどい状態ではなかったけど。

■組み立て
 取説もおそらくCDに入っているのだろうけど、中身が見れなかったので、HPから入手した。
  →リンク先
 組み立て手順は以下が参考になった
  ・息子と一緒に Makers
  ・ すけログ 
  ・HICTOP 3Dプリンター3DP08 配線の説明 日本語  
 ちょっと奮発して「プラットフォームシート」なるものも入手した
  ・3M 3Dプリンタープラットフォームシート(3枚入) ABS/PLA対応 3099AB

■ソフトインストール
組み立てはまぁ情報がいろいろあるのでなんとかなったけど、
出力ソフトはOSがLinuxなので選択肢が少ない(知らないだけかもしれないけど)
・Cura(くーら?) ・・・ プリンターを認識してくれなかった
・Repetier-Host(レペティア)・・・認識してくれた 日本語もOK

設定はHPから入手

設定の説明は以下が詳しかった
Cura プリンター制御設定編

■設定メモ
・プリンター設定
<Printer Settings → Connection>
 ・Connector:シリアル接続
 ・Port:/dev/ttyACM0
<Printer Settings → Printer>
 ・Default Extruder Temperature:210℃
 ・Default Heated Bed Temperature:50℃
<Printer Settings → PrinterShape>
 ・XMax:220mm YMax:270mm  ZMaxが無い?200mm


・材質が「PLA」の場合
<CuraEngine Settings -> print>
 <Speed and Quality>
 ・Travel:40mm/s - 70mm/s
 ・Outer Perimeter 30mm/s - 60mm/s
 ・Outer Perimeter 30mm/s - 60mm/s
 ・Layer height:0.2mm
 <Structures>
 ・Shell Thickness:0.8mm
 <Extrusion>
 ・Retraction Speed:40mm/s
 ・Retraction Distance:4mm

■プリント開始
■完成例



2017年2月27日月曜日

ラズベリー・パイでSST26VF032Bの読み書き(node.js)その4

前回1/前回2/前回3からの続き

アドレス範囲指定もJpGridにしてみた。
読み込み時の進捗表示も追加。

データをファイルに保存したり、ファイルから書き込めるように機能追加中
丁度今、ファイルダウンロード機能が作り終わったところ。
 ファイルから書き込みができれば、ようやく本題に戻れるわけだ・・・。

なかなかまとまった時間が取れないけど、コツコツ頑張ろう。

2017年2月11日土曜日

ラズベリー・パイでSST26VF032Bの読み書き(node.js)その3

前回1/前回2からの続き

DataViewを手作りしていたけど、思うところがあって、jqgridに変更中


スタイルが崩れているのは、fundationと干渉しているから。
別途、調整する。 まずは『巨人の肩に乗る』
右側にACSIIビューつけた。こちらももろもろ別途調整する。

まずはデータ操作がそれなりにできるようにして、早くファイルから読み書きができるようにする。
やりたいことはたくさんある。時間は有限だ!

2017年2月5日日曜日

ラズベリー・パイでSST26VF032bの読み書き(node.js)その2

前回からの続き

ようやくデータの読み書きができるようになった。
ファイルが多すぎて公開するのが少し面倒。なにかよい方法が無いか検討中。

あとは、ファイルに書き出す、ファイルから書き込みができれば、
当初の目的?だった、FONのFlash交換の実験ができそう!
どんだけ遠回りしてるんだOrz

2月に入ってまとまった時間がなかなか取れない。

その他
しばらくは「頑張らないことを頑張りたい」と思う


2017年1月30日月曜日

ラズベリー・パイでSST26VF032bの読み書き(node.js)

昨年12月からFON2405EのSPIフラッシュメモリを交換すべくコツコツと作業をしている。
最近あまり更新できなかったけど、少し進展があった。

経緯
前回 c++でSPI制御プログラムを作成した。簡易的な動作確認はできたけど、
いろいろ機能を試したりとなると作るのも操作するのも大変なことに気づいた。

CUIで対話式もめんどいし、electron使うのも大げさだし・・・。
かといってwebサーバー建てるのもな・・・と思っていたけど、
一念発起してnode.jsを使ってwebアプリで行こうと思った。

まだソース貼れるほどできていないけど、こんな感じ。

自分の想像力の無さなのかもしれないけど、GUIの方がわかりやすい。


構成は
・node.js + express
・CSSフレームワークはfundation
・SPI通信はrpi-spi
と、おんぶに抱っこ いや『巨人の肩に乗る』状態

その他
公私ともに忙しいけど、ガンバロー

2017年1月5日木曜日

ラズベリー・パイのクロス開発環境(Eclipse)構築メモ

昨年から、少しづつクロス環境でのプログラムを行っている。
小規模なものはテキストエディタやVScodeでなんとかなるレベルだったけど、
ちょっと規模が大きくなると途端に面倒になってしまい、筆が進まなくなってしまう。
2017年の1発目・・・開発環境の見直し!

Eclipse使ってエレガントにラズベリー・パイのプログラミンを行う

前提
・クロスコンパイル環境→ここ
・Eclipse
・ ラズベリー・パイとSSH接続可能

手順<要点のみ抜粋>

1.ツールチェーンは「Cross GCC」を選択
2.クロスGCCコマンド
   接頭部:arm-linux-gnueabihf-
   パス:/var/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
   ※環境に合わせる


3.Eclipseからラズベリー・パイにSSH接続
  「ウィンドウ」→「 ビューの表示」→「その他」
  「リモート・システム」→「リモート・システム」でタブが追加される
  右クリで新規接続
   「SSHのみ」を選択しその後は良きに計らう
   「Sshシェル」を右クリし「シェルの起動」で接続できればOK

4.リモートデバッグ準備
  「デバッグ の構成」にて各種設定
   メイン
   ・接続を「ローカル」→3で作成した接続先に変更
   ・リモート絶対ファイルパス
   ・Commands to execute before application

   デバッガ−
    GDBデバッガ−:arm-linux-gnueabihf-gdb

5.リモートデバッグ開始
   こんな感じでステップ実行!

 参考
先人に感謝!!ありがとうございます。
http://qiita.com/atchy@github/items/fb9df9e5865d8c7f7a72