-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfeed.xml
More file actions
583 lines (572 loc) · 69 KB
/
feed.xml
File metadata and controls
583 lines (572 loc) · 69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
<title>FlexMeasures</title>
<link href="https://flexmeasures.io/feed.xml" rel="self" />
<link href="https://flexmeasures.io" />
<updated>2026-04-15T17:19:30+02:00</updated>
<author>
<name>SeitaBV</name>
</author>
<id>https://flexmeasures.io</id>
<entry>
<title>v0.32: Flex-config on graphs</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v032-flex-config-on-graphs/"/>
<id>https://flexmeasures.io/v032-flex-config-on-graphs/</id>
<media:content url="https://flexmeasures.io/media/posts/57/flex-config-preview.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2026-04-15T17:03:00+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/57/flex-config-preview.png" alt="Flex config dialogue for dashboard graphs" />
Version v0.32 of FlexMeasures improves the UX of building dashboards with information in the flex-context and flex-model. Also, we added functionality on the sensor page: a button to create forecasts…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/57/flex-config-preview.png" class="type:primaryImage" alt="Flex config dialogue for dashboard graphs" /></p>
<div class="post__inner post__entry">
<p>Version v0.32 of FlexMeasures improves the UX of building dashboards with information in the flex-context and flex-model.</p>
<p>Also, we added functionality on the sensor page: a button to create forecasts and a button to delete data. Plus, the layout of actions on the sensor page is now nicer & more usable.</p>
<p>Here are some other notable features:</p>
<ul>
<li>improving hovering the data points on graphs</li>
<li>switch dev environment to uv (faster installations)</li>
<li>Annotations (see v0.31 how they look like in the UI) can be sent via the API</li>
</ul>
<p>This release consists of around 30 PRs. <a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-32-0-april-15-2026" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
</div>
<h2>Flex config on graphs</h2>
<p>We wrote about the flexibility configuration before. The flex-context and flex-model are cornerstones for FlexMeasures' ability to optimize any energy site. Until now, graph dashboards in FlexMeasures could be built with any sensor, but you would have to know which sensors are actually the ones influencing how FlexMeasures computes schedules. </p>
<p>Now, flex-context and flex-model a first-class citizens also when creating a dashboard. See here how that works:</p>
<figure class="post__video"><iframe loading="lazy" width="688" height="387" style="width: 688px; height: 387px;" src="https://www.youtube.com/embed/47lRg90GjJQ?si=Iyqq3UlFYhe2yq8f" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe></figure>
<h2>"Create forecasts" and "Delete data" on sensor page</h2>
<p>The sensor page got a visual cleanup on the left side, where actions appear from the left. We added new actions (deleting data and adding forecasts) and as such the UX for the actions was getting difficult to navigate.</p>
<div class="gallery-wrapper gallery-wrapper--wide"><div class="gallery" data-is-empty="false" data-translation="Add images" data-columns="3">
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-38-28.png" data-size="650x491"><img loading="lazy" src="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-38-28-thumbnail.png" alt="" width="650" height="491"></a>
<figcaption>Cleaner Layout for actions</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-36-16.png" data-size="644x493"><img loading="lazy" src="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-36-16-thumbnail.png" alt="" width="644" height="493"></a>
<figcaption>Deleting data</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-36-00.png" data-size="631x493"><img loading="lazy" src="https://flexmeasures.io/media/posts/57/gallery/Screenshot-from-2026-04-13-17-36-00-thumbnail.png" alt="" width="631" height="493"></a>
<figcaption>Adding forecasts</figcaption>
</figure>
</div></div>
]]>
</content>
</entry>
<entry>
<title>v0.31: Forecasting API & data annotations</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v031-forecasting-api-annotations/"/>
<id>https://flexmeasures.io/v031-forecasting-api-annotations/</id>
<media:content url="https://flexmeasures.io/media/posts/56/Screenshot-from-2026-02-23-20-04-05.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2026-02-28T21:01:00+01:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/56/Screenshot-from-2026-02-23-20-04-05.png" alt="Annotations on prices in the FlexMeasures UI" />
Version v0.31 of FlexMeasures adds API endpoints to control forecasting and (brings back) visual annotations on time series data. Here are other notable features: As you can tell by this…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/56/Screenshot-from-2026-02-23-20-04-05.png" class="type:primaryImage" alt="Annotations on prices in the FlexMeasures UI" /></p>
<div class="post__inner post__entry">
<p>Version v0.31 of FlexMeasures adds API endpoints to control forecasting and (brings back) visual annotations on time series data.</p>
<p>Here are other notable features:</p>
<ul>
<li>Schedules can now be returned in a custom resolution </li>
<li>The upload form (on the sensor page is improved): allow uploading data with different units (different resolution already supported), data can have gaps and better error handling</li>
<li>Step-by-step replay in graphs</li>
<li>The SwaggerUI API page can now be customized (incl. link to signup page)</li>
<li>The 2FA code form (step of login) has improved UX</li>
<li>JSON attributes (on assets, sensors) are now searchable (by code)</li>
<li>Python3.9 has been deprecated</li>
<li>We started using Copilot agents in PRs (for development)</li>
</ul>
<p>As you can tell by this long list, this release lingered a bit to long and has >60 PRs! So this is worthy of upgrading ... <a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-31-0-february-28-2026" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
</div>
<h2>Forecasting API</h2>
<p>Forecasting is crucial to FlexMeasures' main purpose (which is scheduling). The <a href="https://flexmeasures.io/v030-forecasting-revamped/">new forecasting pipeline in v0.30</a> was only available via the CLI, however. That is fine for running forecasting in cron jobs, but we heard from users they would like to control forecasting from their scripts - and also client scripting uses the API.</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/56/Screenshot-from-2026-02-23-20-18-55.png" alt="Forecasting API as shown in Swagger UI" width="600" height="480" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-xs.png 300w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-sm.png 480w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-md.png 768w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-lg.png 1024w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-xl.png 1360w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-18-55-2xl.png 1600w"></figure>
<figcaption >Forecastig trigger endpoint, as shown in FlexMeasures SwaggerUI</figcaption>
</figure>
<p>We took some time to design the API for this, as it should be both powerful but also simple to use if one wants a straightforward forecast. </p>
<p>This work was done in several pull requests. </p>
<h2>Annotations</h2>
<p>In the FlexMeasures design philosophy, we believe it is not enough to show & use time series data. It can matter very much <a href="https://github.com/SeitaBV/timely-beliefs" target="_blank" rel="noopener noreferrer">who said it, and when</a>. </p>
<p>But even after the data is in the platform, people might have something to say about it. Label it, if you will. Examples can be that an operator describes why an asset misbehaved that morning, or we can label a set of prices as coming from a manual upload.</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/56/Screenshot-from-2026-02-23-20-04-05-2.png" alt="" width="500" height="401" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-xs.png 300w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-sm.png 480w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-md.png 768w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-lg.png 1024w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-xl.png 1360w ,https://flexmeasures.io/media/posts/56/responsive/Screenshot-from-2026-02-23-20-04-05-2-2xl.png 1600w"></figure>
<figcaption >An example annotation: some prices were uploaded manually</figcaption>
</figure>
<p>Annotations on the sensor page graph have been fixed and improved (they did exost before, but were not very usable). They behave better on hover, they appear in order during playback and they can overlap.</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/56/168248640-15f546db-b1df-4373-bade-315f59180019.gif" alt="" width="600" height="251"></figure>
<figcaption >Hovering over annotations shows the description.</figcaption>
</figure>
<p>This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1967" target="_blank" rel="noopener noreferrer">1967</a>. </p>
<p>We are <a href="https://github.com/FlexMeasures/flexmeasures/pull/1968">currently working</a> on supporting the addition of annotations better in the API.</p>
]]>
</content>
</entry>
<entry>
<title>Talk at FOSDEM 2026: Community Energy Management (CEMS)</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/talk-at-fosdem-2026-cems/"/>
<id>https://flexmeasures.io/talk-at-fosdem-2026-cems/</id>
<media:content url="https://flexmeasures.io/media/posts/55/20260131-Nico_Rikken-IMG_5923-cropped.jpg" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2026-02-17T10:43:50+01:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/55/20260131-Nico_Rikken-IMG_5923-cropped.jpg" alt="Nicolas presenting at FOSDEM 2025" />
At FOSDEM 2026, there was an energy devroom again (4th time!). This time, we got to present a proof-of-concept of Community Energy Management. You can see the talk here (and…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/55/20260131-Nico_Rikken-IMG_5923-cropped.jpg" class="type:primaryImage" alt="Nicolas presenting at FOSDEM 2025" /></p>
<p>At <a href="https://fosdem.org/2026/">FOSDEM 2026</a>, there was an <a href="https://fosdem.org/2026/schedule/track/energy/">energy devroom</a> again (4th time!). This time, we got to present a proof-of-concept of Community Energy Management.</p>
<p>You can see the talk here (and the slides are on <a href="https://fosdem.org/2026/schedule/event/ACPYNR-community_energy_management_with_flexmeasures_fully_scriptable/">the talk page</a>):</p>
<figure class="post__video"><video loading="lazy" width="750" height="346" controls="controls" data-mce-fragment="1">
<source src="https://video.fosdem.org/2026/aw1126/ACPYNR-community_energy_management_with_flexmeasures_fully_scriptable.av1.webm" type="video/webm" type="video/webm" /><source src="https://fosdem.org/2024/schedule/event/fosdem-2024-2509-using-flexmeasures-to-build-a-climate-tech-startup-in-15-minutes/" /></video></figure>
<p><span class="break-words
tvm-parent-container"><span dir="ltr">Community energy management systems (CEMS) are a hot topic. A CEMS makes sure that an energy community (of households and/or SMEs) behaves in a concerted way (to the grid, to a flex market).<br><br>For our approach with FlexMeasures, we made a design choice (which I also explain in the talk): We decided to keep buildings as autonomous as possible.<br><br>FlexMeasures is built for making buildings orchestrate their assets. We decided to keep that aspect in FlexMeasures - and when FlexMeasures also acts as a CEMS, it will not dictate each and every asset what to do, but will signal the problematic time slots and ask the local building HEMS (also FlexMeasures in our PoC, can be different ones later) to recompute their schedules.</span></span></p>
<p><span class="break-words
tvm-parent-container"><span dir="ltr">The language for this nudging are prices. This can also mean that in principle other HEMS could be in the mix.</span></span></p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/55/20260131-Nico_Rikken-IMG_5925.jpg" alt="The energy devroom at FOSDEM 2026" width="750" height="500" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-xs.jpg 300w ,https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-sm.jpg 480w ,https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-md.jpg 768w ,https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-lg.jpg 1024w ,https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-xl.jpg 1360w ,https://flexmeasures.io/media/posts/55/responsive/20260131-Nico_Rikken-IMG_5925-2xl.jpg 1600w"></figure>
<figcaption >Pictured: The energy devroom at FOSDEM 2026</figcaption>
</figure>
<p><span class="break-words
tvm-parent-container"><span dir="ltr">This work is currently being worked out in the "FleXeD" project with (among others) TNO. The specific motivation for FleXeD is that new neighbourhoods do not get approved unless it can be shown that the connections can collectively stay below a given capacity limit.</span></span></p>
<p><span style="color: var(--text-primary-color); font-family: var(--editor-font-family); font-size: inherit; font-weight: var(--font-weight-normal);">If you have questions about these presented topics, do make sure to </span><a href="https://flexmeasures.io/get-in-touch/" style="font-family: var(--editor-font-family); font-size: inherit; font-weight: var(--font-weight-normal);">contact us</a><span style="color: var(--text-primary-color); font-family: var(--editor-font-family); font-size: inherit; font-weight: var(--font-weight-normal);">.</span></p>
]]>
</content>
</entry>
<entry>
<title>v0.30: Forecasting revamped</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v030-forecasting-revamped/"/>
<id>https://flexmeasures.io/v030-forecasting-revamped/</id>
<media:content url="https://flexmeasures.io/media/posts/54/Forecasting.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-11-20T20:35:17+01:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/54/Forecasting.png" alt="Forecasting in the FlexMeasures UI" />
Version v0.30 of FlexMeasures revamps forecasting - in short, we now support fixed- viewpoint forecasting, which is much better suited to real-life usage than the previous implementation, and use more…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/54/Forecasting.png" class="type:primaryImage" alt="Forecasting in the FlexMeasures UI" /></p>
<div class="post__inner post__entry">
<p>Version v0.30 of FlexMeasures revamps forecasting - in short, we now support fixed- viewpoint forecasting, which is much better suited to real-life usage than the previous implementation, and use more modern tooling.</p>
<p>Three other notable features:</p>
<ul>
<li>Expose prior commitments as part of the flex-model (and costs for schedules deviating from them) ― a powerful modeling feature</li>
<li>Two big improvements in documentation: Flex-config fields and a new tutorial</li>
<li>Consultants can now see client assets on dashboard ― supporting these kind of users is good for a scaled, multi-tenant platform.</li>
</ul>
<p>Plus, as always, a lot of small tweaks have happened! <a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-30-0-december-02-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
</div>
<h2>Fixed view-point forecasting</h2>
<p>Forecasting is crucial to FlexMeasures' main purpose (which is scheduling). We need to have an idea about energy consumption in the near future, so we can plan it.</p>
<p>There was a way for doing that in FlexMeasures, but we rewrote that completely.</p>
<p>The biggest change is that we went from rolling-viewpoint forecasting to fixed-viewpoint forecasting.</p>
<p>Before, when we made forecasts for some time range (e.g. covering 24 hours), each prediction covered the same relative forecast horizon. So, let's say we made 24 forecasts, and each one had a six-hour horizon - basically this represents a simulation of moving an hour at a time and making one forecast each time, for six hours ahead.</p>
<p>More realistic for simulations, but also much more usable in real-time scenarios, is to make multiple forecasts each time. So, for one fixed view point (e.g. now), we make several forecasts, maybe even 24, covering each hour of the time period. We'd overwrite each existing forecasts with the most recent (and most likely more accurate forecast).</p>
<p>Weather forecasts services are already delivered like that - you ask their API for a forecast, and you get 24 hourly forecasts― the best for each hour that are known right now. The forecast for one hour from now will be highly accurate, and the one for 22 hours from now less so. Forecasts always get much more accurate the smaller the forecasting horizon becomes. However, having a forecast with a 22-hour horizon is nice to have for a planning platform like FlexMeasures, much better than having none.</p>
<p>We also improved on periodic re-training, so even in larger forecasting jobs, covering longer time windows, we can keep accuracy high.</p>
<p>Also, the forecasts work out-of-the box as historic forecasts (with some in-built support for columns like time of day or day of the week and year), but we made it straightforward to add more regressors - basically sensors where valuable information is stored (like forecasted outdoor temperatures).</p>
<p>Finally, we updated which underlying models are used. We use an <a href="https://en.wikipedia.org/wiki/LightGBM" target="_blank" rel="noopener noreferrer">LGBM</a> model via <a href="https://unit8co.github.io/darts/" target="_blank" rel="noopener noreferrer">Darts</a>, but it is also easy to use others.</p>
<p>The new forecasting is now available as CLI command (<code>flexmeasures add forecasts</code>), but we are also building an API endpoint for triggering forecasts.</p>
<p>Read <a href="https://flexmeasures.readthedocs.io/latest/features/forecasting.html" target="_blank" rel="noopener noreferrer">more in the docs</a>. This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1546" target="_blank" rel="noopener noreferrer">1546</a> (the lower PR ID tells you this has been long cooking), and more are following. </p>
<h2>Commitments</h2>
<p>The flex-context in FlexMeasures can include prior commitments. One example of a prior commitment might be how a large consumer buys a profile on the day-ahead market and wants FlexMeasures to compute schedules that stay close to that profile (to avoid imbalance prices).</p>
<p>Each commitment has a baseline value (which can also be a sensor, i.e. a profile), and can have prices for deviating up- or downwards (which are applied inside the optimization problem to steer the schedule).</p>
<p>Here is an example to see how it looks like with one commitment:</p>
<pre class="notranslate"><code class="notranslate">{
"flex_context":<br> {<br> "commitments":<br> [<br> {<br> "baseline": "400 kW",<br> "up-price": "304 EUR/MWh",<br> "down-price": "530 EUR/MWh",<br> }<br> ]<br> }
}</code></pre>
<p>So this says we committed to using 400 kW consistently (this could also be a time series, like a sensor or time blocks). And deviating from that has certain costs for the scheduler to take into consideration.</p>
<p>Actually, prior commitments have been part of the scheduler for some time, and we use them as a generic way to encode capacity limits as soft constraints. Soft constraints do not break the scheduler if they are breached, which returns a zero-schedule (which happens with hard constraints). Also, this allows us to stack several such commitments or constraints into one problem in a generic way.</p>
<p>So until now commitments basically were some "magic", happening when a user selected a few certain flex-context fields. Now they are also usable for anything one might build.</p>
<p>Other ideas:</p>
<ul>
<li>PPAs (baseline is the agreed consumption or production, prices denote prices if it is not met)</li>
<li>modeling savings in gas usage (baseline is 0, meaning gas is used to satisfy all heat demand - every deviation is a good thing, as electricity replaced some heat. Upward price models the actual price of gas) </li>
<li>Nudging to lower CO₂ intensity (the main objective might remain to optimize electricity prices, but a commitment can model a penalty on CO₂ - either CO₂ taxes explicitly, or an internal weight)</li>
</ul>
<p>We still have to support them in the UI, but the principle is there, and can be quite powerful. This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1754" target="_blank" rel="noopener noreferrer">1754</a> and <a href="https://github.com/FlexMeasures/flexmeasures/pull/1793" target="_blank" rel="noopener noreferrer">1793</a>. </p>
<h2>Documentation</h2>
<p>We take documentation seriously, as the key ingredient to building an eco-system around a project. </p>
<p>We spent considerable effort in improving this, again.</p>
<p>First, the flex configuration is the key ingredient to building many distinct smart energy services using FlexMeasures. We improved the documentation of each field in flex-context and flex-model, and we made sure this is replicated in 3 places: ReadTheDocs, SwaggerDocs and the UI dialogues where you can set fields.</p>
<p>Now there is unprecented wealth of customization knowledge at your fingertips. the picture below from SwaggerDocs, I only opened the schema information about the consumption price setting in the flex-context (available in the docs of the schedule-triggering API endpoint):</p>
<figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/54/Screenshot-from-2025-11-30-17-03-32.png" alt="" width="750" height="513" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-xs.png 300w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-sm.png 480w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-md.png 768w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-lg.png 1024w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-xl.png 1360w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-17-03-32-2xl.png 1600w"></figure>
<p>Second, we added <a href="https://flexmeasures.readthedocs.io/latest/tut/toy-example-multiasset-curtailment.html" target="_blank" rel="noopener noreferrer">a new tutorial</a>: "PV curtailment and Multi-asset scheduling". It explains how to add a new type of flexible asset (curtailable PV), in combination with a battery, as well.</p>
<p>Here is one of the graphs, as shown in the CLI:</p>
<figure class="post__image"><img loading="lazy" src="https://flexmeasures.io/media/posts/54/Screenshot-from-2025-11-30-18-44-22.png" alt="A plot of PV power (uncurtailed) and battery power" width="751" height="463" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-xs.png 300w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-sm.png 480w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-md.png 768w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-lg.png 1024w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-xl.png 1360w ,https://flexmeasures.io/media/posts/54/responsive/Screenshot-from-2025-11-30-18-44-22-2xl.png 1600w"></figure>
<h2>Improved dashboard for consultants and clients</h2>
<p>We made the dashboard more useful for users who have access to several accounts. This is true for admins but also consultants. Admins saw a list of all possible accounts, consultants saw only their own assets.</p>
<ul>
<li>Consultants see their client accounts below the map, and the assets can be filtered by those.</li>
<li>Admins see only accounts that are not "end-nodes", i.e. clients - only consultants.</li>
</ul>
<figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/54/consultants-dashboard.png" alt="Better consultant for consultants and admins" width="750" height="292" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-xs.png 300w ,https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-sm.png 480w ,https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-md.png 768w ,https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-lg.png 1024w ,https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-xl.png 1360w ,https://flexmeasures.io/media/posts/54/responsive/consultants-dashboard-2xl.png 1600w"></figure>
<p>This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1763" target="_blank" rel="noopener noreferrer">1763</a>.</p>
<p> </p>
]]>
</content>
</entry>
<entry>
<title>v0.29: Flex-model & SwaggerUI</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v029-flex-model-swaggerui/"/>
<id>https://flexmeasures.io/v029-flex-model-swaggerui/</id>
<media:content url="https://flexmeasures.io/media/posts/53/Screenshot-from-2025-10-10-11-23-51-2.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-10-14T17:45:08+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/53/Screenshot-from-2025-10-10-11-23-51-2.png" alt="a KPI widget" />
Version v0.29 of FlexMeasures moves the flex-model of assets on the data model and adds a UI to edit it. Also, the API docs are moving to OpenAPI format, and…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/53/Screenshot-from-2025-10-10-11-23-51-2.png" class="type:primaryImage" alt="a KPI widget" /></p>
<div class="post__inner post__entry">
<p>Version v0.29 of FlexMeasures moves the flex-model of assets on the data model and adds a UI to edit it. Also, the API docs are moving to OpenAPI format, and developers can interact with it via SwaggerUI!<br><br>Both of these larger features make FlexMeasures much more applicable to real-world integrations. FlexMeasures not only needs to do smart things, it needs to be interactive and configurable.<br><br>Plus, as always, a lot of small tweaks have happened!</p>
<p><a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-29-0-october-14-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
</div>
<div class="post__inner post__entry">
<h2>Flex-model</h2>
<p>As you might know, FlexMeasures has ways to configure flexibility in the given assets - the <a href="https://flexmeasures.readthedocs.io/latest/features/scheduling.html#describing-flexibility">flex-model and flex-context</a> . The flex-context has been configurable on the asset via a UI dialogue since version 0.25 (and not only via the API when scheduling). Now, the flex-model also is supported.<br><br>This screenshot probably says more than a thousand words:</p>
<figure class="post__image" ><img loading="lazy" src="https://flexmeasures.io/media/posts/53/Screenshot-from-2025-10-13-14-16-45.png" alt="Editing the flex-model of an asset" width="750" height="327" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-xs.png 300w ,https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-sm.png 480w ,https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-md.png 768w ,https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-lg.png 1024w ,https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-xl.png 1360w ,https://flexmeasures.io/media/posts/53/responsive/Screenshot-from-2025-10-13-14-16-45-2xl.png 1600w">
<figcaption >Editing the flex-model of an asset</figcaption>
</figure>
<p>You can specify in this dialogue how any schedule needs to treat this asset. Here, state of charge (SoC) settings matter a lot - it is a heat buffer. Charging Efficiency is 300% ― a COP of 3.<br><br>As with the flex-context, many settings can be dynamic. In essence, they can be sensors. For example, the SoC Min setting can be a sensor, so you can plan different flexibility headrooms for different days of the week (an office can be cold in the weekend, so the heat storage has more flex to "play" with in the scheduling). Often, forecasts are instrumental in such dynamic settings, and we will have a major update on those in v0.30!<br><br>This work was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1429">1429</a>, <a href="https://github.com/FlexMeasures/flexmeasures/pull/1565">1565</a> and <a href="https://github.com/FlexMeasures/flexmeasures/pull/1713">1713</a>. (the PR IDs tell you that we needed to work on this a long time, as it touches the core of scheduling, and we took care of migrating older attributes that were used for similar things beforehand, for backwards compatibility)</p>
<h2>Open API / SwaggerUI</h2>
<p>The FlexMeasures API is rather rich (and has grown!). It is crucial for integrating FlexMeasures into other systems, i.e. IoT gateways that send data and pull schedules, or custom UIs / dashboards. Or custom client scripts which setup new assets and sensors, for automating the addition and control of sites.<br><br>We document the API endpoints via Sphinx, but it would be much more developer-friendly to do that with the OpenAPI standard. In particular, developers want to browse available endpoints on a host, and even try them out live - this is possible with SwaggerUI, which was the originator for what is now OpenAPI, and still the most-used API UI.</p>
<div class="gallery-wrapper gallery-wrapper--wide"><div class="gallery" data-is-empty="false" data-translation="Add images" data-columns="2">
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/53/gallery/Screenshot-from-2025-10-10-11-23-51.png" data-size="1444x751"><img loading="lazy" src="https://flexmeasures.io/media/posts/53/gallery/Screenshot-from-2025-10-10-11-23-51-thumbnail.png" alt="List of endpoints" width="720" height="374"></a>
<figcaption>List of endpoints</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/53/gallery/Screenshot-from-2025-10-13-14-43-23.png" data-size="1297x920"><img loading="lazy" src="https://flexmeasures.io/media/posts/53/gallery/Screenshot-from-2025-10-13-14-43-23-thumbnail.png" alt="Trying out an endpoint from SwaggerUI" width="720" height="511"></a>
<figcaption>Trying out an endpoint from SwaggerUI</figcaption>
</figure>
</div></div>
<p> </p>
<p>This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1703" target="_blank" rel="noopener noreferrer">1703</a>.</p>
</div>
]]>
</content>
</entry>
<entry>
<title>v0.28: Daily KPIs, faster graphs</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v028-daily-kpis/"/>
<id>https://flexmeasures.io/v028-daily-kpis/</id>
<media:content url="https://flexmeasures.io/media/posts/52/KPI-preview.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-09-09T16:35:14+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/52/KPI-preview.png" alt="a KPI widget" />
Version v0.28 of FlexMeasures brings the ability to show daily KPIs above the graphs. Also, we improved the performance of viewing graphs. Plus, a lot of small tweaks have happened!…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/52/KPI-preview.png" class="type:primaryImage" alt="a KPI widget" /></p>
<div class="post__inner post__entry">
<p>Version v0.28 of FlexMeasures brings the ability to show daily KPIs above the graphs. Also, we improved the performance of viewing graphs.</p>
<p>Plus, a lot of small tweaks have happened!</p>
<p><a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-28-0-september-10-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
</div>
<div class="post__inner post__entry">
<h2>Daily KPIs</h2>
<p>Until now, FlexMeasures would only let you see graphs data. We do have a reporting engine, but you have to know it is there (one tutorial does help you use it) and showing that data is your own job.</p>
<p>Now, we make the first step for such data to step into the light - daily KPIs (e.g. daily energy costs) can be shown above the graphs:</p>
<figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/52/KPIs-full.png" alt="KPIs shown on top of graphs" width="800" height="429" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/52/responsive/KPIs-full-xs.png 300w ,https://flexmeasures.io/media/posts/52/responsive/KPIs-full-sm.png 480w ,https://flexmeasures.io/media/posts/52/responsive/KPIs-full-md.png 768w ,https://flexmeasures.io/media/posts/52/responsive/KPIs-full-lg.png 1024w ,https://flexmeasures.io/media/posts/52/responsive/KPIs-full-xl.png 1360w ,https://flexmeasures.io/media/posts/52/responsive/KPIs-full-2xl.png 1600w"></figure>
<p>This is the way to configure such KPI widgets at the moment:</p>
<p><code>[</code><br><code> {"title": "My KPI", "sensor": 2, "function": "sum"},</code><br><code> {"title": "Raw Power KPI", "sensor": 3, "function": "sum"}</code><br><code>]</code></p>
<p>The function setting can be either "sum", "mean", "max" or "min". We are working on a graphical way to set these soon. Until then, see <a href="https://flexmeasures.readthedocs.io/latest/views/asset-data.html#showing-daily-kpis">this documentation</a> on how to use htis feature.</p>
<p>This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1608" target="_blank" rel="noopener noreferrer">1608</a>, <a href="https://github.com/FlexMeasures/flexmeasures/pull/1656" target="_blank" rel="noopener noreferrer">1656</a> , <a href="https://github.com/FlexMeasures/flexmeasures/pull/1633" target="_blank" rel="noopener noreferrer">1633</a> and <a href="https://github.com/FlexMeasures/flexmeasures/pull/1634" target="_blank" rel="noopener noreferrer">1634</a></p>
<h2>Faster graphs page</h2>
<p>The graphs page is very important to check in on a site, especially if it is new. It had some UX problems, which we fixed in JavaScript, as well as some data processing problems in the backend when loading graph data, which we fixed there.</p>
<p>As a result. waiting for data to load should be taking less time, and larger data set can be viewed.</p>
<p>This work was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1641" target="_blank" rel="noopener noreferrer">1641</a>,<a href="https://github.com/FlexMeasures/flexmeasures/pull/1645" target="_blank" rel="noopener noreferrer"> 1645</a> and<a href="https://github.com/FlexMeasures/flexmeasures/pull/1596" target="_blank" rel="noopener noreferrer"> 1596</a>.</p>
</div>
]]>
</content>
</entry>
<entry>
<title>Video: Inspecting sensor data in FlexMeasures</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/video-inspecting-sensor-data/"/>
<id>https://flexmeasures.io/video-inspecting-sensor-data/</id>
<media:content url="https://flexmeasures.io/media/posts/51/Screenshot-from-2025-07-23-22-13-32.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-07-23T22:15:19+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/51/Screenshot-from-2025-07-23-22-13-32.png" alt="Vlad presenting at FOSDEM 2025" />
You cannot do excellent energy optimization without understanding the data you work with. We have developed a lot of features recently, so that you can inspect your data ― with…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/51/Screenshot-from-2025-07-23-22-13-32.png" class="type:primaryImage" alt="Vlad presenting at FOSDEM 2025" /></p>
<p>You cannot do excellent energy optimization without understanding the data you work with. </p>
<p>We have developed a lot of features recently, so that you can inspect your data ― with basic stats, the Playback feature, bar charts & heat maps and even manual data upload!</p>
<p>In this 3-minute video, we walk you through all of it.</p>
<figure class="post__video">
<div style="padding: 56.25% 0 0 0; position: relative;"><iframe loading="lazy" width="688" height="330" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" src="https://player.vimeo.com/video/1104764816?h=44252a2999&badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin" title="Seita: Sensor data inspection in FlexMeasures" data-mce-fragment="1"></iframe></div>
<script src="https://player.vimeo.com/api/player.js"></script>
</figure>
<p>If you have questions about sensor data capabilities in FlexMeasures, make sure to <a href="https://flexmeasures.io/get-in-touch/">contact us</a>.</p>
]]>
</content>
</entry>
<entry>
<title>v0.27: multi-asset scheduling & 2FA</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v027-multi-asset-and-2fa/"/>
<id>https://flexmeasures.io/v027-multi-asset-and-2fa/</id>
<media:content url="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-14-18-03-02.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-07-14T16:50:59+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-14-18-03-02.png" alt="Snippet from the 2FA form" />
Version v0.27 of FlexMeasures brings a long-overdue feature: ability to schedule multiple flexible assets in one go 👯. Also, a major step towards modern cyber-security 🔐 standards: two-factor authentication. And…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-14-18-03-02.png" class="type:primaryImage" alt="Snippet from the 2FA form" /></p>
<div class="post__inner post__entry">
<p>Version v0.27 of FlexMeasures brings a long-overdue feature: ability to schedule multiple flexible assets in one go 👯. Also, a major step towards modern cyber-security 🔐 standards: two-factor authentication.</p>
<p>And there is even more: upload data per file, edit users, ...</p>
<p><a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-27-0-july-16-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements (>40 PRs!).</p>
<p>Let's dive int the two main features!</p>
</div>
<div class="post__inner post__entry">
<h2>Multi-asset scheduling</h2>
<p>Until now, you can tell FlexMeasures to find an optimal schedule for a device (e.g. a battery). We already have used FlexMeasures to schedule sites with more than one flexible device (e.g. also EVs), but with one caveat: we scheduled one flexible device after the other (sequentially - we'll add a short explanation below).</p>
<p>Anyway, we were lacking an endpoint to run one simultaneuous optimization for a combined schedule, and after several preparation steps and testing in the last few months, we added <a href="https://flexmeasures.readthedocs.io/latest/api/v3_0.html#post--api-v3_0-assets-(id)-schedules-trigger">this one</a>:</p>
<p><code><span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/v3_0/assets/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/schedules/trigger</span></span></code></p>
<p>"Trigger FlexMeasures to create a schedule for a collection of flexible and inflexible devices."</p>
<p>Of course, we stay true to the ambition that each device can be steered so that the schedule fits its unique constraints, and thus telling FlexMeasures about the flex-models can look like this:</p>
<pre id="codecell6"><span class="p">{</span>
<span class="nt">"start"</span><span class="p">:</span> <span class="s2">"2015-06-02T10:00:00+00:00"</span><span class="p">,</span>
<span class="nt">"flex-model"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">"sensor"</span><span class="p">:</span> <span class="mi">931</span><span class="p">,</span>
<span class="nt">"soc-at-start"</span><span class="p">:</span> <span class="mf">12.1</span><span class="p">,</span>
<span class="nt">"soc-unit"</span><span class="p">:</span> <span class="s2">"kWh"</span><span class="p">,</span>
<span class="nt">"power-capacity"</span><span class="p">:</span> <span class="s2">"25kW"</span><span class="p">,</span>
<span class="nt">"consumption-capacity"</span> <span class="p">:</span> <span class="p">{</span><span class="nt">"sensor"</span><span class="p">:</span> <span class="mi">42</span><span class="p">},</span>
<span class="nt">"production-capacity"</span> <span class="p">:</span> <span class="s2">"30 kW"</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="nt">"sensor"</span><span class="p">:</span> <span class="mi">932</span><span class="p">,</span>
<span class="nt">"consumption-capacity"</span><span class="p">:</span> <span class="s2">"0 kW"</span><span class="p">,</span>
<span class="nt">"production-capacity"</span><span class="p">:</span> <span class="p">{</span><span class="nt">"sensor"</span><span class="p">:</span> <span class="mi">760</span><span class="p">},</span>
<span class="p">}</span>
<span class="p">],</span>
<span class="nt">"flex-context"</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">"consumption-price-sensor"</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>
<span class="nt">"production-price-sensor"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="nt">"inflexible-device-sensors"</span><span class="p">:</span> <span class="p">[</span><span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">15</span><span class="p">],</span>
<span class="nt">"site-power-capacity"</span><span class="p">:</span> <span class="s2">"100kW"</span><span class="p">,</span>
<span class="nt">"site-production-capacity"</span><span class="p">:</span> <span class="s2">"80kW"</span><span class="p">,</span>
<span class="nt">"site-consumption-capacity"</span><span class="p">:</span> <span class="p">{</span><span class="nt">"sensor"</span><span class="p">:</span> <span class="mi">32</span><span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span></pre>
<p>This is for two devices (see the endpoint docs for more explanation of this example). For more flexible devices, the body becomes longer. Luckily, we are also working on letting you specify all flex-model fields on the asset data models (for flex-context, that already is the case). </p>
<p>We are really happy that this finally is in place. This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1065" target="_blank" rel="noopener noreferrer">1065</a> , but actually you'll find preparation steps going back more than 6 months. </p>
<p>Now, how does "sequential" scheduling work? After each device we scheduled, we were adding the already scheduled ones to the list of inflexible devices, so the next schedule would take them into account. This approach might scale better with a large number of devices, but we found that the new simultaneous approach also works well with ~100 devices. However, it is still an interesting approach, so the new endpoint offers it, as well (just pass<code class="docutils literal notranslate"><span class="pre">sequential=true</span></code>).</p>
<h2>Two-factor authentication</h2>
<p>Cyber-security is more and more crucial when running a serious service - and that is what we aim FlexMeasures to be.</p>
<p>That means we had to increase the level of security. A lot of that happens in anybody's cloud environment, but FlexMeasures itself needs to also be hardened. </p>
<p>So version 0.27 adds Two-factor Authentication, the mechanism where only one factor (your password) is not enough to log into the service. In this first implementation, users need a separate token, as well, which is sent to their email address. We can expand this to support QR codes (for security apps) or SMS.</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-20-17-40-40.png" alt="Second login step if 2FA is enabled - form for the 2nd factor code" width="500" height="528" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-xs.png 300w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-sm.png 480w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-md.png 768w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-lg.png 1024w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-xl.png 1360w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-20-17-40-40-2xl.png 1600w"></figure>
<figcaption >Second login step if 2FA is enabled - form for the 2nd factor code</figcaption>
</figure>
<p> </p>
<p>TFA is off by default, so anyone hosting FlexMeasures should <a href="https://flexmeasures.readthedocs.io/latest/host/installation.html#two-factor-authentication">consider turning it on</a>.</p>
<p>This work was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1555" target="_blank" rel="noopener noreferrer">1555</a>,<a href="https://github.com/FlexMeasures/flexmeasures/pull/1562" target="_blank" rel="noopener noreferrer"> 1562</a> and<a href="https://github.com/FlexMeasures/flexmeasures/pull/1564" target="_blank" rel="noopener noreferrer"> 1564</a>.</p>
<p>A final note on security in FlexMeasures: we take this seriously on a few fronts: We are upgrading our dependencies with every minor version, we use GitHub's Dependabot and are now starting to scan its code regularly for any potential issues.</p>
<h2>Upload data</h2>
<p>To get any data into FlexMeasures, you needed to use the API or CLI. Now there is another way: Sometimes, all you need is to get data from a file into the platform (e.g. to add history for forecasting, or tomorrow's prices). And this is possible now:</p>
<h2><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-14-17-57-04.png" alt="Upload form on the sensor page" width="336" height="385" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-xs.png 300w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-sm.png 480w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-md.png 768w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-lg.png 1024w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-xl.png 1360w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-17-57-04-2xl.png 1600w"></figure>User editing</h2>
<p>User editing was possible via the API, but the UI was missing. We finally got around to do this. Now you can even add/remove roles:</p>
<figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/50/Screenshot-from-2025-07-14-15-56-17.png" alt="Editing a user in the UI" width="650" height="516" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-xs.png 300w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-sm.png 480w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-md.png 768w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-lg.png 1024w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-xl.png 1360w ,https://flexmeasures.io/media/posts/50/responsive/Screenshot-from-2025-07-14-15-56-17-2xl.png 1600w"></figure>
</div>
]]>
</content>
</entry>
<entry>
<title>v0.26: relaxed scheduling, cleaner asset pages</title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v026-relaxed-scheduling-cleaner-asset-pages/"/>
<id>https://flexmeasures.io/v026-relaxed-scheduling-cleaner-asset-pages/</id>
<media:content url="https://flexmeasures.io/media/posts/49/Screenshot-from-2025-06-03-23-06-33.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-05-29T14:18:26+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/49/Screenshot-from-2025-06-03-23-06-33.png" alt="Our dashboard with " />
Version v0.26 of FlexMeasures makes the scheduler more flexible for edge situations (in which the target might be just out of reach, or not all targets can be satisfied). This…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/49/Screenshot-from-2025-06-03-23-06-33.png" class="type:primaryImage" alt="Our dashboard with " /></p>
<div class="post__inner post__entry">
<p>Version v0.26 of FlexMeasures makes the scheduler more flexible for edge situations (in which the target might be just out of reach, or not all targets can be satisfied). This is an important step in scheduling that behaves according to the priorities of each site.</p>
<p>Also, the UI for showing assets got an important update - we split the overloaded asset page into several pages. This improves browsing and loading times.</p>
<p><a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-26-0-june-03-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements (49 PRs!).</p>
<p>Let's dive int the two main features!</p>
</div>
<div class="post__inner post__entry">
<h2>Relaxed scheduling</h2>
<p>You can tell FlexMeasures to find an optimal schedule within a list of constraints (e.g. grid constraints, minimum fill level of EV batteries etc.). Sometimes the perfect solution does not exist. FlexMeasures should still present a schedule that is the best it can do. But which goal/constraint is most important? We are working on letting the user decide.</p>
<p>Let us consider a simple example: In the V2G Liberty project (which uses FlexMeasures as a scheduling backend), the user can give a minimal charge level, for when they plan longer trips. FlexMeasure should attempt to reach this target, but sometimes the user might have given FlexMeasures too little time to accomplish that.</p>
<p>Here is a visualization:</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/V2GLiberty-Screenshot.png" alt="" width="700" height="549" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-xs.png 300w ,https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-sm.png 480w ,https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-md.png 768w ,https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-lg.png 1024w ,https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-xl.png 1360w ,https://flexmeasures.io/media/posts/49/responsive/V2GLiberty-Screenshot-2xl.png 1600w"></figure>
<figcaption >The V2GLiberty app, showing FlexMeasures' schedule (orange) and the minimal-charge window (blue)</figcaption>
</figure>
<p>Here, the minimal charge window cannot be reached, but FlexMeasures will reach the minimal level as early as possible. In earlier version of the FlexMeasures scheduler, it might have told you that no valid solution exists. But of course, here the user wants it to try.</p>
<p>If there are multiple competing goals/constraints, it becomes a matter of priority. In FlexMeasures, penalties can now be set for any breaches of these goals/constrains, which is a way for the system operator to determine which of them matters more than others.</p>
<div class="message-body normal-message-body" data-v-62a2ac48="">
<div class="message-main" data-v-f2ec36a0="" data-v-62a2ac48="">
<div class="message-main__text markdown-message" data-v-f2ec36a0="">
<div class="rich-text--wrapper rich-text--wrapper-markdown" dir="auto" data-v-1de82f09="" data-v-f2ec36a0="">
<div data-v-1de82f09="">
<div data-v-1de82f09="">
<p data-v-1de82f09="">We have 3 types of relaxations (each in two directions) whose prices can all be set in the flex-context and flex-model:</p>
<ul data-v-1de82f09="">
<li data-v-1de82f09="">site-consumption-capacity / site-production-capacity</li>
<li data-v-1de82f09="">soc-minima / soc-maxima (for each device)</li>
<li data-v-1de82f09="">consumption-capacity / production-capacity (for each device)</li>
</ul>
<p>For instance, there is a <code class="docutils literal notranslate"><span class="pre">site-consumption-breach-price</span></code> attribute in the flex-context, where you could tell FlexMeasures that <code class="docutils literal notranslate"><span class="pre">site-consumption-capacity</span></code> is a soft constraint, but how important it is to you. You could set it to 1000 EUR/MW (if your optimization problem uses EUR as target). You could think of the setting as a (contractual) penalty. The setting can even be a sensor, so the penalties can vary over the time of day!</p>
</div>
</div>
</div>
</div>
</div>
</div>
<p>This work (most of it) was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1300" target="_blank" rel="noopener noreferrer">1300</a> and <a href="https://github.com/FlexMeasures/flexmeasures/pull/1405" target="_blank" rel="noopener noreferrer"> 1405</a>.</p>
<h2>Cleaner asset pages - and a bonus</h2>
<p>The asset is our central data type. They have sensors, or even sub-assets ― they are the building blocks of site structures in FlexMeasures. Until now, FlexMeasures had one asset page in the UI, where the user could:</p>
<ul>
<li>look at (and edit) graphs</li>
<li>edit asset properties</li>
<li>see the asset connectivity status</li>
<li>see the audit log</li>
</ul>
<p>Recently, we added the capability to edit the flex context. It became a bit much, and the page also tool longer to load.</p>
<p>We separated the page into dedicated pages, for easier and faster navigation, and we added a context view, for when an asset hierarchy is build to model a site:</p>
<div class="gallery-wrapper gallery-wrapper--wide"><div class="gallery" data-is-empty="false" data-translation="Add images" data-columns="2">
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-25-20.png" data-size="1487x739"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-25-20-thumbnail.png" alt="" width="720" height="358"></a>
<figcaption>Context page</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-45-37.png" data-size="1486x753"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-45-37-thumbnail.png" alt="" width="720" height="365"></a>
<figcaption>Graphs page</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-23-06-33.png" data-size="428x361"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-23-06-33-thumbnail.png" alt="" width="428" height="361"></a>
<figcaption>Dashboard links to all pages</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-48-27.png" data-size="1485x742"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-48-27-thumbnail.png" alt="" width="720" height="360"></a>
<figcaption>Properties page</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-56-30.png" data-size="1484x746"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-56-30-thumbnail.png" alt="" width="720" height="362"></a>
<figcaption>Status page</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-48-51.png" data-size="1485x559"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-22-48-51-thumbnail.png" alt="" width="720" height="271"></a>
<figcaption>Audit log page</figcaption>
</figure>
<figure class="gallery__item"><a href="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-23-01-27.png" data-size="1486x699"><img loading="lazy" src="https://flexmeasures.io/media/posts/49/gallery/Screenshot-from-2025-06-03-23-01-27-thumbnail.png" alt="" width="720" height="339"></a>
<figcaption>Context page: location</figcaption>
</figure>
</div></div>
<p>Also nice: users can select their favorite asset page, so when they visit the asset, they always see that view first (per default it is the context page).</p>
<p>And: we worked on the breadcrumbs for asset hierarchy, solving a few UX problems.</p>
<p>This work (most of it) was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1387" target="_blank" rel="noopener noreferrer">1387</a>,<a href="https://github.com/FlexMeasures/flexmeasures/pull/1410" target="_blank" rel="noopener noreferrer"> 1410</a>,<a href="https://github.com/FlexMeasures/flexmeasures/pull/1470" target="_blank" rel="noopener noreferrer"> 1470</a> and<a href="https://github.com/FlexMeasures/flexmeasures/pull/1416" target="_blank" rel="noopener noreferrer"> 1416</a>.</p>
</div>
]]>
</content>
</entry>
<entry>
<title>v0.25: flex context fully editable, nicer status page </title>
<author>
<name>SeitaBV</name>
</author>
<link href="https://flexmeasures.io/v025-flex-context-fully-editable-nicer-status-page/"/>
<id>https://flexmeasures.io/v025-flex-context-fully-editable-nicer-status-page/</id>
<media:content url="https://flexmeasures.io/media/posts/48/flex-context-editing-field.png" medium="image" />
<category term="FlexMeasures Blog"/>
<updated>2025-04-01T17:22:00+02:00</updated>
<summary type="html">
<![CDATA[
<img src="https://flexmeasures.io/media/posts/48/flex-context-editing-field.png" alt="Setting a value for site power capacity in the new flex-context editing dialogue" />
Version v0.25 of FlexMeasures supports editing the flex-context on an asset (instead of sending it each time a schedule is triggered). This can improve interactions for developers, but also service…
]]>
</summary>
<content type="html">
<![CDATA[
<p><img src="https://flexmeasures.io/media/posts/48/flex-context-editing-field.png" class="type:primaryImage" alt="Setting a value for site power capacity in the new flex-context editing dialogue" /></p>
<div class="post__inner post__entry">
<p>Version v0.25 of FlexMeasures supports editing the flex-context on an asset (instead of sending it each time a schedule is triggered). This can improve interactions for developers, but also service desk personnel! Also, we improved the status page.</p>
<p><a href="https://flexmeasures.readthedocs.io/latest/changelog.html#v0-25-0-april-01-2025" target="_blank" rel="noopener noreferrer">See the changelog</a> for a complete list of improvements.</p>
<p>Let's dive int the two main features!</p>
</div>
<div class="post__inner post__entry">
<h2>Fully editable flex context</h2>
<p>Behind-the-meter orchestration can become a complex problem, with multiple optimization goals potentially competing. We talked about this in <a href="https://flexmeasures.io/024-more-expressive-congestion-modeling-data-dashboards/" target="_blank" rel="noopener noreferrer">the blog post about the 0.24 release</a>, as well.</p>
<p><a href="https://flexmeasures.readthedocs.io/stable/features/scheduling.html#the-flex-context">The flex-context</a> is very important way to describe contraints and optimization goals (and is accompanied by <a href="https://flexmeasures.readthedocs.io/stable/features/scheduling.html#the-flex-models-corresponding-schedulers">the flex-model</a>).</p>
<figure ><figure class="post__image post__image--center"><img loading="lazy" src="https://flexmeasures.io/media/posts/48/screenshot-asset-editflexcontext.png" alt="Editing the flex context in the new modal dialogue" width="800" height="652" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-xs.png 300w ,https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-sm.png 480w ,https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-md.png 768w ,https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-lg.png 1024w ,https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-xl.png 1360w ,https://flexmeasures.io/media/posts/48/responsive/screenshot-asset-editflexcontext-2xl.png 1600w"></figure>
<figcaption >Editing the flex context in the new dialogue</figcaption>
</figure>
<p>We extended the flex-model and now it is time to make it possible to add it to the data model. The current only way to specify this information is with every call to API or CLI when requesting FlexMeasures to compute a new schedule.</p>
<p>For developers, this might make it easier (less work on coding requests), but also this opens possibilities for maintaining this information by somebody else than developers. Maybe service personnel can now update these fields (which will be logged in the audit log :), or installers do that by themselves?</p>
<p>This work was done in Pull Requests <a href="https://github.com/FlexMeasures/flexmeasures/pull/1293" target="_blank" rel="noopener noreferrer">1293</a> and <a href="https://github.com/FlexMeasures/flexmeasures/pull/1320" target="_blank" rel="noopener noreferrer">1320</a>, and several smaller follow-ups..</p>
<h2>Nicer status page</h2>
<p>The status page is also a feature meant to increase the serviceability of FlexMeasures. You can see when the latest data entries for sensors came in, what jobs (scheduling, forecasting) happend recently and if they failed.</p>
<p>However, the page could be more useful. The first iteration on this since more than six months cleans the page visually, and separates the rows per data source types.</p>
<p>Forecasts and schedules for a power sensor are about the future, after all, while the measurements are about the past. Obviously, the traffic light needs to reflect what kind of source the data comes from - we expect forecasts to always be available into the future, while measurements (which are used in forecasts and schedules) are not, but should also not be too old.</p>
<figure class="post__image post__image--center" ><img loading="lazy" src="https://flexmeasures.io/media/posts/48/asset-status-source-type.png" alt="Status page, now differentiated by data source type" width="800" height="467" sizes="(max-width: 48em) 100vw, 768px" srcset="https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-xs.png 300w ,https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-sm.png 480w ,https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-md.png 768w ,https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-lg.png 1024w ,https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-xl.png 1360w ,https://flexmeasures.io/media/posts/48/responsive/asset-status-source-type-2xl.png 1600w">
<figcaption >Status page, now differentiated by data source type</figcaption>
</figure>
<p>Next work on the status page will address its speed, which still seems underwhelming if there is much data, and enable to select which sensors should be shown.</p>
<p>This work was done in Pull Request <a href="https://github.com/FlexMeasures/flexmeasures/pull/1022" target="_blank" rel="noopener noreferrer">1022</a>.</p>
</div>
]]>
</content>
</entry>
</feed>