質問編集履歴

4

やったことの追加

2023/03/08 07:53

投稿

ysk_snn
ysk_snn

スコア21

test CHANGED
File without changes
test CHANGED
@@ -64,3 +64,51 @@
64
64
  しかし、node-redのUI上において、デバグノードで$MYIPを出力しても""が返ってきます。
65
65
  また、mqtt outノードでは$MYIPをトピックとしたところ、"不正なトピックが設定されています"と表示されました。
66
66
 
67
+ ### 20230308追記4
68
+ "`~/.node-red`内の`environmentと`いう名称のファイル"を使用できなかったため、ラズパイに入っていたnode および node-redのバージョンを上げました。(これはこれで手間取ってしまいました)
69
+ node : v10.21.0 --> v16.19.1
70
+ node-red : v1.0.6 --> v3.0.2
71
+ しかしながら、`~/.node-red/environment` を作ってそこに環境変数を指定しても、node-red内では使用することができませんでした。やり方が間違っていたのかもしれませんが、今回は諦めてしまいました。
72
+
73
+ 結局以下3点の変更を加えることで、node-red内で使える環境変数にIPアドレスを指定することができました。
74
+ 皆さん、いろいろ教えてくださってありがとうございました。皆さんのアドバイスを組み合わせた感じになりましたが、今回は86ps様をベストアンサーにいたします。
75
+
76
+ ①ノードレッドのサービス(/lib/systemd/system/nodered.service)に以下の環境変数を追加
77
+ ```
78
+ [Service]
79
+ Environment=MYIP=192.168.XXX.XXX
80
+ ```
81
+
82
+ ②ノードレッドサービス内の環境変数を変更する、以下のシェルスクリプト(/usr/local/bin/update_myip.sh)を追加して、`chmod +x update_myip.sh`で実行可能に設定
83
+ ```
84
+ #!/bin/bash
85
+ new_ip=$(grep -A 3 'wlan0' /etc/dhcpcd.conf | grep ip_address | grep -o '192.168.[0-9]\+.[0-9]\+')
86
+ if [ -z "$new_ip" ]; then
87
+ echo "No IP address containing '192.168' is found."
88
+ else
89
+ if grep -q 'MYIP=' /lib/systemd/system/nodered.service; then
90
+ sed -i "s/MYIP=.*/MYIP=$new_ip/" /lib/systemd/system/nodered.service
91
+ echo "MYIP variable has been updated to $new_ip"
92
+ else
93
+ echo "some error occurred"
94
+ fi
95
+ fi
96
+ ```
97
+ ③update_myip.shを実行するサービスupdate-myip-in-nodered.serviceを追加(/etc/systemd/system/update-myip-in-nodered.service)
98
+ ```
99
+ [Unit]
100
+ Description=Update MYIP
101
+ Before=nodered.service
102
+
103
+ [Service]
104
+ Type=oneshot
105
+ ExecStart=sudo /bin/sh -c 'sudo /usr/local/bin/update_myip.sh'
106
+
107
+ [Install]
108
+ WantedBy=multi-user.target
109
+ ```
110
+
111
+
112
+
113
+
114
+

3

追記

2023/02/07 00:45

投稿

ysk_snn
ysk_snn

スコア21

test CHANGED
File without changes
test CHANGED
@@ -54,3 +54,13 @@
54
54
  ところが再起動後に`/etc/environment`を確認しても`MYIP`が追加されていなかったので、`systemctl list-units -all --type=service`で確認したところ、
55
55
  `set-envvar.service`の`LOAD`が`bad-setting`になっていました。
56
56
  原因がよくわからずに困っています。
57
+
58
+ ### 20230207 追記3
59
+ /etc/environment での環境変数の設定は今回は避けるべきという指摘をいただいたので、
60
+ 追記2で作ったset-envvar.serviceファイルは破棄して、`/lib/systemd/system/nodered.service`において以下のような追記をしました。
61
+ ```
62
+ ExecStartPre=/bin/sh -c "sudo /bin/systemctl set-environment MYIP=$(/bin/hostname -I)"
63
+ ```
64
+ しかし、node-redのUI上において、デバグノードで$MYIPを出力しても""が返ってきます。
65
+ また、mqtt outノードでは$MYIPをトピックとしたところ、"不正なトピックが設定されています"と表示されました。
66
+

2

追記

2023/02/06 08:01

投稿

ysk_snn
ysk_snn

スコア21

test CHANGED
File without changes
test CHANGED
@@ -34,3 +34,23 @@
34
34
  `と記入したところ、node-red内で`$MYIP`を出力すると`XXX.XXX.XXX.XXX`が出力できるようになりました。
35
35
  しかし、ラズパイが複数台あるので、
36
36
  `Environment=MYIP=$(hostname -I)`のように指定したいのですが、こちらだとnode-red内で`$MYIP`を出力すると`$(hostname`が出力されてしまって困っています...
37
+
38
+ ### 20230206追記2
39
+ node-redをサービスで起動しているので、それより早くenvironmentを更新できるように、
40
+ `/etc/systemd/system/set-envvar.service`というファイルを作って、以下の文章を記入しました。
41
+ MYIPがすでにある場合は更新、ない場合は追加、みたいなつもりです。
42
+ ```
43
+ [Unit]
44
+ Description=Update or Add MYIP in /etc/environment
45
+ Before=nodered.service
46
+
47
+ [Service]
48
+ ExecStartPre=/bin/sh -c "if grep -q MYIP /etc/environment; then sed -i 's/MYIP=.*/MYIP=$(hostname -I)/g' /etc/environment; else echo MYIP=$(hostname -I) >> /etc/environment; fi"
49
+
50
+ [Install]
51
+ WantedBy=multi-user.target
52
+ ```
53
+
54
+ ところが再起動後に`/etc/environment`を確認しても`MYIP`が追加されていなかったので、`systemctl list-units -all --type=service`で確認したところ、
55
+ `set-envvar.service`の`LOAD`が`bad-setting`になっていました。
56
+ 原因がよくわからずに困っています。

1

やったことの追記

2023/02/06 02:34

投稿

ysk_snn
ysk_snn

スコア21

test CHANGED
File without changes
test CHANGED
@@ -27,3 +27,10 @@
27
27
  で環境変数を確認すると、MYIPが登録されていませんでした。
28
28
 
29
29
  大きな勘違いをしているかもしれません、ご指導お願いいたします。
30
+
31
+ ### 20230206追記
32
+ `/lib/systemd/system/nodered.service`内で、[Service]下に、
33
+ `Environment=MYIP=XXX.XXX.XXX.XXX
34
+ `と記入したところ、node-red内で`$MYIP`を出力すると`XXX.XXX.XXX.XXX`が出力できるようになりました。
35
+ しかし、ラズパイが複数台あるので、
36
+ `Environment=MYIP=$(hostname -I)`のように指定したいのですが、こちらだとnode-red内で`$MYIP`を出力すると`$(hostname`が出力されてしまって困っています...