Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
10a31a9
Notifications extract from beta
CoMPaTech Sep 8, 2020
676c0b2
Remove info loggings
CoMPaTech Sep 10, 2020
bc55916
Delete notification service
CoMPaTech Sep 17, 2020
a30ec02
Only notifications for right smiles
CoMPaTech Sep 19, 2020
ea9a0be
Revert to correct logic
CoMPaTech Oct 2, 2020
5f41283
Catchup with dev (mostly with ourselves from #41201)
CoMPaTech Oct 8, 2020
79f5ad9
Remove debug logging
CoMPaTech Oct 8, 2020
d7ac320
Naming improvement
CoMPaTech Oct 15, 2020
d2ee748
Improve test quality as per codecov patch requirement
CoMPaTech Oct 15, 2020
d2dd7e0
Revert to original condition (and appropriately test)
CoMPaTech Oct 15, 2020
5d7eac4
Fix delete_notification_service, bring tests fixtures up to 1.6.0 inc…
CoMPaTech Oct 15, 2020
dc3ca29
Review comment (@bouwew)
CoMPaTech Oct 16, 2020
ab4d307
Correct test value
CoMPaTech Nov 8, 2020
0609c96
Re-apply #40108 fix after rebase sidestep
CoMPaTech Nov 8, 2020
c0cb965
Update tests/components/plugwise/test_init.py
CoMPaTech Nov 8, 2020
3629a01
Add needed state to imports
CoMPaTech Nov 8, 2020
a8c8e8a
Remove separate gw unload code
CoMPaTech Nov 8, 2020
b79dc91
Change entry_fail approach
CoMPaTech Nov 8, 2020
6fbd885
Revert persistent notification part
CoMPaTech Nov 13, 2020
6d41832
Revert persistent notification part - lint
CoMPaTech Nov 13, 2020
fb90ad6
Update homeassistant/components/plugwise/binary_sensor.py
CoMPaTech Nov 15, 2020
d773f53
Update homeassistant/components/plugwise/binary_sensor.py
CoMPaTech Nov 15, 2020
5a5d32f
Rework reuse of sensor in binary_sensor
CoMPaTech Nov 15, 2020
e31f106
Explicit state attribute keys
CoMPaTech Nov 15, 2020
642320f
Remove tempfile
CoMPaTech Nov 15, 2020
fb8a18f
List of notifications per severity
CoMPaTech Nov 16, 2020
5be8a99
Update homeassistant/components/plugwise/binary_sensor.py
CoMPaTech Nov 16, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 85 additions & 11 deletions homeassistant/components/plugwise/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import logging

from homeassistant.components.binary_sensor import BinarySensorEntity
from homeassistant.const import STATE_OFF, STATE_ON
from homeassistant.core import callback

from .const import (
Expand All @@ -13,13 +12,16 @@
FLOW_OFF_ICON,
FLOW_ON_ICON,
IDLE_ICON,
NO_NOTIFICATION_ICON,
NOTIFICATION_ICON,
)
from .sensor import SmileSensor
from .gateway import SmileGateway

BINARY_SENSOR_MAP = {
"dhw_state": ["Domestic Hot Water State", None],
"slave_boiler_state": ["Secondary Heater Device State", None],
}
SEVERITIES = ["other", "info", "warning", "error"]

_LOGGER = logging.getLogger(__name__)

Expand All @@ -30,12 +32,13 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
coordinator = hass.data[DOMAIN][config_entry.entry_id][COORDINATOR]

entities = []
is_thermostat = api.single_master_thermostat()

all_devices = api.get_all_devices()
for dev_id, device_properties in all_devices.items():

if device_properties["class"] == "heater_central":
data = api.get_device_data(dev_id)

for binary_sensor in BINARY_SENSOR_MAP:
if binary_sensor not in data:
continue
Expand All @@ -47,32 +50,65 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
device_properties["name"],
dev_id,
binary_sensor,
device_properties["class"],
)
)

if device_properties["class"] == "gateway" and is_thermostat is not None:
entities.append(
PwNotifySensor(
api,
coordinator,
device_properties["name"],
dev_id,
"plugwise_notification",
)
)

async_add_entities(entities, True)


class PwBinarySensor(SmileSensor, BinarySensorEntity):
"""Representation of a Plugwise binary_sensor."""
class SmileBinarySensor(SmileGateway):
"""Represent Smile Binary Sensors."""

def __init__(self, api, coordinator, name, dev_id, binary_sensor, model):
"""Set up the Plugwise API."""
super().__init__(api, coordinator, name, dev_id, binary_sensor)
def __init__(self, api, coordinator, name, dev_id, binary_sensor):
"""Initialise the binary_sensor."""
super().__init__(api, coordinator, name, dev_id)

