###前提・実現したいこと
ここ数日でシェルスクリプトやPHPを触り始めた全くの素人です。
GoogleホームとNatureRemoのAPI使ってエアコンをワンフレーズで制御したい。
IFTTTを使用しGoogleアシスタントをトリガーにWebhookからpostし
ラズベリーパイのPHPで受け取って、シェルスクリプトからAPIで制御したい。
Webhookから直接APIを送信したかったが、Webhookでは認証トークンをヘッダーに追加することができなかった為
このような変則的な方法を試しています。
###発生している問題・エラーメッセージ
ラズベリーパイのコンソール上でcurlを叩くと正常に動作するが、外部からWebhook
で発信するとシェルスクリプトがエラーを吐いて機能しない
(apache2のエラーログ) [Thu Jan 25 22:03:01.529499 2018] [:error] [pid 8463] [client 34.201.45.176:34242] PHP Notice: Undefined index: mode in /var/www/html/aircon.php on line 12 sh: 1: Syntax error: Unterminated quoted string
(ブラウザから http://{myurl}/aircon.php で表示される項目) NULL NULL NULL string(178) " エアコンを モードで 度の 風向き 風量 で起動!! {"temp":"0","mode":"auto","vol":"auto","dir":"auto","button":"","updated_at":"2018-01-24T04:44:37Z"}"
###該当のソースコード
PHP
1// 2018/1/25 22:00 修正しました。 2<?php 3 4$mode = isset($_POST["mode"])?$_POST["mode"]:"暖房"; 5$temp = isset($_POST["temp"])?$_POST["temp"]:"24"; 6$button = isset($_POST["button"])?$_POST["button"]:"power-off"; 7 8$json_string = file_get_contents('php://input'); 9$filename = "php_input.txt"; 10 11file_put_contents($filename, $json_string, FILE_APPEND); 12 13$mode = $_POST["mode"]; 14$temp = $_POST["temp"]; 15$button = $_POST["button"]; 16 17echo $temp,$mode,$button; 18var_dump($temp,$mode,$button); 19 20$output = shell_exec('/bin/sh /home/pi/test.sh "'.$mode.'" "'.$temp.'" "'.$button.'"'); 21 22var_dump($output); 23?>
上記の結果 $ cat /var/www/html/php_input.txt -d "mode=冷房&temp=26&button=power-on"
bash
1#!/bin/sh 2 3echo "$1 $2 $3" 4 5case "$1" in 6 "オート" | "自動" ) 7 if [ "$2" -ge "-5" -a "$2" -le"5" ] 8 then 9 mode="auto" temp="$2" dir="auto" vol="auto" 10 else 11 mode="auto" temp="0" dir="auto" vol="auto" 12 fi ;; 13 "クーラー" | "冷房" ) 14 if [ "$2" -ge "19" -a "$2" -le "32" ] 15 then 16 mode="cool" temp="$2" dir="auto" vol="auto" 17 else 18 mode="auto" temp="0" dir="auto" vol="auto" 19 fi ;; 20 "ドライ" ) 21 if [ "$2" -ge "-2" -a "$2" -le "2" ] 22 then 23 mode="dry" temp="$2" dir="auto" vol="auto" 24 else 25 mode="auto" temp="0" dir="auto" vol="auto" 26 fi ;; 27 "ヒーター" | "暖房" ) 28 if [ "$2" -ge "14" -a "$2" -le "30" ] 29 then 30 mode="warm" temp="$2" dir="auto" vol="auto" 31 else 32 mode="auto" temp="0" dir="auto" vol="auto" 33 fi ;; 34 * ) 35 mode="auto" temp="0" dir="auto" vol="auto" ;; 36esac 37 38echo "エアコンを $mode モードで $temp 度で 風向き $dir 風量 $vol で起動!!" 39 40curl -X POST "https://api.nature.global/1/appliances/{id}/aircon_settings" \ 41-H "accept: application/json" \ 42-H "Content-Type: application/x-www-form-urlencoded" \ 43-d "temperature=$temp&operation_mode=$mode&air_volume=$vol&air_direction=$dir&button=$3" \ 44-k --header "Authorization: Bearer {token}"
IFTTTの設定 Googleアシスタント(トリガー) Say a phrase with both a number and a text ingredient:「エアコンを$#度でつけて」 Webhook(アクション) URL: http://raspi-url.jp/aircon.php Method: POST ContentType: appricaton/x-www-form-urlencoded Body: -d "temp={{NumberField}}&mode={{TextField}}&button=power-on"
###試したこと
ルーターのポートは開放されていることを確認
ラズベリーパイのコンソール上で
$ curl -X POST "http://localhost/aircon.php" -H "Content-Type: application/x-www-form-urlencoded" -d "temp=26&mode=暖房&button=power-on"
と打ち込むと意図した動作を行う
Windowsのコマンドプロンプトから同じcurlを入力するとechoで出力する文字が文字化けするので文字のエンコードが原因か?
IFTTTでWebhookではなくメールやメッセージに送るアクションだと"暖房 27"などと表示され文字化け無し
###補足情報(言語/FW/ツール等のバージョンなど)
NatureRemo Cloud API
http://swagger.nature.global/
回答1件
あなたの回答
tips
プレビュー