質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Python

    8684questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6966questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    856questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

センサーで感知すると天気予報を喋るプログラムの作り方

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,175

Ras5

score 3

前提・実現したいこと

Raspberry piにセンサーを接続させて、天気予報を喋らせるというプログラムを実行したいのですがエラーがでて実行できませんでした。 
センサーを接続させ、感知するとLEDを点灯させることはできましたが、天気予報のプログラムにセンサー感知のプログラムを組み込み方が理解できませんでした。

センサー検知でLEDつけるコードと喋るコードの組み合わせを教えていただきたいです。

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "tenki5", line 5, in <module>
    import commands
ImportError: No module named 'commands'

該当のソースコード

#!/usr/bin/env python
# -*- conding:utf-8 -*-
from __future__ import print_function
import socket
import commands
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.IN)
from contextlib import closing

import shlex
import subprocess
from datetime import datetime

try:
    import urllib.request as urllib2
except ImportError:
    import urllib2
import json
CMD_SAY = 'jsay'
def main():
    say_datetime()
    say_weather()

 while True:
    inputValue = GPIO.input(3)
    if (inputValue == True):
      say_weather()
    time.sleep(10)

    return
def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    text = CMD_SAY + ' ' + text
    print(text)
    proc = subprocess.Popen(shlex.split(text))
    proc.communicate()
    return
def say_weather():
    city = '200010'; # Tokyo 他の地域の方は、番号を変えてください。
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL
    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
    try:
        r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
        jsonStr = r.read().decode('utf-8')
        print(jsonStr)
        obj = json.loads( jsonStr )
        print(obj)
        title = obj['title']
        forecasts = obj['forecasts']
        # TODAY
        cast = forecasts[0]
        temperature = cast['temperature']
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        # 最高、最低気温を取得。データが存在しない場合もある
        temp_max = ""
        temp_min = ""
        if temperature['max'] is not None:
            temp_max = temperature['max']['celsius']
        if temperature['min'] is not None:
            temp_max = temperature['min']['celsius']
        today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min)
        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt
        text = '''%s '%s' ''' % (CMD_SAY, weather_str)
        print(text)
        proc = subprocess.Popen(shlex.split(text))
        proc.communicate()
    finally:
        r.close()
    return
### Execute
if __name__ == "__main__":
    main()

元のソースコード(天気予報を喋るソースコード)

#!/usr/bin/env python
# -*- conding:utf-8 -*-
import shlex
import subprocess
from datetime import datetime
try:
    import urllib.request as urllib2
except ImportError:
    import urllib2
import json


CMD_SAY = 'jsay'
def main():
    say_datetime()
    say_weather()
    return
def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    text = CMD_SAY + ' ' + text
    print(text)
    proc = subprocess.Popen(shlex.split(text))
    proc.communicate()
    return
def say_weather():
    city = '130010'; # Tokyo 他の地域の方は、番号を変えてください。
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL
    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
    try:
        r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
        jsonStr = unicode(r.read())
        print(jsonStr)  # 確認表示
        obj = json.loads( jsonStr )
        print(obj)      # 確認表示
        title = obj['title']
        forecasts = obj['forecasts']
        # TODAY
        cast = forecasts[0]
        temperature = cast['temperature']
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        # 最高、最低気温を取得。データが存在しない場合もある
        temp_max = ""
        temp_min = ""
        if temperature['max'] is not None:
            temp_max = temperature['max']['celsius']
        if temperature['min'] is not None:
            temp_max = temperature['min']['celsius']

        today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min)
        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt
        text = '''%s '%s' ''' % (CMD_SAY, weather_str)
        print(text)
        proc = subprocess.Popen(shlex.split(text))
        proc.communicate()
    finally:
        r.close()
    return
### Execute
if __name__ == "__main__":
    main()

センサー検知でLEDをつけるソースコード

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(3, GPIO.IN) 

