Skip to content

Commit a37bc3e

Browse files
Merge pull request #471 from paulhomes/device-class
Added device_class for sensors published to Home Assistant
2 parents aa8ac8c + 1fcb937 commit a37bc3e

5 files changed

+82
-2
lines changed

src/emhass/command_line.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,9 @@ def forecast_model_predict(
798798
model_predict_entity_id = input_data_dict["params"]["passed_data"][
799799
"model_predict_entity_id"
800800
]
801+
model_predict_device_class = input_data_dict["params"]["passed_data"][
802+
"model_predict_device_class"
803+
]
801804
model_predict_unit_of_measurement = input_data_dict["params"]["passed_data"][
802805
"model_predict_unit_of_measurement"
803806
]
@@ -831,6 +834,7 @@ def forecast_model_predict(
831834
predictions,
832835
idx_closest,
833836
model_predict_entity_id,
837+
model_predict_device_class,
834838
model_predict_unit_of_measurement,
835839
model_predict_friendly_name,
836840
type_var="mlforecaster",
@@ -984,8 +988,11 @@ def regressor_model_predict(
984988
mlr_predict_entity_id = input_data_dict["params"]["passed_data"].get(
985989
"mlr_predict_entity_id", "sensor.mlr_predict"
986990
)
991+
mlr_predict_device_class = input_data_dict["params"]["passed_data"].get(
992+
"mlr_predict_device_class", "power"
993+
)
987994
mlr_predict_unit_of_measurement = input_data_dict["params"]["passed_data"].get(
988-
"mlr_predict_unit_of_measurement", "h"
995+
"mlr_predict_unit_of_measurement", "W"
989996
)
990997
mlr_predict_friendly_name = input_data_dict["params"]["passed_data"].get(
991998
"mlr_predict_friendly_name", "mlr predictor"
@@ -997,6 +1004,7 @@ def regressor_model_predict(
9971004
prediction,
9981005
idx,
9991006
mlr_predict_entity_id,
1007+
mlr_predict_device_class,
10001008
mlr_predict_unit_of_measurement,
10011009
mlr_predict_friendly_name,
10021010
type_var="mlregressor",
@@ -1125,6 +1133,7 @@ def publish_data(
11251133
opt_res_latest["P_PV"],
11261134
idx_closest,
11271135
custom_pv_forecast_id["entity_id"],
1136+
"power",
11281137
custom_pv_forecast_id["unit_of_measurement"],
11291138
custom_pv_forecast_id["friendly_name"],
11301139
type_var="power",
@@ -1138,6 +1147,7 @@ def publish_data(
11381147
opt_res_latest["P_Load"],
11391148
idx_closest,
11401149
custom_load_forecast_id["entity_id"],
1150+
"power",
11411151
custom_load_forecast_id["unit_of_measurement"],
11421152
custom_load_forecast_id["friendly_name"],
11431153
type_var="power",
@@ -1153,6 +1163,7 @@ def publish_data(
11531163
opt_res_latest["P_PV_curtailment"],
11541164
idx_closest,
11551165
custom_pv_curtailment_id["entity_id"],
1166+
"power",
11561167
custom_pv_curtailment_id["unit_of_measurement"],
11571168
custom_pv_curtailment_id["friendly_name"],
11581169
type_var="power",
@@ -1168,6 +1179,7 @@ def publish_data(
11681179
opt_res_latest["P_hybrid_inverter"],
11691180
idx_closest,
11701181
custom_hybrid_inverter_id["entity_id"],
1182+
"power",
11711183
custom_hybrid_inverter_id["unit_of_measurement"],
11721184
custom_hybrid_inverter_id["friendly_name"],
11731185
type_var="power",
@@ -1191,6 +1203,7 @@ def publish_data(
11911203
opt_res_latest["P_deferrable{}".format(k)],
11921204
idx_closest,
11931205
custom_deferrable_forecast_id[k]["entity_id"],
1206+
"power",
11941207
custom_deferrable_forecast_id[k]["unit_of_measurement"],
11951208
custom_deferrable_forecast_id[k]["friendly_name"],
11961209
type_var="deferrable",
@@ -1213,6 +1226,7 @@ def publish_data(
12131226
opt_res_latest["predicted_temp_heater{}".format(k)],
12141227
idx_closest,
12151228
custom_predicted_temperature_id[k]["entity_id"],
1229+
"temperature",
12161230
custom_predicted_temperature_id[k]["unit_of_measurement"],
12171231
custom_predicted_temperature_id[k]["friendly_name"],
12181232
type_var="temperature",
@@ -1233,6 +1247,7 @@ def publish_data(
12331247
opt_res_latest["P_batt"],
12341248
idx_closest,
12351249
custom_batt_forecast_id["entity_id"],
1250+
"power",
12361251
custom_batt_forecast_id["unit_of_measurement"],
12371252
custom_batt_forecast_id["friendly_name"],
12381253
type_var="batt",
@@ -1248,6 +1263,7 @@ def publish_data(
12481263
opt_res_latest["SOC_opt"] * 100,
12491264
idx_closest,
12501265
custom_batt_soc_forecast_id["entity_id"],
1266+
"battery",
12511267
custom_batt_soc_forecast_id["unit_of_measurement"],
12521268
custom_batt_soc_forecast_id["friendly_name"],
12531269
type_var="SOC",
@@ -1262,6 +1278,7 @@ def publish_data(
12621278
opt_res_latest["P_grid"],
12631279
idx_closest,
12641280
custom_grid_forecast_id["entity_id"],
1281+
"power",
12651282
custom_grid_forecast_id["unit_of_measurement"],
12661283
custom_grid_forecast_id["friendly_name"],
12671284
type_var="power",
@@ -1277,6 +1294,7 @@ def publish_data(
12771294
opt_res_latest[col_cost_fun],
12781295
idx_closest,
12791296
custom_cost_fun_id["entity_id"],
1297+
"monetary",
12801298
custom_cost_fun_id["unit_of_measurement"],
12811299
custom_cost_fun_id["friendly_name"],
12821300
type_var="cost_fun",
@@ -1297,6 +1315,7 @@ def publish_data(
12971315
opt_res_latest["optim_status"],
12981316
idx_closest,
12991317
custom_cost_fun_id["entity_id"],
1318+
"",
13001319
custom_cost_fun_id["unit_of_measurement"],
13011320
custom_cost_fun_id["friendly_name"],
13021321
type_var="optim_status",
@@ -1311,6 +1330,7 @@ def publish_data(
13111330
opt_res_latest["unit_load_cost"],
13121331
idx_closest,
13131332
custom_unit_load_cost_id["entity_id"],
1333+
"monetary",
13141334
custom_unit_load_cost_id["unit_of_measurement"],
13151335
custom_unit_load_cost_id["friendly_name"],
13161336
type_var="unit_load_cost",
@@ -1325,6 +1345,7 @@ def publish_data(
13251345
opt_res_latest["unit_prod_price"],
13261346
idx_closest,
13271347
custom_unit_prod_price_id["entity_id"],
1348+
"monetary",
13281349
custom_unit_prod_price_id["unit_of_measurement"],
13291350
custom_unit_prod_price_id["friendly_name"],
13301351
type_var="unit_prod_price",
@@ -1462,6 +1483,7 @@ def publish_json(
14621483
data_df=entity_data[metadata[entity_id]["name"]],
14631484
idx=idx_closest,
14641485
entity_id=entity_id,
1486+
device_class=dict.get(metadata[entity_id],"device_class"),
14651487
unit_of_measurement=metadata[entity_id]["unit_of_measurement"],
14661488
friendly_name=metadata[entity_id]["friendly_name"],
14671489
type_var=metadata[entity_id].get("type_var", ""),

src/emhass/retrieve_hass.py

+17
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ def get_attr_data_dict(
414414
data_df: pd.DataFrame,
415415
idx: int,
416416
entity_id: str,
417+
device_class: str,
417418
unit_of_measurement: str,
418419
friendly_name: str,
419420
list_name: str,
@@ -432,6 +433,7 @@ def get_attr_data_dict(
432433
data = {
433434
"state": "{:.2f}".format(state),
434435
"attributes": {
436+
"device_class": device_class,
435437
"unit_of_measurement": unit_of_measurement,
436438
"friendly_name": friendly_name,
437439
list_name: forecast_list,
@@ -444,6 +446,7 @@ def post_data(
444446
data_df: pd.DataFrame,
445447
idx: int,
446448
entity_id: str,
449+
device_class: str,
447450
unit_of_measurement: str,
448451
friendly_name: str,
449452
type_var: str,
@@ -464,6 +467,8 @@ def post_data(
464467
:type idx: int
465468
:param entity_id: The unique entity_id of the sensor in hass.
466469
:type entity_id: str
470+
:param device_class: The HASS device class for the sensor.
471+
:type device_class: str
467472
:param unit_of_measurement: The units of the sensor.
468473
:type unit_of_measurement: str
469474
:param friendly_name: The friendly name that will be used in the hass frontend.
@@ -511,6 +516,7 @@ def post_data(
511516
data_df,
512517
idx,
513518
entity_id,
519+
device_class,
514520
unit_of_measurement,
515521
friendly_name,
516522
"forecasts",
@@ -521,6 +527,7 @@ def post_data(
521527
data_df,
522528
idx,
523529
entity_id,
530+
device_class,
524531
unit_of_measurement,
525532
friendly_name,
526533
"deferrables_schedule",
@@ -531,6 +538,7 @@ def post_data(
531538
data_df,
532539
idx,
533540
entity_id,
541+
device_class,
534542
unit_of_measurement,
535543
friendly_name,
536544
"predicted_temperatures",
@@ -541,6 +549,7 @@ def post_data(
541549
data_df,
542550
idx,
543551
entity_id,
552+
device_class,
544553
unit_of_measurement,
545554
friendly_name,
546555
"battery_scheduled_power",
@@ -551,6 +560,7 @@ def post_data(
551560
data_df,
552561
idx,
553562
entity_id,
563+
device_class,
554564
unit_of_measurement,
555565
friendly_name,
556566
"battery_scheduled_soc",
@@ -561,6 +571,7 @@ def post_data(
561571
data_df,
562572
idx,
563573
entity_id,
574+
device_class,
564575
unit_of_measurement,
565576
friendly_name,
566577
"unit_load_cost_forecasts",
@@ -571,6 +582,7 @@ def post_data(
571582
data_df,
572583
idx,
573584
entity_id,
585+
device_class,
574586
unit_of_measurement,
575587
friendly_name,
576588
"unit_prod_price_forecasts",
@@ -581,6 +593,7 @@ def post_data(
581593
data_df,
582594
idx,
583595
entity_id,
596+
device_class,
584597
unit_of_measurement,
585598
friendly_name,
586599
"scheduled_forecast",
@@ -590,6 +603,7 @@ def post_data(
590603
data = {
591604
"state": state,
592605
"attributes": {
606+
"device_class": device_class,
593607
"unit_of_measurement": unit_of_measurement,
594608
"friendly_name": friendly_name,
595609
},
@@ -598,6 +612,7 @@ def post_data(
598612
data = {
599613
"state": state,
600614
"attributes": {
615+
"device_class": device_class,
601616
"unit_of_measurement": unit_of_measurement,
602617
"friendly_name": friendly_name,
603618
},
@@ -606,6 +621,7 @@ def post_data(
606621
data = {
607622
"state": "{:.2f}".format(state),
608623
"attributes": {
624+
"device_class": device_class,
609625
"unit_of_measurement": unit_of_measurement,
610626
"friendly_name": friendly_name,
611627
},
@@ -657,6 +673,7 @@ class response:
657673
# Save entity metadata, key = entity_id
658674
metadata[entity_id] = {
659675
"name": data_df.name,
676+
"device_class": device_class,
660677
"unit_of_measurement": unit_of_measurement,
661678
"friendly_name": friendly_name,
662679
"type_var": type_var,

src/emhass/utils.py

+31
Original file line numberDiff line numberDiff line change
@@ -266,70 +266,83 @@ def treat_runtimeparams(
266266
custom_deferrable_forecast_id.append(
267267
{
268268
"entity_id": "sensor.p_deferrable{}".format(k),
269+
"device_class": "power",
269270
"unit_of_measurement": "W",
270271
"friendly_name": "Deferrable Load {}".format(k),
271272
}
272273
)
273274
custom_predicted_temperature_id.append(
274275
{
275276
"entity_id": "sensor.temp_predicted{}".format(k),
277+
"device_class": "temperature",
276278
"unit_of_measurement": default_temperature_unit,
277279
"friendly_name": "Predicted temperature {}".format(k),
278280
}
279281
)
280282
default_passed_dict = {
281283
"custom_pv_forecast_id": {
282284
"entity_id": "sensor.p_pv_forecast",
285+
"device_class": "power",
283286
"unit_of_measurement": "W",
284287
"friendly_name": "PV Power Forecast",
285288
},
286289
"custom_load_forecast_id": {
287290
"entity_id": "sensor.p_load_forecast",
291+
"device_class": "power",
288292
"unit_of_measurement": "W",
289293
"friendly_name": "Load Power Forecast",
290294
},
291295
"custom_pv_curtailment_id": {
292296
"entity_id": "sensor.p_pv_curtailment",
297+
"device_class": "power",
293298
"unit_of_measurement": "W",
294299
"friendly_name": "PV Power Curtailment",
295300
},
296301
"custom_hybrid_inverter_id": {
297302
"entity_id": "sensor.p_hybrid_inverter",
303+
"device_class": "power",
298304
"unit_of_measurement": "W",
299305
"friendly_name": "PV Hybrid Inverter",
300306
},
301307
"custom_batt_forecast_id": {
302308
"entity_id": "sensor.p_batt_forecast",
309+
"device_class": "power",
303310
"unit_of_measurement": "W",
304311
"friendly_name": "Battery Power Forecast",
305312
},
306313
"custom_batt_soc_forecast_id": {
307314
"entity_id": "sensor.soc_batt_forecast",
315+
"device_class": "battery",
308316
"unit_of_measurement": "%",
309317
"friendly_name": "Battery SOC Forecast",
310318
},
311319
"custom_grid_forecast_id": {
312320
"entity_id": "sensor.p_grid_forecast",
321+
"device_class": "power",
313322
"unit_of_measurement": "W",
314323
"friendly_name": "Grid Power Forecast",
315324
},
316325
"custom_cost_fun_id": {
317326
"entity_id": "sensor.total_cost_fun_value",
327+
"device_class": "monetary",
318328
"unit_of_measurement": default_currency_unit,
319329
"friendly_name": "Total cost function value",
320330
},
321331
"custom_optim_status_id": {
322332
"entity_id": "sensor.optim_status",
333+
"device_class": "",
323334
"unit_of_measurement": "",
324335
"friendly_name": "EMHASS optimization status",
325336
},
326337
"custom_unit_load_cost_id": {
327338
"entity_id": "sensor.unit_load_cost",
339+
"device_class": "monetary",
328340
"unit_of_measurement": f"{default_currency_unit}/kWh",
329341
"friendly_name": "Unit Load Cost",
330342
},
331343
"custom_unit_prod_price_id": {
332344
"entity_id": "sensor.unit_prod_price",
345+
"device_class": "monetary",
333346
"unit_of_measurement": f"{default_currency_unit}/kWh",
334347
"friendly_name": "Unit Prod Price",
335348
},
@@ -656,6 +669,15 @@ def treat_runtimeparams(
656669
else:
657670
model_predict_entity_id = runtimeparams["model_predict_entity_id"]
658671
params["passed_data"]["model_predict_entity_id"] = model_predict_entity_id
672+
if "model_predict_device_class" not in runtimeparams.keys():
673+
model_predict_device_class = "power"
674+
else:
675+
model_predict_device_class = runtimeparams[
676+
"model_predict_device_class"
677+
]
678+
params["passed_data"]["model_predict_device_class"] = (
679+
model_predict_device_class
680+
)
659681
if "model_predict_unit_of_measurement" not in runtimeparams.keys():
660682
model_predict_unit_of_measurement = "W"
661683
else:
@@ -677,6 +699,15 @@ def treat_runtimeparams(
677699
else:
678700
mlr_predict_entity_id = runtimeparams["mlr_predict_entity_id"]
679701
params["passed_data"]["mlr_predict_entity_id"] = mlr_predict_entity_id
702+
if "mlr_predict_device_class" not in runtimeparams.keys():
703+
mlr_predict_device_class = "power"
704+
else:
705+
mlr_predict_device_class = runtimeparams[
706+
"mlr_predict_device_class"
707+
]
708+
params["passed_data"]["mlr_predict_device_class"] = (
709+
mlr_predict_device_class
710+
)
680711
if "mlr_predict_unit_of_measurement" not in runtimeparams.keys():
681712
mlr_predict_unit_of_measurement = None
682713
else:

0 commit comments

Comments
 (0)