субота, 27 серпня 2016 р.

Raspberry Pi, датчик движения и отправка смс через Twilio

Появилось свободное время, которое я решил потратить на Raspberry Pi. Пару месяцев назад, я уже пробовал фиксировать движение с помощью датчика, подключенного к малине. О проблеме, которая возникла в тот момент я написал в блоге. Сейчас, я решил продолжить развивать эту тему и прикрутить смс оповещение в момент срабатывания датчика. Погуглив, я нашел сайт Twilio, который предоставляет бесплатный вариант отправки смс на верифицированный номер.
Далее я зарегистрировался на сайте, прошел верификацию своего номера, получил триальный номер Twilio и закачал пакет для работы с Twilio:
sudo pip3 install twilio

Также в интернете нашел пример работы с Twilio, который соединил вместе с кодом для работы с датчиком, внес кое-какие свои корректировки и вот что получилось:
import RPi.GPIO as GPIO
import time
from datetime import datetime
def SendSms(msg):
from twilio.rest import TwilioRestClient
client = TwilioRestClient("Your ACCOUNT SID",
"Your AUTH TOKEN")
client.messages.create(to="Your number",
from_="Your Twilio number",
body=msg)
#number of GPIO on board
sensor = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN)
delay_sec = 120
mark_time = 0
cur_state = 0
while True:
time.sleep(1)
cur_state = GPIO.input(sensor)
print(cur_state)
if cur_state == 1:
if time.time() - mark_time > delay_sec:
msg = "Some movement. Time: {0}".format(str(datetime.now())[:-7])
print(msg)
SendSms(msg)
mark_time = time.time()


Смс приходит следующего вида:
Sent from your Twilio trial account
- Some movement. Time: 2016-08-27 16:34:09 

Фото процесса:

понеділок, 22 серпня 2016 р.

Pythonchallenge №10

Продолжаю изучать Python и пробую выполнять задачки с его помощью. На этот раз сайт pythonchallenge.com задание номер 10.
Суть задания заключается в нахождении длины 30-го элемента списка. Также даны начальные элементы последовательности, которую надо продолжить:
a = [1, 11, 21, 1211, 111221, 

Понять алгоритм, по которому строится список мне помог гугл и википедия: https://en.wikipedia.org/wiki/Look-and-say_sequence
В википедии, я обратил внимание на вот этот абзац:
"No digits other than 1, 2, and 3 appear in the sequence..."
и согласно этому ограничению написал свой алгоритм решения этой задачи:
#http://www.pythonchallenge.com/
#challenge num_10
import re
import time
start = time.time()
def GetNextNum(num):
num1 = re.sub('[2]+', ' 0 ', num)
num1 = re.sub('[3]+', ' 0 ', num1)
num2 = re.sub('[1]+', ' 0 ', num)
num2 = re.sub('[3]+', ' 0 ', num2)
num3 = re.sub('[1]+', ' 0 ', num)
num3 = re.sub('[2]+', ' 0 ', num3)
# print(num1)
# print(num2)
# print(num3)
num1 = num1.split()
num2 = num2.split()
num3 = num3.split()
# print(num1)
# print(num2)
# print(num3)
outStr = ''
for iter in range(len(num1)):
if num1[iter] != '0':
curEl = num1[iter]
elif num2[iter] != '0':
curEl = num2[iter]
else: # num3
curEl = num3[iter]
outStr += str(len(curEl)) + curEl[0]
#print(outStr)
return outStr
Mylist = []
curVal = '1'
i = 0
while i <= 30:
i += 1
Mylist.append(curVal)
curVal = GetNextNum(curVal)
print(len(Mylist[30]))
elapsed = (time.time() - start)
print("result returned after {0} seconds." .format(elapsed))
#5808
#result returned after 0.07800412178039551 seconds.


середа, 17 серпня 2016 р.

Projecteuler проблема №5

Недавно начал изучать Python и нашел интересный сайт с задачками, которые пробую решать с помощью Python.
Решил выложить свой вариант решения проблемы №5:
#https://projecteuler.net/problem=5
#python 3.5.2
import time
from functools import reduce as reduce
start = time.time()
simpleList = [2,3,5,7,11,13,17,19]
def DoItSimple(dig):
if dig in simpleList:
outputList.append(dig)
return dig
else:
for i in simpleList:
if dig % i == 0:
if dig//i in simpleList:
outputList.append(i)
outputList.append(dig//i)
return (dig//i)
else:
outputList.append(i)
return (DoItSimple(dig//i))
mainList = []
for x in range(2,21):
outputList = []
DoItSimple(x)
for i in outputList:
if mainList.count(i) < outputList.count(i):
mainList.append(i)
print(mainList)
print(reduce(lambda x, y: x * y, mainList))
elapsed = (time.time() - start)
print("result returned after {0} seconds." .format(elapsed))
"""
[2, 3, 2, 5, 7, 2, 3, 11, 13, 2, 17, 19]
232792560
result returned after 0.0 seconds.
"""


По поводу сайта https://projecteuler.net/problem=N: для перехода к новому заданию меняем N на номер "проблемы"