Skip to content

Commit d155f2f

Browse files
authored
Merge pull request #162 from mesnaround/update_sensor_state_query
Update sensor query in core.py
2 parents 7ffca39 + 46a62cc commit d155f2f

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ dist/*
1212
.idea/*
1313

1414
venv*
15+
.venv*
1516
tests/test.db-*

detective/core.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,17 @@ def fetch_all_sensor_data(self, limit=50000) -> pd.DataFrame:
101101
"""
102102

103103
query = """
104-
SELECT states.state, states.last_updated_ts, states_meta.entity_id
105-
FROM states
106-
JOIN states_meta
107-
ON states.metadata_id = states_meta.metadata_id
108-
WHERE
109-
states_meta.entity_id LIKE '%sensor%'
110-
AND
111-
states.state NOT IN ('unknown', 'unavailable')
112-
ORDER BY last_updated_ts DESC
104+
SELECT states.state,
105+
datetime(states.last_updated_ts, 'unixepoch', 'subsec') as last_updated_ts,
106+
states_meta.entity_id,
107+
state_attributes.shared_attrs
108+
FROM states
109+
JOIN states_meta ON states.metadata_id = states_meta.metadata_id
110+
LEFT JOIN state_attributes ON states.attributes_id = state_attributes.attributes_id
111+
WHERE states_meta.entity_id LIKE '%sensor%'
112+
AND states.state NOT IN ('unknown',
113+
'unavailable')
114+
ORDER BY last_updated_ts DESC
113115
"""
114116

115117
if limit is not None:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
setup(
2020
name="HASS-data-detective",
21-
version="3.0",
21+
version="3.2",
2222
packages=find_packages(exclude=("tests",)),
2323
url="https://github.com/robmarkcole/HASS-data-detective",
2424
keywords=["home", "automation"],

tests/test_core.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from unittest.mock import patch
1+
from unittest.mock import patch, MagicMock
2+
import pandas as pd
23

3-
from detective.core import get_db_type, stripped_db_url
4+
from detective.core import get_db_type, stripped_db_url, HassDatabase
45

56

67
def test_get_db_type():
@@ -26,3 +27,29 @@ def test_fetch_entities(mock_db):
2627
mock_db.fetch_entities()
2728

2829
assert mock_db.entities == ["light.kitchen", "light.living_room", "switch.ac"]
30+
31+
32+
mock_data = pd.DataFrame({
33+
"state": ["20.2", "50.1"],
34+
"last_updated_ts": ["2025-10-01 12:00:00", "2025-10-01 12:05:00"],
35+
"entity_id": ["sensor.temperature", "sensor.humidity"],
36+
"shared_attrs": ["{}", "{}"]
37+
})
38+
39+
@patch("sqlalchemy.create_engine")
40+
def test_fetch_all_sensor_data(mock_create_engine):
41+
"""Test that fetch_all_sensor_data returns a Pandas DataFrame."""
42+
mock_con = MagicMock()
43+
mock_engine = MagicMock()
44+
mock_engine.connect.return_value = mock_con
45+
mock_create_engine.return_value = mock_engine
46+
47+
# fetch_all_sensor_data uses read_sql_query under the hood
48+
with patch("pandas.read_sql_query") as mock_read_sql:
49+
mock_read_sql.return_value = mock_data
50+
51+
db = HassDatabase(url="sqlite:///tests/test.db", fetch_entities=False)
52+
db.con = mock_con
53+
54+
result = db.fetch_all_sensor_data()
55+
assert isinstance(result, pd.DataFrame)

0 commit comments

Comments
 (0)