===== УПС! Ты получил более крутую Raspberry! ===== Привет! Хорошие новости! Ребята из Raspberry обновили свою плату до версии B+. Наша книга — та, что в коробке, была написана до этого, и поэтому в некоторых местах устарела. Но это не беда! Эта страница сделана специального для того, что исправить это недоразумение. Ниже страницы и главы, в которых есть изменения и обновлённые инструкции. Как только, проходя книгу, ты доберешься до одной из этих глав — прочитай здесь, что нужно сделать, чтобы, всё заработало! ===== Стр. 4. Raspberry PI ===== Отсюда все ноги и растут. Плата обновилась и выглядит иначе, вот так: {{:rb_aplg:pi.png?450|}} ===== Стр. 7 ===== Переключить язык спомощью Shift+alt без длинной дополнительной настройки не выйдет.\\ ===== Стр. 8. WI-FI ===== Здесь всё в порядке. Просто хотим обратить внимание на то, что подробная инструкция по подключению по SSH есть в книге на стр. 72. ===== Стр. 25. Маячок ===== Пукнт 3 инструкции предлагает сохранить файл спомощью ''File -> Save As..'' Но скорее всего, ты не наблюдаешь этого меню в Thonny. Потому что при первом запуске редактора Thonny Python IDE главное меню скрыто.В этом случае, делай так: Нажми на ссылку в верхнем правом углу окна IDE. {{ :malina:1.png?nolink |}} Подтверди изменения {{ :malina:2.png?nolink |}} После перезапуска IDE изменения вступят в силу. {{ :malina:3.png?nolink |}} ===== Стр. 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 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/') 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.\\ Теперь правильный код выглядит так:\\ 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. Вот актуальный код для этой главы: # -*- 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 ВКонтакте. Вот верный код: # -*- 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)