self._binary_sensor = binary_sensor

self._is_on = False
self._icon = None
self._is_on = False

if dev_id == self._api.heater_id:
self._entity_name = "Auxiliary"

sensorname = binary_sensor.replace("_", " ").title()
self._name = f"{self._entity_name} {sensorname}"

if dev_id == self._api.gateway_id:
self._entity_name = f"Smile {self._entity_name}"

self._unique_id = f"{dev_id}-{binary_sensor}"

@property
def icon(self):
"""Return the icon of this entity."""
return self._icon

@property
def is_on(self):
"""Return true if the binary sensor is on."""
return self._is_on

@callback
def _async_process_data(self):
"""Update the entity."""
raise NotImplementedError


class PwBinarySensor(SmileBinarySensor, BinarySensorEntity):
"""Representation of a Plugwise binary_sensor."""

@callback
def _async_process_data(self):
"""Update the entity."""
Expand All @@ -89,10 +125,48 @@ def _async_process_data(self):

self._is_on = data[self._binary_sensor]

self._state = STATE_ON if self._is_on else STATE_OFF
if self._binary_sensor == "dhw_state":
self._icon = FLOW_ON_ICON if self._is_on else FLOW_OFF_ICON
if self._binary_sensor == "slave_boiler_state":
self._icon = FLAME_ICON if self._is_on else IDLE_ICON

self.async_write_ha_state()


class PwNotifySensor(SmileBinarySensor, BinarySensorEntity):
"""Representation of a Plugwise Notification binary_sensor."""

def __init__(self, api, coordinator, name, dev_id, binary_sensor):
"""Set up the Plugwise API."""
super().__init__(api, coordinator, name, dev_id, binary_sensor)

self._attributes = {}

@property
def device_state_attributes(self):
"""Return the state attributes."""
return self._attributes

@callback
def _async_process_data(self):
"""Update the entity."""
notify = self._api.notifications

for severity in SEVERITIES:
self._attributes[f"{severity}_msg"] = []

self._is_on = False
self._icon = NO_NOTIFICATION_ICON

if notify:
self._is_on = True
self._icon = NOTIFICATION_ICON

for details in notify.values():
for msg_type, msg in details.items():
if msg_type not in SEVERITIES:
msg_type = "other"

self._attributes[f"{msg_type.lower()}_msg"].append(msg)

self.async_write_ha_state()
2 changes: 2 additions & 0 deletions homeassistant/components/plugwise/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
FLOW_ON_ICON = "mdi:water-pump"
IDLE_ICON = "mdi:circle-off-outline"
SWITCH_ICON = "mdi:electric-switch"
NO_NOTIFICATION_ICON = "mdi:mailbox-outline"
NOTIFICATION_ICON = "mdi:mailbox-up-outline"

COORDINATOR = "coordinator"
UNDO_UPDATE_LISTENER = "undo_update_listener"
Expand Down
6 changes: 6 additions & 0 deletions tests/components/plugwise/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ def mock_smile_adam():
smile_mock.return_value.smile_type = "thermostat"
smile_mock.return_value.smile_hostname = "smile98765"

smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")

smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
smile_mock.return_value.full_update_device.side_effect = AsyncMock(
return_value=True
Expand Down Expand Up @@ -118,6 +120,8 @@ def mock_smile_anna():
smile_mock.return_value.smile_type = "thermostat"
smile_mock.return_value.smile_hostname = "smile98765"

smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")

smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
smile_mock.return_value.full_update_device.side_effect = AsyncMock(
return_value=True
Expand Down Expand Up @@ -161,6 +165,8 @@ def mock_smile_p1():
smile_mock.return_value.smile_type = "power"
smile_mock.return_value.smile_hostname = "smile98765"

smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")

smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
smile_mock.return_value.full_update_device.side_effect = AsyncMock(
return_value=True
Expand Down
12 changes: 12 additions & 0 deletions tests/components/plugwise/test_binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,15 @@ async def test_anna_climate_binary_sensor_change(hass, mock_smile_anna):

state = hass.states.get("binary_sensor.auxiliary_dhw_state")
assert str(state.state) == STATE_OFF


async def test_adam_climate_binary_sensor_change(hass, mock_smile_adam):
"""Test change of climate related binary_sensor entities."""
entry = await async_init_integration(hass, mock_smile_adam)
assert entry.state == ENTRY_STATE_LOADED

state = hass.states.get("binary_sensor.adam_plugwise_notification")
assert str(state.state) == STATE_ON
assert "unreachable" in state.attributes.get("warning_msg")[0]
assert not state.attributes.get("error_msg")
assert not state.attributes.get("other_msg")
18 changes: 15 additions & 3 deletions tests/components/plugwise/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
from Plugwise_Smile.Smile import Smile

from homeassistant.components.plugwise import DOMAIN
from homeassistant.components.plugwise.gateway import async_unload_entry
from homeassistant.config_entries import (
ENTRY_STATE_NOT_LOADED,
ENTRY_STATE_SETUP_ERROR,
ENTRY_STATE_SETUP_RETRY,
)

from tests.common import AsyncMock
from tests.common import AsyncMock, MockConfigEntry
from tests.components.plugwise.common import async_init_integration


Expand Down Expand Up @@ -53,5 +53,17 @@ async def test_unload_entry(hass, mock_smile_adam):
entry = await async_init_integration(hass, mock_smile_adam)

mock_smile_adam.async_reset = AsyncMock(return_value=True)
assert await async_unload_entry(hass, entry)
await hass.config_entries.async_unload(entry.entry_id)
await hass.async_block_till_done()
assert entry.state == ENTRY_STATE_NOT_LOADED
assert not hass.data[DOMAIN]


async def test_async_setup_entry_fail(hass):
"""Test async_setup_entry."""
entry = MockConfigEntry(domain=DOMAIN, data={})

entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state == ENTRY_STATE_SETUP_ERROR
15 changes: 13 additions & 2 deletions tests/components/plugwise/test_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from homeassistant.config_entries import ENTRY_STATE_LOADED

from tests.common import Mock
from tests.components.plugwise.common import async_init_integration


Expand Down Expand Up @@ -30,7 +31,7 @@ async def test_adam_climate_sensor_entities(hass, mock_smile_adam):
assert int(state.state) == 34


async def test_anna_climate_sensor_entities(hass, mock_smile_anna):
async def test_anna_as_smt_climate_sensor_entities(hass, mock_smile_anna):
"""Test creation of climate related sensor entities."""
entry = await async_init_integration(hass, mock_smile_anna)
assert entry.state == ENTRY_STATE_LOADED
Expand All @@ -45,6 +46,16 @@ async def test_anna_climate_sensor_entities(hass, mock_smile_anna):
assert float(state.state) == 86.0


async def test_anna_climate_sensor_entities(hass, mock_smile_anna):
"""Test creation of climate related sensor entities as single master thermostat."""
mock_smile_anna.single_master_thermostat.side_effect = Mock(return_value=False)
entry = await async_init_integration(hass, mock_smile_anna)
assert entry.state == ENTRY_STATE_LOADED

state = hass.states.get("sensor.auxiliary_outdoor_temperature")
assert float(state.state) == 18.0


async def test_p1_dsmr_sensor_entities(hass, mock_smile_p1):
"""Test creation of power related sensor entities."""
entry = await async_init_integration(hass, mock_smile_p1)
Expand All @@ -63,7 +74,7 @@ async def test_p1_dsmr_sensor_entities(hass, mock_smile_p1):
assert float(state.state) == 442.9

state = hass.states.get("sensor.p1_gas_consumed_cumulative")
assert float(state.state) == 584.9
assert float(state.state) == 584.85


async def test_stretch_sensor_entities(hass, mock_stretch):
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"df4a4a8169904cdb9c03d61a21f42140": {"name": "Zone Lisa Bios", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "12493538af164a409c6a1c79e38afe1c"}, "b310b72a0e354bfab43089919b9a88bf": {"name": "Floor kraan", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "c50f167537524366a5af7aa3942feb1e"}, "a2c3583e0a6349358998b760cea82d2a": {"name": "Bios Cv Thermostatic Radiator ", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "12493538af164a409c6a1c79e38afe1c"}, "b59bcebaf94b499ea7d46e4a66fb62d8": {"name": "Zone Lisa WK", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "c50f167537524366a5af7aa3942feb1e"}, "fe799307f1624099878210aa0b9f1475": {"name": "Adam", "types": {"py/set": ["temperature", "thermostat", "home"]}, "class": "gateway", "location": "1f9dcf83fd4e4b66b72ff787957bfe5d"}, "d3da73bde12a47d5a6b8f9dad971f2ec": {"name": "Thermostatic Radiator Jessie", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "82fa13f017d240daa0d0ea1775420f24"}, "21f2b542c49845e6bb416884c55778d6": {"name": "Playstation Smart Plug", "types": {"py/set": ["plug", "power"]}, "class": "game_console", "location": "cd143c07248f491493cea0533bc3d669"}, "78d1126fc4c743db81b61c20e88342a7": {"name": "CV Pomp", "types": {"py/set": ["plug", "power"]}, "class": "central_heating_pump", "location": "c50f167537524366a5af7aa3942feb1e"}, "90986d591dcd426cae3ec3e8111ff730": {"name": "Adam", "types": {"py/set": ["temperature", "thermostat", "home"]}, "class": "heater_central", "location": "1f9dcf83fd4e4b66b72ff787957bfe5d"}, "cd0ddb54ef694e11ac18ed1cbce5dbbd": {"name": "NAS", "types": {"py/set": ["plug", "power"]}, "class": "vcr", "location": "cd143c07248f491493cea0533bc3d669"}, "4a810418d5394b3f82727340b91ba740": {"name": "USG Smart Plug", "types": {"py/set": ["plug", "power"]}, "class": "router", "location": "cd143c07248f491493cea0533bc3d669"}, "02cf28bfec924855854c544690a609ef": {"name": "NVR", "types": {"py/set": ["plug", "power"]}, "class": "vcr", "location": "cd143c07248f491493cea0533bc3d669"}, "a28f588dc4a049a483fd03a30361ad3a": {"name": "Fibaro HC2", "types": {"py/set": ["plug", "power"]}, "class": "settop", "location": "cd143c07248f491493cea0533bc3d669"}, "6a3bf693d05e48e0b460c815a4fdd09d": {"name": "Zone Thermostat Jessie", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "82fa13f017d240daa0d0ea1775420f24"}, "680423ff840043738f42cc7f1ff97a36": {"name": "Thermostatic Radiator Badkamer", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "08963fec7c53423ca5680aa4cb502c63"}, "f1fee6043d3642a9b0a65297455f008e": {"name": "Zone Thermostat Badkamer", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "08963fec7c53423ca5680aa4cb502c63"}, "675416a629f343c495449970e2ca37b5": {"name": "Ziggo Modem", "types": {"py/set": ["plug", "power"]}, "class": "router", "location": "cd143c07248f491493cea0533bc3d669"}, "e7693eb9582644e5b865dba8d4447cf1": {"name": "CV Kraan Garage", "types": {"py/set": ["thermostat"]}, "class": "thermostatic_radiator_valve", "location": "446ac08dd04d4eff8ac57489757b7314"}}
{"df4a4a8169904cdb9c03d61a21f42140": {"name": "Zone Lisa Bios", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "12493538af164a409c6a1c79e38afe1c"}, "b310b72a0e354bfab43089919b9a88bf": {"name": "Floor kraan", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "c50f167537524366a5af7aa3942feb1e"}, "a2c3583e0a6349358998b760cea82d2a": {"name": "Bios Cv Thermostatic Radiator ", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "12493538af164a409c6a1c79e38afe1c"}, "b59bcebaf94b499ea7d46e4a66fb62d8": {"name": "Zone Lisa WK", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "c50f167537524366a5af7aa3942feb1e"}, "fe799307f1624099878210aa0b9f1475": {"name": "Adam", "types": {"py/set": ["home", "temperature", "thermostat"]}, "class": "gateway", "location": "1f9dcf83fd4e4b66b72ff787957bfe5d"}, "d3da73bde12a47d5a6b8f9dad971f2ec": {"name": "Thermostatic Radiator Jessie", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "82fa13f017d240daa0d0ea1775420f24"}, "21f2b542c49845e6bb416884c55778d6": {"name": "Playstation Smart Plug", "types": {"py/set": ["plug", "power"]}, "class": "game_console", "location": "cd143c07248f491493cea0533bc3d669"}, "78d1126fc4c743db81b61c20e88342a7": {"name": "CV Pomp", "types": {"py/set": ["plug", "power"]}, "class": "central_heating_pump", "location": "c50f167537524366a5af7aa3942feb1e"}, "90986d591dcd426cae3ec3e8111ff730": {"name": "Adam", "types": {"py/set": ["home", "temperature", "thermostat"]}, "class": "heater_central", "location": "1f9dcf83fd4e4b66b72ff787957bfe5d"}, "cd0ddb54ef694e11ac18ed1cbce5dbbd": {"name": "NAS", "types": {"py/set": ["plug", "power"]}, "class": "vcr", "location": "cd143c07248f491493cea0533bc3d669"}, "4a810418d5394b3f82727340b91ba740": {"name": "USG Smart Plug", "types": {"py/set": ["plug", "power"]}, "class": "router", "location": "cd143c07248f491493cea0533bc3d669"}, "02cf28bfec924855854c544690a609ef": {"name": "NVR", "types": {"py/set": ["plug", "power"]}, "class": "vcr", "location": "cd143c07248f491493cea0533bc3d669"}, "a28f588dc4a049a483fd03a30361ad3a": {"name": "Fibaro HC2", "types": {"py/set": ["plug", "power"]}, "class": "settop", "location": "cd143c07248f491493cea0533bc3d669"}, "6a3bf693d05e48e0b460c815a4fdd09d": {"name": "Zone Thermostat Jessie", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "82fa13f017d240daa0d0ea1775420f24"}, "680423ff840043738f42cc7f1ff97a36": {"name": "Thermostatic Radiator Badkamer", "types": {"py/set": ["thermostat"]}, "class": "thermo_sensor", "location": "08963fec7c53423ca5680aa4cb502c63"}, "f1fee6043d3642a9b0a65297455f008e": {"name": "Zone Thermostat Badkamer", "types": {"py/set": ["thermostat"]}, "class": "zone_thermostat", "location": "08963fec7c53423ca5680aa4cb502c63"}, "675416a629f343c495449970e2ca37b5": {"name": "Ziggo Modem", "types": {"py/set": ["plug", "power"]}, "class": "router", "location": "cd143c07248f491493cea0533bc3d669"}, "e7693eb9582644e5b865dba8d4447cf1": {"name": "CV Kraan Garage", "types": {"py/set": ["thermostat"]}, "class": "thermostatic_radiator_valve", "location": "446ac08dd04d4eff8ac57489757b7314"}}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 14.0, "temperature": 19.1, "battery": 0.51, "valve_position": 0.0, "temperature_difference": -0.4}
{"temperature": 19.1, "setpoint": 14.0, "battery": 0.51, "temperature_difference": -0.4, "valve_position": 0.0}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 15.0, "temperature": 17.2, "battery": 0.37, "active_preset": "asleep", "presets": {"home": [20.0, 22.0], "no_frost": [10.0, 30.0], "away": [12.0, 25.0], "vacation": [11.0, 28.0], "asleep": [16.0, 24.0]}, "schedule_temperature": 15.0, "available_schedules": ["CV Jessie"], "selected_schedule": "CV Jessie", "last_used": "CV Jessie"}
{"temperature": 17.2, "setpoint": 15.0, "battery": 0.37, "active_preset": "asleep", "presets": {"home": [20.0, 22.0], "no_frost": [10.0, 30.0], "away": [12.0, 25.0], "vacation": [11.0, 28.0], "asleep": [16.0, 24.0]}, "schedule_temperature": 16.5, "available_schedules": ["CV Jessie"], "selected_schedule": "CV Jessie", "last_used": "CV Jessie"}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"water_temperature": 70.0, "intended_boiler_temperature": 70.0, "modulation_level": 0.01}
{"water_temperature": 70.0, "intended_boiler_temperature": 70.0, "modulation_level": 0.01, "heating_state": true}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 13.0, "temperature": 17.2, "battery": 0.62, "valve_position": 0.0, "temperature_difference": -0.2}
{"temperature": 17.2, "setpoint": 13.0, "battery": 0.62, "temperature_difference": -0.2, "valve_position": 0.0}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 21.5, "temperature": 26.0, "valve_position": 1.0, "temperature_difference": 3.5}
{"temperature": 26.0, "setpoint": 21.5, "temperature_difference": 3.5, "valve_position": 1.0}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 21.5, "temperature": 20.9, "battery": 0.34, "active_preset": "home", "presets": {"vacation": [15.0, 28.0], "asleep": [18.0, 24.0], "no_frost": [12.0, 30.0], "away": [17.0, 25.0], "home": [21.5, 22.0]}, "schedule_temperature": 21.5, "available_schedules": ["GF7 Woonkamer"], "selected_schedule": "GF7 Woonkamer", "last_used": "GF7 Woonkamer"}
{"temperature": 20.9, "setpoint": 21.5, "battery": 0.34, "active_preset": "home", "presets": {"vacation": [15.0, 28.0], "asleep": [18.0, 24.0], "no_frost": [12.0, 30.0], "away": [17.0, 25.0], "home": [21.5, 22.0]}, "schedule_temperature": 21.5, "available_schedules": ["GF7 Woonkamer"], "selected_schedule": "GF7 Woonkamer", "last_used": "GF7 Woonkamer"}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"setpoint": 15.0, "temperature": 17.1, "battery": 0.62, "valve_position": 0.0, "temperature_difference": 0.1}
{"temperature": 17.1, "setpoint": 15.0, "battery": 0.62, "temperature_difference": 0.1, "valve_position": 0.0}
Loading