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

Request untuk menyalakan semua lampu
Request untuk mendapatkan status channel

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.

Relay Module 4 channel
Relay Module 4 channel

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.

0 0 votes
Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

0
Would love your thoughts, please comment.x
()
x