Skip to content

Commit d42deb3

Browse files
committed
Merge branch 'development' into prerelease-15.0.1
2 parents 9b04db7 + 76d4651 commit d42deb3

File tree

11 files changed

+143
-28
lines changed

11 files changed

+143
-28
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file.
33

44
## [Released]
55

6+
## [15.0.1] 20250614
7+
- Release Sharon
8+
9+
## [15.0.0.1] 20250614
10+
### Fixed
11+
- LVGL regression missing `lv.ANIM_OFF` and `lv.ANIM_ON` (#23544)
12+
- Berry fix `realline` (#23546)
13+
- LVGL HASPmota fix regression introduced with LVGL 9.3.0 (#23547)
14+
615
## [15.0.0] 20250613
716
- Release Sharon
817

RELEASENOTES.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Latest released binaries can be downloaded from
7575
- http://ota.tasmota.com/tasmota/release
7676

7777
Historical binaries can be downloaded from
78-
- http://ota.tasmota.com/tasmota/release-15.0.0
78+
- http://ota.tasmota.com/tasmota/release-15.0.1
7979

8080
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
8181

@@ -104,7 +104,7 @@ Latest released binaries can be downloaded from
104104
- https://ota.tasmota.com/tasmota32/release
105105

106106
Historical binaries can be downloaded from
107-
- https://ota.tasmota.com/tasmota32/release-15.0.0
107+
- https://ota.tasmota.com/tasmota32/release-15.0.1
108108

109109
The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasmota.com/tasmota32/release/tasmota32.bin``
110110

@@ -114,6 +114,12 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
114114

115115
[Complete list](BUILDS.md) of available feature and sensors.
116116

117+
## Changelog v15.0.1 Sharon
118+
### Fixed
119+
- Berry fix `realline` [#23546](https://github.com/arendst/Tasmota/issues/23546)
120+
- LVGL regression missing `lv.ANIM_OFF` and `lv.ANIM_ON` [#23544](https://github.com/arendst/Tasmota/issues/23544)
121+
- LVGL HASPmota fix regression introduced with LVGL 9.3.0 [#23547](https://github.com/arendst/Tasmota/issues/23547)
122+
117123
## Changelog v15.0.0 Sharon
118124
### Added
119125
- Provide serial upload port from VSC to PIO [#23436](https://github.com/arendst/Tasmota/issues/23436)
@@ -136,8 +142,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
136142
- HASPmota `antiburn()` [#23400](https://github.com/arendst/Tasmota/issues/23400)
137143
- HASPmota auto-dimming when no touch [#23425](https://github.com/arendst/Tasmota/issues/23425)
138144

139-
### Breaking Changed
140-
141145
### Changed
142146
- ESP8266 platform update from 2024.09.00 to 2025.05.00 [#23448](https://github.com/arendst/Tasmota/issues/23448)
143147
- ESP32 Platform from 2025.04.30 to 2025.05.30, Framework (Arduino Core) from v3.1.3.250411 to v3.1.3.250504 and IDF from v5.3.2.250403 to v5.3.3.250501 [#23404](https://github.com/arendst/Tasmota/issues/23404)
@@ -164,5 +168,3 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
164168
- LVGL Tasmota logo splash screen [#23538](https://github.com/arendst/Tasmota/issues/23538)
165169
- Matter and mDNS can be enabled at the same time [#23373](https://github.com/arendst/Tasmota/issues/23373)
166170
- Haspmota `haspmota.parse()` page parsing [#23403](https://github.com/arendst/Tasmota/issues/23403)
167-
168-
### Removed

lib/libesp32/berry_tasmota/src/be_port.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,18 +316,20 @@ char* be_fgets(void *hfile, void *buffer, int size)
316316
if (hfile != nullptr && buffer != nullptr && size > 0) {
317317
File * f_ptr = (File*) hfile;
318318
int ret = f_ptr->readBytesUntil('\n', buf, size - 1);
319-
// Serial.printf("be_fgets size=%d ret=%d\n", size, ret);
319+
// Serial.printf("be_fgets size=%d ret=%d, tell=%i, fsize=%i\n", size, ret, f_ptr->position(), f_ptr->size());
320320
if (ret >= 0) {
321321
buf[ret] = 0; // add string terminator
322-
if ((ret != 0) && (ret < size - 1)) {
322+
if ((ret == 0) && (f_ptr->position() >= f_ptr->size())) {
323+
return NULL;
324+
} else if (ret < size - 1) {
323325
buf[ret] = '\n';
324326
buf[ret+1] = 0;
325327
}
326328
return (char*) buffer;
327329
}
328330
}
329331
#endif // USE_UFILESYS
330-
return nullptr;
332+
return NULL;
331333
// return fgets(buffer, size, hfile);
332334
}
333335

lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ const be_const_member_t lv0_constants[] = {
237237
{ "ALIGN_TOP_MID", be_cconst_int(LV_ALIGN_TOP_MID) },
238238
{ "ALIGN_TOP_RIGHT", be_cconst_int(LV_ALIGN_TOP_RIGHT) },
239239
{ "ANIM_IMAGE_PART_MAIN", be_cconst_int(LV_ANIM_IMAGE_PART_MAIN) },
240+
{ "ANIM_OFF", be_cconst_int(LV_ANIM_OFF) },
241+
{ "ANIM_ON", be_cconst_int(LV_ANIM_ON) },
240242
{ "ANIM_PLAYTIME_INFINITE", be_cconst_int(LV_ANIM_PLAYTIME_INFINITE) },
241243
{ "ANIM_REPEAT_INFINITE", be_cconst_int(LV_ANIM_REPEAT_INFINITE) },
242244
{ "ARC_MODE_NORMAL", be_cconst_int(LV_ARC_MODE_NORMAL) },

lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ LV_LABEL_LONG_DOT=LV_LABEL_LONG_MODE_DOTS
183183
LV_LABEL_LONG_SCROLL=LV_LABEL_LONG_MODE_SCROLL
184184
LV_LABEL_LONG_SCROLL_CIRCULAR=LV_LABEL_LONG_MODE_SCROLL_CIRCULAR
185185
LV_LABEL_LONG_CLIP=LV_LABEL_LONG_MODE_CLIP
186+
LV_ANIM_OFF=LV_ANIM_OFF
187+
LV_ANIM_ON=LV_ANIM_ON
186188

187189
// ======================================================================
188190
// Generated from headers

lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,8 @@ def _get_static_enum_content(self) -> str:
508508
LV_LABEL_LONG_SCROLL=LV_LABEL_LONG_MODE_SCROLL
509509
LV_LABEL_LONG_SCROLL_CIRCULAR=LV_LABEL_LONG_MODE_SCROLL_CIRCULAR
510510
LV_LABEL_LONG_CLIP=LV_LABEL_LONG_MODE_CLIP
511+
LV_ANIM_OFF=LV_ANIM_OFF
512+
LV_ANIM_ON=LV_ANIM_ON
511513
512514
// ======================================================================
513515
// Generated from headers

lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_1_constants.be

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ lv.ALIGN_TOP_LEFT = 1
2424
lv.ALIGN_TOP_MID = 2
2525
lv.ALIGN_TOP_RIGHT = 3
2626
lv.ANIM_IMAGE_PART_MAIN = 0
27+
lv.ANIM_OFF = 0
28+
lv.ANIM_ON = 1
2729
lv.ANIM_PLAYTIME_INFINITE = -1
2830
lv.ANIM_REPEAT_INFINITE = -1
2931
lv.ARC_MODE_NORMAL = 0
@@ -428,11 +430,16 @@ lv.KEY_PREV = 11
428430
lv.KEY_RIGHT = 19
429431
lv.KEY_UP = 17
430432
lv.LABEL_DOT_NUM = 3
433+
lv.LABEL_LONG_CLIP = 4
434+
lv.LABEL_LONG_DOT = 1
431435
lv.LABEL_LONG_MODE_CLIP = 4
432436
lv.LABEL_LONG_MODE_DOTS = 1
433437
lv.LABEL_LONG_MODE_SCROLL = 2
434438
lv.LABEL_LONG_MODE_SCROLL_CIRCULAR = 3
435439
lv.LABEL_LONG_MODE_WRAP = 0
440+
lv.LABEL_LONG_SCROLL = 2
441+
lv.LABEL_LONG_SCROLL_CIRCULAR = 3
442+
lv.LABEL_LONG_WRAP = 0
436443
lv.LABEL_POS_LAST = 65535
437444
lv.LABEL_TEXT_SELECTION_OFF = 65535
438445
lv.LAYER_TYPE_NONE = 0

lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_haspmota.be

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2153,12 +2153,12 @@ class lvh_spangroup : lvh_obj
21532153
# label do not need a sub-label
21542154
def post_init(jline)
21552155
self._lv_obj.set_mode(lv.SPAN_MODE_BREAK) # use lv.SPAN_MODE_BREAK by default
2156-
self._lv_obj.refr_mode()
2156+
self._lv_obj.refresh()
21572157
super(self).post_init(jline) # call super -- not needed
21582158
end
21592159
# refresh mode
2160-
def refr_mode()
2161-
self._lv_obj.refr_mode()
2160+
def refresh()
2161+
self._lv_obj.refresh()
21622162
end
21632163
end
21642164

@@ -2176,7 +2176,7 @@ class lvh_span : lvh_root
21762176
# check if it is the parent is a spangroup
21772177
if isinstance(self._parent_lvh, self._page._hm.lvh_spangroup)
21782178
# print(">>> GOOD")
2179-
self._lv_obj = self._parent_lvh._lv_obj.new_span()
2179+
self._lv_obj = self._parent_lvh._lv_obj.add_span()
21802180
self._style = self._lv_obj.get_style()
21812181
else
21822182
print("HSP: 'span' should have a parent of type 'spangroup'")
@@ -2194,7 +2194,7 @@ class lvh_span : lvh_root
21942194
var font = self.parse_font(t)
21952195
if font != nil
21962196
self._style.set_text_font(font)
2197-
self._parent_lvh.refr_mode()
2197+
self._parent_lvh.refresh()
21982198
end
21992199
end
22002200

@@ -2271,7 +2271,7 @@ class lvh_span : lvh_root
22712271
# invoke
22722272
try
22732273
f(self._style, v)
2274-
self._parent_lvh.refr_mode()
2274+
self._parent_lvh.refresh()
22752275
except .. as e, m
22762276
raise e, m + " for " + k
22772277
end
@@ -2522,19 +2522,19 @@ class lvh_chart : lvh_obj
25222522
end
25232523
def set_y_min(_y_min)
25242524
self._y_min = _y_min
2525-
self._lv_obj.set_range(lv.CHART_AXIS_PRIMARY_Y, self._y_min, self._y_max)
2525+
self._lv_obj.set_axis_range(lv.CHART_AXIS_PRIMARY_Y, self._y_min, self._y_max)
25262526
end
25272527
def set_y_max(_y_max)
25282528
self._y_max = _y_max
2529-
self._lv_obj.set_range(lv.CHART_AXIS_PRIMARY_Y, self._y_min, self._y_max)
2529+
self._lv_obj.set_axis_range(lv.CHART_AXIS_PRIMARY_Y, self._y_min, self._y_max)
25302530
end
25312531
def set_y2_min(_y2_min)
25322532
self._y2_min = _y2_min
2533-
self._lv_obj.set_range(lv.CHART_AXIS_SECONDARY_Y, self._y2_min, self._y2_max)
2533+
self._lv_obj.set_axis_range(lv.CHART_AXIS_SECONDARY_Y, self._y2_min, self._y2_max)
25342534
end
25352535
def set_y2_max(_y2_max)
25362536
self._y2_max = _y2_max
2537-
self._lv_obj.set_range(lv.CHART_AXIS_SECONDARY_Y, self._y2_min, self._y2_max)
2537+
self._lv_obj.set_axis_range(lv.CHART_AXIS_SECONDARY_Y, self._y2_min, self._y2_max)
25382538
end
25392539

25402540
def set_series1_color(color)

lib/libesp32_lvgl/lv_haspmota/src/solidify/solidified_lv_haspmota.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9520,7 +9520,7 @@ static const bvalue be_ktab_class_lvh_spangroup[6] = {
95209520
/* K1 */ be_nested_str_weak(set_mode),
95219521
/* K2 */ be_nested_str_weak(lv),
95229522
/* K3 */ be_nested_str_weak(SPAN_MODE_BREAK),
9523-
/* K4 */ be_nested_str_weak(refr_mode),
9523+
/* K4 */ be_nested_str_weak(refresh),
95249524
/* K5 */ be_nested_str_weak(post_init),
95259525
};
95269526

@@ -9566,9 +9566,9 @@ be_local_closure(class_lvh_spangroup_post_init, /* name */
95669566

95679567

95689568
/********************************************************************
9569-
** Solidified function: refr_mode
9569+
** Solidified function: refresh
95709570
********************************************************************/
9571-
be_local_closure(class_lvh_spangroup_refr_mode, /* name */
9571+
be_local_closure(class_lvh_spangroup_refresh, /* name */
95729572
be_nested_proto(
95739573
3, /* nstack */
95749574
1, /* argc */
@@ -9579,7 +9579,7 @@ be_local_closure(class_lvh_spangroup_refr_mode, /* name */
95799579
NULL, /* no sub protos */
95809580
1, /* has constants */
95819581
&be_ktab_class_lvh_spangroup, /* shared constants */
9582-
be_str_weak(refr_mode),
9582+
be_str_weak(refresh),
95839583
&be_const_str_solidified,
95849584
( &(const binstruction[ 4]) { /* code */
95859585
0x88040100, // 0000 GETMBR R1 R0 K0
@@ -9601,7 +9601,7 @@ be_local_class(lvh_spangroup,
96019601
&be_class_lvh_obj,
96029602
be_nested_map(3,
96039603
( (struct bmapnode*) &(const bmapnode[]) {
9604-
{ be_const_key_weak(refr_mode, -1), be_const_closure(class_lvh_spangroup_refr_mode_closure) },
9604+
{ be_const_key_weak(refresh, -1), be_const_closure(class_lvh_spangroup_refresh_closure) },
96059605
{ be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_spangroup) },
96069606
{ be_const_key_weak(post_init, 0), be_const_closure(class_lvh_spangroup_post_init_closure) },
96079607
})),
@@ -9627,14 +9627,14 @@ static const bvalue be_ktab_class_lvh_span[31] = {
96279627
/* K15 */ be_nested_str_weak(is_color_attribute),
96289628
/* K16 */ be_nested_str_weak(parse_color),
96299629
/* K17 */ be_nested_str_weak(_parent_lvh),
9630-
/* K18 */ be_nested_str_weak(refr_mode),
9630+
/* K18 */ be_nested_str_weak(refresh),
96319631
/* K19 */ be_nested_str_weak(_X20for_X20),
96329632
/* K20 */ be_nested_str_weak(HSP_X3A_X20Could_X20not_X20find_X20function_X20set_),
96339633
/* K21 */ be_nested_str_weak(_lv_obj),
96349634
/* K22 */ be_nested_str_weak(_page),
96359635
/* K23 */ be_nested_str_weak(_hm),
96369636
/* K24 */ be_nested_str_weak(lvh_spangroup),
9637-
/* K25 */ be_nested_str_weak(new_span),
9637+
/* K25 */ be_nested_str_weak(add_span),
96389638
/* K26 */ be_nested_str_weak(get_style),
96399639
/* K27 */ be_nested_str_weak(HSP_X3A_X20_X27span_X27_X20should_X20have_X20a_X20parent_X20of_X20type_X20_X27spangroup_X27),
96409640
/* K28 */ be_nested_str_weak(parse_font),
@@ -10632,7 +10632,7 @@ be_local_class(lvh_tab,
1063210632
static const bvalue be_ktab_class_lvh_chart[29] = {
1063310633
/* K0 */ be_nested_str_weak(_y_min),
1063410634
/* K1 */ be_nested_str_weak(_lv_obj),
10635-
/* K2 */ be_nested_str_weak(set_range),
10635+
/* K2 */ be_nested_str_weak(set_axis_range),
1063610636
/* K3 */ be_nested_str_weak(lv),
1063710637
/* K4 */ be_nested_str_weak(CHART_AXIS_PRIMARY_Y),
1063810638
/* K5 */ be_nested_str_weak(_y_max),
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# LoRaWAN Decoder file for Dragino DDS75-LB/LS
2+
#
3+
# References
4+
# User Manual: https://wiki.dragino.com/xwiki/bin/view/Main/User%20Manual%20for%20LoRaWAN%20End%20Nodes/DDS75-LB_LoRaWAN_Distance_Detection_Sensor_User_Manual/
5+
# TTN Device Repository: https://github.com/TheThingsNetwork/lorawan-devices/blob/master/vendor/dragino/dds75-lb.js
6+
7+
import string
8+
9+
global.dds75lbNodes = {}
10+
11+
class LwDecoDDS75LB
12+
static def decodeUplink(Node, RSSI, FPort, Bytes)
13+
var data = {"Device":"Dragino DDS75-LB/LS"}
14+
data.insert("Node", Node)
15+
16+
var valid_values = false
17+
var last_seen = 1451602800
18+
var battery_last_seen = 1451602800
19+
var battery = 1000
20+
var rssi = RSSI
21+
var distance = 0
22+
23+
if global.dds75lbNodes.find(Node)
24+
last_seen = global.dds75lbNodes.item(Node)[1]
25+
battery_last_seen = global.dds75lbNodes.item(Node)[2]
26+
battery = global.dds75lbNodes.item(Node)[3]
27+
rssi = global.dds75lbNodes.item(Node)[4]
28+
distance = global.dds75lbNodes.item(Node)[5]
29+
end
30+
31+
## SENSOR DATA ##
32+
if 2 == FPort && 8 == Bytes.size() && 0 == ( Bytes[0] & 0x10 )
33+
last_seen = tasmota.rtc('local')
34+
35+
battery_last_seen = tasmota.rtc('local')
36+
battery = ((Bytes[0] << 8) | Bytes[1]) / 1000.0
37+
data.insert("BattV",battery)
38+
39+
distance=Bytes[2]<<8 | Bytes[3]
40+
data.insert("Distance",distance)
41+
42+
valid_values = true
43+
44+
## STATUS DATA ##
45+
elif 5 == FPort && 7 == Bytes.size()
46+
data.insert("Sensor_Model",Bytes[0])
47+
data.insert("Firmware_Version", f'v{Bytes[1]:%u}.{Bytes[2]>>4:%u}.{Bytes[2]&0xF:%u}')
48+
data.insert("Freq_Band",LwRegions[Bytes[3]-1])
49+
data.insert("Sub_Band",Bytes[4])
50+
battery_last_seen = tasmota.rtc('local')
51+
battery = ((Bytes[5] << 8) | Bytes[6]) / 1000.0
52+
valid_values = true
53+
else
54+
# Ignore other Fports
55+
end #Fport
56+
57+
if valid_values
58+
if global.dds75lbNodes.find(Node)
59+
global.dds75lbNodes.remove(Node)
60+
end
61+
# sensor[0] [1] [2] [3] [4] [5]
62+
global.dds75lbNodes.insert(Node, [Node, last_seen, battery_last_seen, battery, RSSI, distance])
63+
end
64+
65+
return data
66+
end #decodeUplink()
67+
68+
static def add_web_sensor()
69+
var msg = ""
70+
for sensor: global.dds75lbNodes
71+
var name = string.format("DDS75-L-%i", sensor[0])
72+
var name_tooltip = "Dragino DDS75-L"
73+
var last_seen = sensor[1]
74+
var battery_last_seen = sensor[2]
75+
var battery = sensor[3]
76+
var rssi = sensor[4]
77+
msg += lwdecode.header(name, name_tooltip, battery, battery_last_seen, rssi, last_seen)
78+
79+
# Sensors
80+
var distance = sensor[5]
81+
msg += "<tr class='htr'><td colspan='4'>&#9478;" # |
82+
msg += string.format(" &#11123;&#xFE0F; %.0fmm", distance) # ⭳
83+
msg += "{e}" # = </td></tr>
84+
end
85+
return msg
86+
end #add_web_sensor()
87+
end #class
88+
89+
LwDeco = LwDecoDDS75LB

0 commit comments

Comments
 (0)