try:
    while True:
        if GPIO.input(3) == GPIO.LOW:
            GPIO.output(4, GPIO.HIGH)
        else:
            GPIO.output(4, GPIO.LOW)

except KeyboardInterrupt:
    pass

GPIO.cleanup() 

試したこと

リンク内容
上記のサイトを参考にしてプログラムを追加してみました。
また、ほかのサイトのプログラムを実行してみたところ「import error no module named RPi」というエラーも出てきてしまい手詰まりでした。
エラーについて検索してみましたが、手がかりになるようなものがなかなか見つからなかったのでこちらに質問させていただきました。

お力をお貸しいただけると幸いです。

追記

import commandsを削除したところ別のエラーが発生しました。
$sudo python ファイル名 で実行しています。

File line55
SyntaxErorr: Non-ASCII character '\xe' in file tenki5 on line 55, but no encoding declead; see http://pyton.org/dev/peps/pep-0263/ for details

天気予報を喋るコードとセンサー感知のコードを組み合わせるにはどうするべきだったのでしょうか。自作したソースコードが大幅に変更してもよいので教えて頂きたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/09/12 14:16

    じゃあ余計なことせずにセンサー検知でLEDつけるコードと喋るコード組み合わせれば良かったんじゃないかと思いながらも回答書きました。

    キャンセル

  • ozwk

    2017/09/12 14:36

    センサー検知でLEDつけるコードももらえますか?

    キャンセル

  • Ras5

    2017/09/12 14:41

    ozwk様>プログラム追加致しました。お手数おかけしてすみません。

    キャンセル

回答 4

+2

Python 3をお使いなのだと思われます。
というのは、commandsモジュールはpython3で削除されたからです。

commands.getoutput()などは、commandsモジュールの代わりに、subprocessモジュールを使う事で回避するようです。
36.16. commands — コマンド実行ユーティリティ(Python 2.6.13)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 14:45

    回答ありがとうございます。commandsモジュールは廃止されたのですね。勉強不足でお恥ずかしい限りです。教えていただきありがとうございます。

    キャンセル

+1

commandsモジュールはPython3で消滅しました。

というか質問文のコードでcommands使ってないですよね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 14:28

    回答ありがとうございます。サイトのプログラムをコピペしただけでしたのでコードの使い方を理解していませんでした。実行文から削除してみたところ、「import error no module named RPi」が出てきてしまいました。「sudo apt-get install python-rpi.gpio」を実行しましたがすでにインストール済みでした。

    キャンセル

  • 2017/09/12 14:47

    python3-rpi.gpioをインストールしてみてください

    キャンセル

  • 2017/09/12 14:53

    回答ありがとうございます。既にpython3-rpi.gpioはインストール済みです。

    キャンセル

  • 2017/09/12 17:14

    LEDつけるコードも
    問題起きているコードも
    同じようなコマンドで起動してますか?

    キャンセル

  • 2017/09/13 13:50

    回答ありがとうございます。
    同じようなコマンドで起動させています。

    キャンセル

check解決した方法

0

pipモジュールを再インストールするなど様々なサイトに掲載されているコマンドを試してみました。
結果「import error no module named RPi」というエラーが表示されなくなり、「sudo python プログラム名」で実行することまでできるようになりました。

センサーで感知して天気予報を喋ってくれるコードは以下のようになりました。

import RPi.GPIO as GPIO
from time import sleep
import time


GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(3, GPIO.IN)

