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.
