Tasmota/tasmota/berry/lvgl_examples/buttons_demo.be

102 lines
4.1 KiB
Python

#- start LVGL and init environment -#
lv.start()
hres = lv.get_hor_res() # should be 240
vres = lv.get_ver_res() # should be 320
scr = lv.scr_act() # default screean object
f20 = lv.montserrat_font(20) # load embedded Montserrat 20
f28 = lv.montserrat_font(28) # load embedded Montserrat 28
#- Backgroun -#
scr.set_style_bg_color(lv.color(0x000066), lv.PART_MAIN | lv.STATE_DEFAULT)
#- Upper state line -#
stat_line = lv.label(scr)
if f20 != nil stat_line.set_style_text_font(f20, lv.PART_MAIN | lv.STATE_DEFAULT) end
stat_line.set_long_mode(lv.LABEL_LONG_SCROLL) # auto scrolling if text does not fit
stat_line.set_width(hres)
stat_line.set_align(lv.TEXT_ALIGN_LEFT) # align text left
stat_line.set_style_bg_color(lv.color(0xD00000), lv.PART_MAIN | lv.STATE_DEFAULT) # background #000088
stat_line.set_style_bg_opa(lv.OPA_COVER, lv.PART_MAIN | lv.STATE_DEFAULT) # 100% background opacity
stat_line.set_style_text_color(lv.color(0xFFFFFF), lv.PART_MAIN | lv.STATE_DEFAULT) # text color #FFFFFF
stat_line.set_text("Tasmota")
stat_line.refr_size() # new in LVGL8
stat_line.refr_pos() # new in LVGL8
#- display wifi strength indicator icon (for professionals ;) -#
wifi_icon = lv_wifi_arcs_icon(stat_line) # the widget takes care of positioning and driver stuff
clock_icon = lv_clock_icon(stat_line)
#- create a style for the buttons -#
btn_style = lv.style()
btn_style.set_radius(10) # radius of rounded corners
btn_style.set_bg_opa(lv.OPA_COVER) # 100% backgrond opacity
if f28 != nil btn_style.set_text_font(f28) end # set font to Montserrat 28
btn_style.set_text_color(lv.color(0x000000)) # text color black when not checked
#- register buttons -#
var btns = [] # relay buttons are added to this list to match with Tasmota relays
#- callback function when a button is pressed -#
#- checks if the button is in the list, and react to EVENT_VALUE_CHANGED event -#
def btn_clicked_cb(obj, event)
var btn_idx = btns.find(obj)
if btn_idx != nil
var checked = (obj.get_state() & lv.STATE_CHECKED) != 0
tasmota.set_power(btn_idx, checked) # toggle the value
end
end
#- create a button object, set style, register callback and add to global list -#
#- you still need to re-position the button -#
def create_btn_relay(label)
var btn, btn_label
btn = lv.btn(scr)
btn.set_pos(30, 30)
btn.set_size(hres - 60, 60)
btn.add_style(btn_style, lv.PART_MAIN | lv.STATE_DEFAULT) # style of button
btn.add_flag(lv.OBJ_FLAG_CHECKABLE) # enable toggle mode
btn_label = lv.label(btn)
btn_label.center()
btn_label.set_text(label)
btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0) # set callback to update Tasmota relays
btns.push(btn) # append button to the list
return btn
end
#- create 3 buttons -#
var btn1 = create_btn_relay("Relay 1")
btn1.set_y(30)
var btn2 = create_btn_relay("Relay 2")
btn2.set_y(100)
var btn3 = create_btn_relay("Relay 3")
btn3.set_y(170)
#- update the buttons values according to internal relays status -#
def btns_update()
var power_list = tasmota.get_power() # get a list of booleans with status of each relay
for b:btns
var checked = (b.get_state() & lv.STATE_CHECKED) != 0
var power_state = (size(power_list) > 0) ? power_list.pop(0) : false # avoid exception if less relays than buttons
if power_state && !checked
b.add_state(lv.STATE_CHECKED)
elif !power_state && checked
b.clear_state(lv.STATE_CHECKED)
end
end
end
#- update every 500ms -#
def btns_update_loop()
btns_update()
tasmota.set_timer(500, btns_update_loop)
end
btns_update_loop() # start
# If you change the style after creating the button, you need to update objects:
def btns_refresh_style()
for b:btns b.refresh_style(lv.OBJ_PART_MAIN, lv.STYLE_PROP_ALL) end
end