try:
      while True:
        if GPIO.input(3) == GPIO.LOW:
            GPIO.output(4, GPIO.HIGH)

            #!/usr/bin/env python
            # -*- conding:utf-8 -*-
            import shlex
            import subprocess
            from datetime import datetime
            try:
               import urllib.request as urllib2
            except ImportError:
               import urllib2
            import json
            CMD_SAY = 'jsay'
            def main():
               say_datetime()
               say_weather()
               return
            def say_datetime():
               d = datetime.now()
               text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
               text = CMD_SAY + ' ' + text
               print(text)
               proc = subprocess.Popen(shlex.split(text))
               proc.communicate()
               return
            def say_weather():
               city = '200010'; # Tokyo 他の地域の方は、番号を変えてください。
               json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL
               weather_text = u'%sの天気は%sです。'
               temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
               try:
                  r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
                  jsonStr = r.read().decode('utf-8')
                  print(jsonStr)
                  obj = json.loads( jsonStr )
                  print(obj)
                  title = obj['title']
                  forecasts = obj['forecasts']
                  # TODAY
                  cast = forecasts[0]
                  temperature = cast['temperature']
                  today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
                  # 最高、最低気温を取得。データが存在しない場合もある
                  temp_max = ""
                  temp_min = ""
                  if temperature['max'] is not None:
                      temp_max = temperature['max']['celsius']
                  if temperature['min'] is not None:
                      temp_max = temperature['min']['celsius']

                  today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min)
                  # TOMMOROW
                  cast = forecasts[1]
                  temperature = cast['temperature']
                  tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
                  # SAY
                  weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt
                  text = '''%s '%s' ''' % (CMD_SAY, weather_str)
                  print(text)
                  proc = subprocess.Popen(shlex.split(text))
                  proc.communicate()
               finally:
                  r.close()
               return
            ### Execute
            if __name__ == "__main__":
                  main()

        else:
            time.sleep(1)
            GPIO.output(4, GPIO.LOW)



except KeyboardInterrupt:
    pass

GPIO.cleanup()

ご協力いただきました、ozwk様、coco_bauer様、can110様
貴重なお時間を割いていただきまして本当にありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

また、ほかのサイトのプログラムを実行してみたところ「import error no module named RPi」というエラーも出てきてしまい手詰まりでした。

以下、Rpi2(jessie)でのRPi.GPIOの動作確認手順例です。

RPi.GPIOのインストール確認(デフォルトでインストール済みのはず)
参考:RPi.GPIO Installation

pi@rpi2:~ $ sudo apt-get install python3-rpi.gpio
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python3-rpi.gpio はすでに最新版です。

念のためpip3でも確認

pi@rpi2:~ $ sudo apt-get install python3-pip
(略)
pi@rpi2:~ $ pip3 freeze
-bash: pip3: コマンドが見つかりません

pip3が正常にインストールされていない場合は再インストールする
python3-pip installed but pip3 command not found?

pi@rpi2:~ $ sudo apt-get remove python3-pip; sudo apt-get install python3-pip
(略)


pip3でRPi.GPIOのバージョン確認

pi@rpi2:~ $ pip3 freeze | grep RPi
RPi.GPIO==0.6.3

RPi.GPIOの動作を確認

pi@rpi2:~ $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO
>>> GPIO.RPI_INFO
{'RAM': '1024M', 'P1_REVISION': 3, 'PROCESSOR': 'BCM2836', 'TYPE': 'Pi 2 Model B', 'REVISION': 'a01041', 'MANUFACTURER': 'Sony'}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 16:14

    回答ありがとうございます。
    RPi.GPIOのインストール確認はできましたが、「$ pip3 freeze」を実行しても「-bash: pip3: コマンドが見つかりません」というのが表示されません。また、pip3でRPi.GPIOのバージョン確認のコマンドを実行しても「RPi.GPIO==0.6.3」が表示されないです。
    よろしくお願いいたします。

    キャンセル

  • 2017/09/12 16:45

    「-bash: pip3: コマンドが見つかりません」→回答本文に対処法も記載してますので確認ください。

    キャンセル

  • 2017/09/13 15:06

    回答ありがとうございます。
    今ネットワークエラーで再インストールが出来ませんのでネットワークが回復しましたら、改めて試させていただきます。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Python

    8684questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6966questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    856questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。