Sunday, October 29, 2017

ตั้งเวลาเปิดพัดลมให้แมวด้วย Python กับ DHT11

1.ติดตั้งสิ่งที่จำเป็น
sudo apt-get install git-core
sudo apt-get install build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

2.แก้ไข code ตัวอย่างสำหรับตรวจสอบอุณหภูมิ
cd Adafruit_Python_DHT/examples
nano AdafruitDHT.py
แก้ตรงส่วนเช็คอุณหภูมิด้านล่างของไฟล์ ถ้าอุณหภูมิสูงกว่า 27 องศา return ค่าเป็น 1
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
    if temperature > 27:
        print 1
    else:
        print 0 
else:
    print('Error')

3.สร้างไฟล์ dht11mqtt.h เพื่อเรียกใช้ python แล้วสั่งไปที่ MQTT Broker อีกที (11 คือ DHT11, 4 คือ GPIO4)
#!/bin/bash
result=`python /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py "11" "4"`
if [ $result == "1" ]; then
    echo "hot"
    mosquitto_pub -h 192.168.x.x -t "cmnd/fan1/power" -m 1
    mosquitto_pub -h 192.168.x.x -t "cmnd/fan2/power" -m 1
else
    echo "cool"
fi

4.ตั้ง crontab ให้เรียก script มาเช็คอุณหภูมิทุก 30 นาที
*/30 10-18 * * 1-5 /home/pi/Adafruit_Python_DHT/dht11mqtt.sh

Tuesday, October 24, 2017

How to schedule Power On/Off Raspberry Pi

วิธีตั้งเวลา Power On/Off Raspberry Pi
   เรื่อง Shutdown หรือ Wakeup Raspberry Pi หลายคนคงค้นเจอเยอะแล้ว แต่นี่น่าจะเป็นการ Power On และ Power Off ที่ค่อนข้างตรงความหมายจริง ๆ คือ จ่ายและหยุดจ่ายไฟ

วงจรการทำงาน
  ณ จุด ๆ นี้ ขอบอกเลยว่า เราเน้นที่การตั้งเวลา Power On และ Power Off ไม่ได้คำนึงในแง่ของการประหยัดไฟ ดังนั้นเราจะใช้อุปกรณ์มาควบคุมการจ่ายไฟเพิ่มนั่นก็คือ Sonoff นั่นเอง ตามรูป

หลักการทำงาน
Shutdown :
1.ตั้ง crontab ที่ Raspberry Pi ให้ shutdown ตามเวลาที่ต้อง
sudo crontab -e
0 18 * * 1,2,3,4,5,6 /sbin/shutdown -h now

Power Off/On :
2.Setup MQTT Broker ตามตัวอย่าง http://www.komkid.net/2017/10/mqtt.html

3.โปรแกรม Sonoff ให้เป็น MQTT Client ซึ่งมีหลายวิธี แต่ทำตามตัวอย่างนี้ ก็สะดวกดี https://github.com/arendst/Sonoff-Tasmota โดย setup ให้ subscribe ไปที่ topic ชื่อ raspberrypi

4.ตั้ง crontab ที่ broker หรือที่ MQTT Client ก็ได้ให้ publish ไปที่ topic ที่ว่า เช่น
3 18 * * * mosquitto_pub -h 127.0.0.1 -t "cmnd/raspberrypi/power" -m "0"
0 8 * * * mosquitto_pub -h 127.0.0.1 -t "cmnd/raspberrypi/power" -m "1"
คือ ตั้งเวลาให้ Sonoff หยุดจ่ายไฟหลังจาก Shutdown แล้ว และตั้งเวลาให้จ่ายไฟเพื่อเปิดเครื่อง ตอน 8.00 น.
5.หรือเช็คว่า Pi ปิดไปแล้วหรือยังก่อนตัดไฟโดยให้ crontab เรียก Ping จาก shell script เพื่อตรวจสอบแทนที่จะส่งข้อความให้ปิดไปที่ broker เลย
ping -w 3 IP_ADDRESS
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
    echo 'Shutting down'
    mosquitto_pub -t "cmnd/raspberrypi/power" -m "0"    
