Содержание

УПС! Ты получил более крутую Raspberry!

Привет!

Хорошие новости! Ребята из Raspberry обновили свою плату до версии B+. Наша книга — та, что в коробке, была написана до этого, и поэтому в некоторых местах устарела.

Но это не беда!

Эта страница сделана специального для того, что исправить это недоразумение. Ниже страницы и главы, в которых есть изменения и обновлённые инструкции. Как только, проходя книгу, ты доберешься до одной из этих глав — прочитай здесь, что нужно сделать, чтобы, всё заработало!

Стр. 4. Raspberry PI

Отсюда все ноги и растут. Плата обновилась и выглядит иначе, вот так:

Стр. 7

Переключить язык спомощью Shift+alt без длинной дополнительной настройки не выйдет.

Стр. 8. WI-FI

Здесь всё в порядке. Просто хотим обратить внимание на то, что подробная инструкция по подключению по SSH есть в книге на стр. 72.

Стр. 25. Маячок

Пукнт 3 инструкции предлагает сохранить файл спомощью File → Save As..

Но скорее всего, ты не наблюдаешь этого меню в Thonny. Потому что при первом запуске редактора Thonny Python IDE главное меню скрыто.В этом случае, делай так:

Нажми на ссылку в верхнем правом углу окна IDE. Подтверди изменения После перезапуска IDE изменения вступят в силу.

Стр. 40. Landing page

Если при перезапуске сервера консоль ответит сообщением
socket.error: [Errno 48] Address already in use, набери команду

ps -fA | grep python

В консоль выведется список запущенных процессов. Найди строку с файлом landing.py. Во второй колонке будет указан номер процесса. Отключи его командой

kill -9 xxx

Где xxx — номер процесса. Команда kill «убивает» процесс, иногда это называют «убить девяткой».

Запусти сервер заново.

Стр. 44. Обратная связь

В этой главе используется Python версии 2. После обновления, необходимо использовать Python3.

Вот верный код:

sudo pip3 install flask-socketio eventlet
feedback.py
from flask import Flask, send_file
from flask_socketio import SocketIO
import RPi.GPIO as GPIO
 
app = Flask('feedback')
socketio = SocketIO(app)
 
GPIO.setmode(GPIO.BCM)
btn = 2
GPIO.setup(btn, GPIO.IN)
 
@app.route('/')
def index():
    return send_file('feedback.html')
 
@app.route('/images/<filename>')
def get_image(filename):
    return send_file('images/'+filename)
 
@socketio.on('isPressed')
def checkButton(receivedData):
    if (GPIO.input(btn) == False):
        socketio.emit('button', 'pressed')
    else:
        socketio.emit('button', 'released')
 
socketio.run(app, port=3000, host='0.0.0.0', debug=True)

Запусти сервер командой

python3 feedback.py

Стр. 48. Погодный фиджет

На сайте Openweathermap.org изменился API.
Теперь правильный код выглядит так:

fydget.py
import requests, json
from pprint import pprint
 
url = 'http://api.openweathermap.org/data/2.5/forecast'
 
payload = {
    'lat': 'широта_твоего_города',
    'lon': 'долгота_твоего_города',
    'units': 'metric',
    'appid': 'твой_ключ'
}
 
res = requests.get(url, params=payload)
data = json.loads(res.text)
weather = data['list'][0]
 
def pars_weather(weatherType, timeRange, measurementUnits):
    if (weatherType in weather) and (timeRange in weather[a].keys()):
        print weatherType, ': ', weather[weatherType][timeRange], c
    else:
        print weatherType, ': ', 'none'
 
pars_weather('clouds', 'all', '%')
pars_weather('rain', '3h', 'mm')
pars_weather('snow', '3h', 'mm')
 
print 'temp:', weather['main']['temp'], 'C'

Наш вариант погодного фиджета:

amperka.github.io/malina_support/weather.py

Стр. 54. Бот Вконтакте

Команда Вконтакте тоже изменила API.

Вот актуальный код для этой главы:

vk.py
# -*- coding: utf-8 -*-
import time
import vk_api
 
from socket import gethostbyname
 
vk = vk_api.VkApi(token = 'твой токен')
 
param = {
    'count' : 1,
    'time_offset' : 5,
    'filter' : 'unread'
}
 
def write_msg(user_id, msg, random):
    vk.method('messages.send', {
        'user_id': user_id,
        'message': msg,
        'random_id':random,
    })
while True:
    response = vk.method('messages.getConversations', param)
    if response['items']:
        item = response['items'][0]
        last_mess = item['last_message']
        random = last_mess['random_id']
        my_id = last_mess['peer_id']
        text = last_mess['text']
        write_msg(my_id, text, random)    
    time.sleep(1)

Стр. 55. Автозапуск и расписания

В параграфе «ПРИМЕРЫ» есть лишние символы *. У каждой из приведённых в книге комманд 5 параметров. Звездочки закрывают «пропуски».

Соответственно команды должны выглядеть так:

15 16 * * * python blink.py
0 10 1,16 * * python payment.py
15 7 * * 0-4 python alarm/wakeUp.py
0 */3 * * * python web-server/fidget.py

В каждой строке на одну нужно * меньше, чтобы получилось 5 параметров, а не 6.

Стр. 68. Поставь торрент заранее!

Этот код тоже использует API ВКонтакте.

Вот верный код:

deluge_vk.py
# -*- coding: utf-8 -*-
import time
import vk_api
 
from deluge_client import DelugeRPCClient
from pprint import pprint
 
vk = vk_api.VkApi(token = 'твой токен')
 
 
values = {
    'count' : 1,
    'offset' : 0,
    'filter' : 'unread'
}
 
client = DelugeRPCClient(
    '127.0.0.1',
    58846,
    'pi',
    'raspberry'
)
 
client.connect()
 
def write_msg(user_id, msg , random):
    vk.method('messages.send', {
        'user_id': user_id,
        'message': msg,
        'random_id':random,
    })
 
while True:
    response = vk.method('messages.getConversations', values)
    if response['items']:
        item = response['items'][0]
        last_mess = item['last_message']
        random = last_mess['random_id']
        my_id = last_mess['peer_id']
        text = last_mess['text'] 
        client.call('core.add_torrent_url', text, {'move_completed_path' : '/home/pi/Torrents'})
        write_msg(my_id, u'Download is begin!', random)
    time.sleep(1)