Kontrol lampu led via network menggunakan Python FLask dan Raspberry pi 3

Artikel ini menjelaskan bagaimana membuat simulasi smart home API server sederhana untuk mengontrol lampu LED menggunakan FLASK
. Jadi misalkan tujuannya adalah kita dapat menyalakan/mematikan lampu via local network. Dengan begitu API ini bisa kita integrasikan dengan website, mobile apps(android/ios) misalnya namun, untuk sekarang ini kita akan akses API melalui aplikasi postman
.
Adapun komponen yang dipakai:
– 4 buah lampu LED
– 4 buah resistor 220 Ohm
– kabel jumper male to male
– Breadboard
– Raspberry pi 3
Install Flask
Jika belum pernah menginstall Flask cukup jalankan di terminal script di bawah untuk instalasinya:$pip install flask
$pip install flask-restful
Saatnya Koding
Buat file smarthome.py
dan tulis kode di bawah:
from flask import Flask, request, jsonify from flask_restful import Resource, Api from json import dumps import json import RPi.GPIO as GPIO app = Flask(__name__) api = Api(app) #Define Light Actuator GPIOs redLight = 13 greenLight = 17 yellowLight = 19 blueLight = 27 allChannel = 99 #Setup GPIOs GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(redLight, GPIO.OUT) GPIO.setup(greenLight, GPIO.OUT) GPIO.setup(yellowLight, GPIO.OUT) GPIO.setup(blueLight, GPIO.OUT) def off(pin): GPIO.output(pin,GPIO.LOW) return def on(pin): GPIO.output(pin,GPIO.HIGH) return api.add_resource(ChannelStatus, '/channel_status') class ChannelStatus(Resource): def get(self): redLightStatus = GPIO.input(redLight) greenLightStatus = GPIO.input(greenLight) yellowLightStatus = GPIO.input(yellowLight) blueLightStatus = GPIO.input(blueLight) data = { 'data' : { 'lists' : [ { 'name' : 'Lampu Merah', 'channel' : redLight, 'status' : redLightStatus, }, { 'name' : 'Lampu Hijau', 'channel' : greenLight, 'status' : greenLightStatus, }, { 'name' : 'Lampu Kuning', 'channel' : yellowLight, 'status' : yellowLightStatus, }, { 'name' : 'Lampu Biru', 'channel' : blueLight, 'status' : blueLightStatus, }, ], 'isAllLightsOn' : True if redLightStatus == 1 and greenLightStatus == 1 and yellowLightStatus == 1 and blueLightStatus == 1 else False, } } return jsonify(data) def get_data(data): json_data = json.loads(data) print("Deserialized data: {}".format(data)) return json_data @app.route('/channel_action', methods = ["POST"]) def post(): json_data = get_data(request.data) print(json_data) channelNumber = int(json_data["channel"]) light = redLight isOn = int(json_data["isOn"]) message = '' if channelNumber == redLight: light = redLight message = 'Lampu merah sudah' elif channelNumber == greenLight: light = greenLight message = 'Lampu hijau sudah' elif channelNumber == yellowLight: light = yellowLight message = 'Lampu kuning sudah' elif channelNumber == blueLight: light = blueLight message = 'Lampu biru sudah' elif channelNumber == allChannel: light = (redLight, greenLight, yellowLight, blueLight) message = 'Semua lampu sudah' else: return jsonify({'status':300, 'message':'Lampu tidak ditemukan'}) if isOn == 1: on(light) message = "%s dinyalakan" % (message) else: off(light) message = "%s dimatikan" % (message) return jsonify({'status':200, 'message': message}) if __name__ == '__main__': app.run(debug=True, port=4040, host='0.0.0.0')
Penjelasan:
Line 10-15 membuat variable untuk menentukan channel setiap lampu LED dipasang. Untuk allChannel = 99
hanya flagging untuk menyalakan semua lampu.
Posisi pin pada Raspberry pi bisa dilihat pada gambar di bawah.

Line 18-24 setup General Purpose Input Output(GPIO) Raspberry dan set channel ke kondisi mati (GPIO.OUT
)
Line 26-31 membuat fungsi untuk on/off channel
Line 33 menambahkan endpoint channel_status
dengan method GET
, jadi sebagai contoh kita dapat mengakses melalui http://192.168.2.9:4040/channel_status
Line 34-68 class ChannelStatus yang berfungsi untuk mendapatkan status terkini dari setiap channel LED dengan return JSON
Line 71-74 fungsi untuk decode json yang dipassing dari client sebagai request
Line 76 menambahkan endpoint channel_action
dengan method POST
, jadi sebagai contoh kita dapat mengakses melalui http://192.168.2.9:4040/channel_action
. Untuk endpoint ini membutuhkan parameter dengan format JSON. contoh:{ channel: 13, isOn: 1}
channel = 13 / 17 / 19 / 99
isOn = 1 / 0 (hidup / mati)
Line 113-114 script untuk menjalankan server dengan port 4040
Run Run Run…
Jalankan script pada terminal$python smarthome.py

kemudian buka apikasi postman
untuk melakukan request


Note: Pastikan Raspberry pi dan laptop/pc terhubung dalam 1 jaringan yang sama
Kesimpulan
Project ini dapat dikembangkan seperti untuk menyalakan lampu rumah dengan tambahan Relay Module 10A 250VAC untuk channel disesuaikan dengan kebutuhan berapa banyak lampu yang ingin dikontrol.

Tapi sebaiknya sebelum mencoba kamu harus tahu minimal dasar-dasar kelistrikan, karena berbahaya mengingat bermain di tegangan tinggi. ⚠️
Lalu API ini juga dapat diakses via website / mobile apps lewat jaringan yang sama.
Semoga bermanfaat.