else
    echo 'Pi3C is running!'
fi


ควบคุมอุปกรณ์ในบ้านด้วย home-assistant.io

1.ติดตั้ง (ที่มา : https://home-assistant.io/docs/installation/raspberry-pi/)
sudo apt-get install python3 python3-venv python3-pip
sudo useradd -rm homeassistant
$ cd /srv
$ sudo mkdir homeassistant
$ sudo chown homeassistant:homeassistant homeassistant
$ sudo su -s /bin/bash homeassistant
$ cd /srv/homeassistant
$ python3 -m venv .
$ source bin/activate
(homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant
(homeassistant) $ hass
2.เข้าใช้งานที่ http://ipaddress:8123
3.ตั้งค่าให้ run เป็น service
$ sudo nano /etc/systemd/system/home-assistant@homeassistant.service
[Unit]
Description=Home Assistant
After=network.target

[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"

[Install]
WantedBy=multi-user.target
$ sudo systemctl enable home-assistant@homeassistant
$ sudo systemctl start home-assistant@homeassistant
sudo journalctl -f -u home-assistant@homeassistant
4.ปรับแต่ง Configuration ซึ่งจะอยู่ที่ /home/homeassistant/.homeassistant/
4.1 ไฟล์ configuration.yaml จะเป็นไฟล์หลัก ดังตัวอย่าง
homeassistant:
  # Name of the location where Home Assistant is running
  name: Home
  # Location required to calculate the time the sun rises and sets
  latitude: 13.75
  longitude: 100.4833
  # Impacts weather/sunrise data (altitude above sea level in meters)
  elevation: 8
  # metric for Metric, imperial for Imperial
  unit_system: metric
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: Asia/Bangkok
  # Customization file
  customize: !include customize.yaml

# Show links to resources in log and frontend
#introduction:

# Enables the frontend
frontend:

รูปแบบก็คือ ชื่อ config ต่อด้วยเครื่องหมาย : แล้วเว้นวรรคทีนึง ตามด้วย ค่าของ config
เช่น name: Home
Config ส่วนไหนจะใช้ก็ปล่อยไว้ ถ้าไม่ใช้ก็ใส่เครื่องหมาย # ไว้ด้านหน้า

4.2 เพิ่มเติม Config ส่วนของ MQTT
mqtt:
  broker: 127.0.0.1

4.3 include config อื่น ๆ เช่น
light: !include light.yaml
fan: !include fan.yaml
switch: !include switch.yaml
camera: !include camera.yaml

ตัวอย่างไฟล์ light.yaml
  - platform: mqtt
    name: "Bedroom"
    command_topic: "cmnd/LightBedroom/Power"
    state_topic: "stat/LightBedroom/POWER"

ตัวอย่างไฟล์ camera.yaml
  - platform: mjpeg
    name: Camera TV
    still_image_url: http://192.168.x.x:xxx/image.jpg
    mjpeg_url: http://192.168.x.x:xxx/video/mjpg.cgi
    username: user
    password: xxxxxx


5.Upgrade : (https://home-assistant.io/docs/installation/virtualenv/)
  1. Stop Home Assistant
  2. $ sudo su -s /bin/bash homeassistant
    $ cd /srv/homeassistant
    $ source bin/activate
  3. $ python3 -m pip install --upgrade homeassistant
  4. Start Home Assistant

Saturday, October 21, 2017

Pi-Hole : Ads blocking via Raspberry Pi

Pi-Hole : Ads blocking via Raspberry Pi : https://pi-hole.net/
- ปิดโฆษณาในระดับเครือข่าย คือ ปิดสำหรับทุกอุปกรณ์ที่เชื่อมต่อ
- โฆษณา อ่านว่า โคด-สะ-นา มีเทคนิคให้จำได้จนขึ้นใจ คือ เจอคำนี้ให้คิดถึงโคตรพ่อโคตรแม่ไว้ จะอ่านถูก
- ติดตั้งง่ายมาก ใช้คำสั่งเดียว คือ curl -sSL https://install.pi-hole.net | bash
- หลังจากติดตั้งแล้วจะได้รหัสผ่านสำหรับ login เข้าเมนู admin ต้องจำไว้ให้ดี ถ้าจำไม่ได้ต้องใช้คำสั่ง sudo pihole -a -p เพื่อสร้างรหัสใหม่
- ก่อนจะติดตั้ง ต้องบอกก่อนว่า pihole ทำงานผ่าน lighttpd บนพอร์ท 80 ถ้าใช้ apache อยู่ก่อนแล้วอาจมีปัญหา
- หลังจากติดตั้งก็แล้วก็ตั้งค่า Router ให้จ่าย DHCP โดยใช้ pihole เป็น DNS
- ถ้าตั้งค่าที่ Router ไม่ได้ ก็มาตั้งที่ pihole ซึ่งสามารถจ่าย DHCP  ได้ด้วย
- บางเกมส์ใน Android ที่เปิดโอกาสให้ดู VDO เพื่อรับ Item หรือ Promotion พิเศษอาจจะถูก blocked ไปด้วย ต้อง login เข้าไป Disable Pi-hole ชั่วคราว

Pi-VPN : OpenVPN on Raspberry Pi

วิธี Setup ให้ Raspberry Pi เป็น OpenVPN Server (Pi-VPN) : https://www.sitepoint.com/setting-up-a-home-vpn-using-your-raspberry-pi/
1.Download Script สำหรับ Setup
curl -L https://install.pivpn.io | bash
2.เลือก Network Interface ที่จะใช้
3.ระบบจะต้องใช้ Sataic IP เท่านั้น (จะเป็น Fixed Static หรือ Static DHCP ก็ได้)
4.เลือก User ที่จะเก็บ Config ใช้ pi เลยก็ได้
5.เลือก unattended upgrades เพื่อให้ระบบทันสมัยและปลอดภัยอยู่เสมอ
6.เลือก port ที่จะใช้ ใช้ 1194 หรือจะเปลี่ยนเพื่อความปลอดภัยมากขึ้นอีกนิดก็ได้ (ต้องไปตั้งค่า port ของ client ให้ตรงกันด้วย)
7.ตั้งค่าความยากของการเข้ารหัสเป็น 2048 ตามที่ script แนะนำ (แล้วรอสักพักใหญ่ ๆ)
8.ตั้งค่าของ Public IP (ถ้า IP อาจมีการเปลี่ยนแปลงก็ใช้ DNS Entry แล้วเลือกใช้ของ Google ก็ได้)
9.สร้าง user สำหรับใช้งานด้วยคำสั่ง
pivpn add

หมายเหตุ :
ถ้าใช้ Raspbian Stretch อาจมีปัญหาในการ AUTHEN ต้องเปลี่ยน Key ใหม่ ดังนี้
cd /etc/openvpn/easy-rsa
sudo ./easyrsa set-rsa-pass user
sudo nano pki/private/user.key
แล้ว copy Key รวมทั้ง Header ไปด้วย เอาไปวางแทนที่ ENCRYPTED PRIVATE KEY ในไฟล์ .ovpn

ที่มา : https://www.reddit.com/r/raspberry_pi/comments/6w0dxs/openvpnpivpn_on_raspbian_stretch_error_parsing/



Friday, October 20, 2017

เริ่มต้นกับ MQTT

MQTT เป็นชื่อ Protocol หนึ่งไว้สำหรับรับ-ส่งข้อมูลอย่างง่าย เป็นที่นิยมใช้ในอุปกรณ์ IOT : Internet Of Thing (รายละเอียด : https://en.wikipedia.org/wiki/MQTT)

หลักการทำงานพอสังเขป :
1.สื่อสารกันโดยประกาศว่าจะส่งข้อความ (Publish) และรอรับข้อความ (Subscribe)
2.มี Broker เป็นตัวกลางในการสื่อสาร

สองรูปแทนสองหมื่นตัวอักษร (เครดิตรูปและคำอธิบายจาก https://github.com/arendst/Sonoff-Tasmota/wiki/MQTT-Overview)

1.ติดตั้ง Broker
sudo apt-get install mosquitto
2.ติดตั้ง client
sudo apt-get install mosquitto-clients

3.เริ่มใช้งาน
3.1 ให้ Client ตัวหนึ่ง สมัครรับข้อความทุกอย่างจาก Broker (สมัครรับหัวข้อ (topic) ไหน ก็จะได้รับเฉพาะ topic นั้น แต่ตัวอย่างนี้ใช้ # เพื่อขอดูทุก topic)
mosquitto_sub -h 192.168.xx.xx -t "#"


3.2 ให้ client อีกตัว ประกาศข้อความ ในหัวข้อเรื่อง (topic) "obtrusive"
mosquitto_pub -h 192.168.xx.xx -t "obtrusive" -m "Not yours"

3.3 Client ที่สมัครรับ topic นั้นไว้ก็จะได้รับข้อความ ตามตัวอย่าง


4.แนวทางการใช้งานกับอุปกรณ์ IOT (ตัวอย่างการทำให้อุปกรณ์ IOT ชื่อ Sonoff รองรับ MQTT : https://github.com/arendst/Sonoff-Tasmota)
4.1 ให้อุปกรณ์ IOT เป็น MQTT Client รอรับ Topic ที่สนใจเช่น เป็น IOT ที่ทำหน้าที่เปิดไฟก็ Subscribe รับ Topic ชื่อ LivingRoom (mosquitto_sub -h 192.168.x.x -t "LivingRoom")
4.2 ตั้ง crontab ให้ Publish ข้อความ 0 หรือ 1 ไปที่ Topic ชื่อ LivingRoom (mosquitto_pub -h 192.168.x.x -t "LivingRoom" -m 1)

4.3 สั่งงานผ่าน Client รูปแบบอื่น เช่น MQTT Client on Android, Webservice, REST

เริ่มต้นใช้งาน Raspberry Pi

1.ติดตั้ง
1.1 Download Raspbian Image จาก https://www.raspberrypi.org/downloads/raspbian/
1.2 Download โปรแกรมสำหรับเขียน Image ลง SDCard  จาก https://etcher.io/
1.3 เขียน Image ลง SDCard

2.ปรับแต่งเบื้องต้น
2.1 ตั้งค่า WIFI โดยเปิด SDCard บน Computer แล้วแก้ไขไฟล์ /etc/wpa_supplicant/wpa_supplicant.conf ดังนี้
network={
ssid="SSID"
psk="password"
key_mgmt=WPA-PSK
}


2.2 ทำให้ระบบทันสมัย
sudo apt update
sudo apt upgrade

*** ถ้ามี apt-cacher-ng ก็สร้างไฟล์ /etc/apt/apt.conf.d/02-proxy แล้วใส่ค่านี้ลงไป
Acquire::http::Proxy "http://192.168.xx.xx:3142";
*** วิธี setup apt-cacher-ng จาก github

2.3 สั่ง sudo raspi-config เพื่อตั้งค่าพื้นฐาน เช่น hostname, locale, timezone

3.ติดตั้ง GUI (ที่มา : https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=133691)
3.1 ติดตั้งสิ่งที่จำเป็น
sudo apt-get install --no-install-recommends xserver-xorg
sudo apt-get install --no-install-recommends xinit
sudo apt-get install raspberrypi-ui-mods
sudo apt-get install lightdm


3.2 เรียกใช้งาน GUI ด้วยคำสั่ง startx หรือ ตั้งค่าให้ boot เข้าอัตโนมัติจากคำสั่ง sudo raspi-config

3.3 ติดตั้ง VNC ไว้ให้ Remote ใช้งานง่าย ๆ (ที่มา : https://www.raspberrypi.org/documentation/remote-access/vnc/)
sudo apt-get install realvnc-vnc-server
แล้วเปิดใช้งานได้จากเมนู Interfacing Options ของ raspi-config

Tips :
backup sdcard without empty space : sudo dd if=/dev/sdb | gzip > backup.img.gz
restore : cat backup.img.gz | gunzip | dd of=/dev/sdb

Monday, May 29, 2017

Script for 7 days backup

#!/bin/bash
today=$(date +%u)
tomorrow=$(date --date='tomorrow' +%u)

cd BACKUP_PATH
mkdir $today
mv THE_BACKUP $today
rm -r $tomorrow