Skip to content

Commit

Permalink
Merge pull request #73 from lucadjc/master
Browse files Browse the repository at this point in the history
Fixed openssl 3.1.X setting for no certificate configuration
  • Loading branch information
atxbyea authored and github-actions[bot] committed Aug 29, 2023
2 parents 42dcec8 + 113ebed commit 01fb81b
Show file tree
Hide file tree
Showing 19 changed files with 282 additions and 97 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@

.DS_Store
*.pyc
/.vs
/custom_components/climate_ip/ac14k_m.pem
3 changes: 3 additions & 0 deletions .vs/ProjectSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}
9 changes: 9 additions & 0 deletions .vs/VSWorkspaceState.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"ExpandedNodes": [
"",
"\\custom_components",
"\\custom_components\\climate_ip"
],
"SelectedNode": "\\custom_components\\climate_ip\\climate.py",
"PreviewInSolutionExplorer": false
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Empty file.
Binary file added .vs/samsungrac/v17/.wsuo
Binary file not shown.
Binary file added .vs/samsungrac/v17/Browse.VC.db
Binary file not shown.
Binary file added .vs/slnx.sqlite
Binary file not shown.
131 changes: 131 additions & 0 deletions custom_components/climate_ip/ac14k_m_old.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
Bag Attributes
friendlyName: ac14k_m
localKeyID: 54 69 6D 65 20 31 34 35 35 34 39 32 33 35 32 36 39 36
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeXvhcsqRFWfQt
Qr2TGW+ePJzrKQVNOZmCGFXrBmOKa2gcZvXqDe71upkCmbXxDZbsqU1nFox6WtKy
za+JE1EaWIjVFV/D0hnnF+CA56851rFjAx7YYVtd9TwJYV1lSfJaQBU/ecUys0SX
lKZJtjIoJ/PyLREE79TjOqTxXMXnDpiAt3oiwApZMweJ5z2QViqtRepkI33GDgYc
LzamIengSG6WZkEUr2roY0il4aVXf3IRVRX+5cJ2L5462kFPKm/UnrXrSsrLwbF9
ltSlNA8FgpHN3d9ZyqB3MB46oGYyxYYU7a+/R3RAx0joNfVPFe8riQXQcoNEgalb
c8f7N4HPAgMBAAECggEABL80QA5UMWLNMpYlI9m8Jz2V//MdONvM6hkI5H57a34F
d+2+vCNWAYrdL1AGsUGgAidPDq9NimMb8lMvtxZhedV//kR5id2XTfaVhUrs06hA
myN66hWR9LyCbpTUgJAGi2Soz3US/5USFsZGknZANdk8fOP3ZAqWmc8rrDdVxivg
Z3qjiqgIZg24XsZmnK/QJejP4FLMqm6YUouH//u9xSKvTwkg89qxvygW9xNBNfi/
LrBHip/k8LnynKRE2odQWt74HcTjbZW4rxXrJ0tqDSIh8bUB23mRjFh1k4aKXnz3
Y/CDsfxvAutVi85/zyxYaIT6daP+PxvywwgjVhYHIQKBgQDyMxmGdi5kk3ePv0lM
lC28gVNhgKfhsXL8xIzcd/UM3eEK4baA+AKI9p6ifZ8g90NUJGuHxCp8/9yOKcmk
tY5toE45nH4fH9Z3j9NtWHMhXJDGWV+DjeiWmshbUqd7/OoIl1vig1npQqX+PXJR
pwDHnjkQbkyum4k8/IruHx813wKBgQDrCqK0rBkMaarr5eyOJ9BxhCej8i5kCzm7
XSaNgXtpBIQ4Y4r412M2JWaSLnDxlAc0iUhNGnIn4zkEP2HzX5JU4Yto9YAlRZnu
NQSvuVgyLiBCbS7WrRAlsNpTeCU3m+c5QNXBzBlHCiTdw3WS4bINOftsB3xnlJ+D
y/0YZozSEQKBgQCgWV5z3Dh40/0bSVyA+7WQENsgOWpsjOwBFyvfJvgxLZC5gJgw
qIIdJZH/KEY7MBj+UyJx/1jV6xudb2MVzjHeuHwxvj7t4kk+XRVwVlfa5YrgFvma
glBTrWQquf0ypE5Zo8PsomPbgAmf2hSepH9qqYFENJJGI6lnnBdq8WXbZwKBgQCR
p3ye5At9wrnWCB0pFwk4X4JFOd5/xukW8CnlBTmaId9iJmXHwYpM0q6Wpkr9mhNA
/lYc2eemSkxaEoE71Z0UFtVSzNiFwHUcxiRKVVyPdEAvigO9q2/XO5qAoXLG3ElV
FJWizD1Z5bJk7yycQlsZkTX6g0UX12VmwnHsvhhEUQKBgF0AVToAk+/OPxlA3N4A
Xn624Ktxzy/58NSLUfQ57AtL2zivoJzfmhUwgYkPsp+63Wklpcq7X7Q2NB7WscC4
rICqHxNow/KSzwuR6L3u/kewvlsrgTIM2Pp//+QdTK9GGU3HHAZKaNiB8m20k1Bs
NTANFxBk7alY0G7ZUhuzWkg6
-----END PRIVATE KEY-----
Bag Attributes
friendlyName: ac14k_m
localKeyID: 54 69 6D 65 20 31 34 35 35 34 39 32 33 35 32 36 39 36
subject=/C=KR/O=Samsung Electronics/CN=AC14K_M/[email protected]
issuer=/C=KR/O=Samsung Electronics/CN=RemoteAccessCA(CE)
-----BEGIN CERTIFICATE-----
MIIDmzCCAoOgAwIBAgIBCTANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJLUjEc
MBoGA1UECgwTU2Ftc3VuZyBFbGVjdHJvbmljczEbMBkGA1UEAwwSUmVtb3RlQWNj
ZXNzQ0EoQ0UpMCIYDzE5NjAwMTAxMDAwMDAwWhgPMjA2MDAxMDEwMDAwMDBaMGEx
CzAJBgNVBAYTAktSMRwwGgYDVQQKExNTYW1zdW5nIEVsZWN0cm9uaWNzMRAwDgYD
VQQDFAdBQzE0S19NMSIwIAYJKoZIhvcNAQkBFhNBQzE0S19NQHNhbXN1bmcuY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3l74XLKkRVn0LUK9kxlv
njyc6ykFTTmZghhV6wZjimtoHGb16g3u9bqZApm18Q2W7KlNZxaMelrSss2viRNR
GliI1RVfw9IZ5xfggOevOdaxYwMe2GFbXfU8CWFdZUnyWkAVP3nFMrNEl5SmSbYy
KCfz8i0RBO/U4zqk8VzF5w6YgLd6IsAKWTMHiec9kFYqrUXqZCN9xg4GHC82piHp
4EhulmZBFK9q6GNIpeGlV39yEVUV/uXCdi+eOtpBTypv1J6160rKy8GxfZbUpTQP
BYKRzd3fWcqgdzAeOqBmMsWGFO2vv0d0QMdI6DX1TxXvK4kF0HKDRIGpW3PH+zeB
zwIDAQABo3MwcTAdBgNVHQ4EFgQUXzEjosLzA6xbR1KAqnmAp3BNM6MwHwYDVR0j
BBgwFoAU/12TkC/BOF7xDaZZWJ+DGN6nMxcwDAYDVR0TBAUwAwEB/zAhBgNVHREE
GjAYggtzYW1zdW5nLmNvbYIJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4IBAQBW
0mStlbdvrHqDJ+KOKVf0C/y9FKTODqo/6/wJNZeZ+8ezPza4nFq70MwQYTpSbZhz
5w8bQP9fwSAoa2Vki8ZwcSd85Vi2tHz9O4C7d7zBA3FU8AL3NoEMFv6OGWGPnTY5
mG/Hn+LxuwQddlysfbRDds1LBY8DBUJNAmIeeWqA5Eg8DW6xJUwHeXUElJpSXHW6
XGvpWgAhXqoIf6TirdCrPY6+IzV/FcuVtBDGi+JoxgrMfMLgLEVjeSY96DJinHgZ
RT0FkA5e06Z+fqHh9Btu+aed+kuGSmya/A5wStOkGeKEbezbbN2gtW07lN6VxX3J
OCgygA+hmnBVnRDA8Jzu
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CN=RemoteAccessCA(CE),O=Samsung Electronics,C=KR
subject=/C=KR/O=Samsung Electronics/CN=RemoteAccessCA(CE)
issuer=/C=KR/O=Samsung Electronics/CN=CECA
-----BEGIN CERTIFICATE-----
MIIDUTCCAjmgAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQGEwJLUjEc
MBoGA1UECgwTU2Ftc3VuZyBFbGVjdHJvbmljczENMAsGA1UEAwwEQ0VDQTAiGA8x
OTYwMDEwMTAwMDAwMFoYDzIwNjAwMTAxMDAwMDAwWjBIMQswCQYDVQQGEwJLUjEc
MBoGA1UECgwTU2Ftc3VuZyBFbGVjdHJvbmljczEbMBkGA1UEAwwSUmVtb3RlQWNj
ZXNzQ0EoQ0UpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtatz9GvV
qbV395Whnad9MC9TEOiXuwnw37QHvQUwOTFgc6AenX5SORfb4UTw+0ApFNba9DlY
Xx/K9E5b5DGasDVGGTn+z+6MPB7GuAjkP+WSRwHMjrHRNqrBOr1YJUw3SIbMkRoT
460k9AD9DQDBORRtGBGwcBw6BvdasA+/L3Q63aJ7pDoj3qxocdcgk/zFq0OrxFDL
PMTL7a+a9DS8G10K73XGgES0RBwwhlXXVuLUprD6RgbeLHFsPpIq5vzzEpAYMCF6
vkZKjDGEW7JVTgUu0E37niN3NQv1gIXlJusDH6RWfFQxENZsdFkT/l+kTuY283Ga
2Ei1HsW3Xpt88QIDAQABo1AwTjAdBgNVHQ4EFgQU/12TkC/BOF7xDaZZWJ+DGN6n
MxcwHwYDVR0jBBgwFoAURwF9jkihypJa2u6zRwKrZwRlACswDAYDVR0TBAUwAwEB
/zANBgkqhkiG9w0BAQUFAAOCAQEAZkjxN4O92e1RTaXx1mpazyT98sJVl46R51s1
CTPq35HVfTiBOAu0C5MR6a9vIIFJScy5h69VN4OwDDbMhe/k3m6EfAutlL7lRrre
OT853HJahxdavzaXJ7tcrI/yDJI0X5GbQ8W74mmDt2/5rXsaB+h+NrToGqf6Hvf/
m7ZhUnCAt0hhLmltxTVYS25s9KoiIH0rXOb9cqUFsmBMEG2pHWC5AiSc0cXJm+kU
3z0B2GS+4IjGdVr3FTPzzTXrpqq/X1cIVKAum5WfsFMS0CRvqTVNVwYg52n69T2B
NPCCEpp9rsIieZ58jsnc506Uc+1Vp+NmBI2A/ecypZxSb6v9gg==
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CN=CECA,O=Samsung Electronics,C=KR
subject=/C=KR/O=Samsung Electronics/CN=CECA
issuer=/C=KR/O=Samsung Electronics/CN=ROOTCA
-----BEGIN CERTIFICATE-----
MIIDRTCCAi2gAwIBAgIBBDANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGEwJLUjEc
MBoGA1UECgwTU2Ftc3VuZyBFbGVjdHJvbmljczEPMA0GA1UEAwwGUk9PVENBMCIY
DzE5NjAwMTAxMDAwMDAwWhgPMjA2MDAxMDEwMDAwMDBaMDoxCzAJBgNVBAYTAktS
MRwwGgYDVQQKDBNTYW1zdW5nIEVsZWN0cm9uaWNzMQ0wCwYDVQQDDARDRUNBMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtv1WJJ7tTs/aa1ZZRjMPPLeb
n/Ev0Y28CSBj/6P031/veZSg/2z65QZUvPjv8MZnIgNoMpxMGbPPO4Dxj+QJthBk
WydWRPguPyE+w3U4SdayZXWpLZTpKfHco3CklFwEqZtG/wTxHD1oOvtT0e2g5c79
hNQt9lQ4Wwzqa3MvQd0JyeB4syy2zRLo5NjJZl1BVn2oTt4xGCjjtAXtAqqHEbEf
pcvB3hPdIpFe6M8zuN22kROKaQ5i4XP4CyEpbFlgKRcWBGQFX3I5f5TdD3Yw1Ril
OLLL9wFsJ+iWLka9tAIcJKCNOf48p7aXm6COFwmjtCNu4wjQozwi6cycKUgxNQID
AQABo1AwTjAdBgNVHQ4EFgQURwF9jkihypJa2u6zRwKrZwRlACswHwYDVR0jBBgw
FoAU7andrmFFrxYM8+93lrn/Fq47sXMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
AQUFAAOCAQEATexseQBXSfUR7fFTFxq6aAvHWIN+h3QLeN1sq8KCM4fbdkH3lOUP
rKW3w1ag62bnJVNjT4xPtzH/DyrqlzQUPTb7S0PfIXt2mu/VURnrmuXidS2grNwv
eu10gURZaz9N2UZEhY7E80tUZwcjAV+YP8+x3/iRQSrWvcMma/r01eUnwrF4xaE9
EYtJ/jTRre8MpEH/lg06m+rZf9Lk/yhG6at0YnUAIytThqFV4Cj8T8jBX+KG8BCo
VyUsFyrO+D6X98gMdTZnLqC1P1iWuxyrOWZTgsf44f5GXzmLqe5KLPvkDb4MywTa
nXrSOPSkcIgvS6WYw2Rii+e6lfVzqmhAmg==
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CN=ROOTCA,O=Samsung Electronics,C=KR
subject=/C=KR/O=Samsung Electronics/CN=ROOTCA
issuer=/C=KR/O=Samsung Electronics/CN=ROOTCA
-----BEGIN CERTIFICATE-----
MIIDRzCCAi+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGEwJLUjEc
MBoGA1UECgwTU2Ftc3VuZyBFbGVjdHJvbmljczEPMA0GA1UEAwwGUk9PVENBMCIY
DzE5NjAwMTAxMDAwMDAwWhgPMjA2MDAxMDEwMDAwMDBaMDwxCzAJBgNVBAYTAktS
MRwwGgYDVQQKDBNTYW1zdW5nIEVsZWN0cm9uaWNzMQ8wDQYDVQQDDAZST09UQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCd67g2hzhbIeSBoFfeqbXi
tzbO4dCWeCigVfmwEDhR1SDA0MfHOVlFpvuFr3WyFPvQZ0ccNrsTpBs5YieI/jZi
FYWO0ktbqQorL1CIFqBL9kAF+34BYtpl98PgJ1grLOH5T3GugJA7Irw0plEFmOfs
IydlUIQHl3oqyMIWPa2nIZ/FGi3hAquEPrvzHZB+QO4c+6tV1WLIaCjn88xkYuwz
uGYxaqJpnGdqhjZRIuHb2DEZPlP1VGdTTAttno36CyWqeHrSC8fXCSu55Zk+1rbC
Py/phOJjSyce2qk0IebETAYLCLqU7ABJxUxrolMrP37OB+Kqe4RWovaeMcdcNOOt
AgMBAAGjUDBOMB0GA1UdDgQWBBTtqd2uYUWvFgzz73eWuf8WrjuxczAfBgNVHSME
GDAWgBTtqd2uYUWvFgzz73eWuf8WrjuxczAMBgNVHRMEBTADAQH/MA0GCSqGSIb3
DQEBBQUAA4IBAQBkwK95x8JCAnY0F2bMwG5+7QfY+ci8s8m1ODi3v19HECS6nG9j
SXgwihEtQ3HqvUler+n7aOeAZlgm+BymM2GvuicveYN/nevIvzlpMOn2L6xU19/H
zM2eoDVfS49+i/cwoi/A7fcZmIYggZho2UJR/GvKc79g6EAhT7/i5alBZF0enMsA
9okzakb/aohQE9SzsEHnhVKpGAjvu0/TJK9WwX6mkiIEJY+mzQMWgEeQt6WWIgAb
gSX9NueH80tpZ9KqFnqnOoLxTAa7k0RPBRwyUO9CDhSnlWIEcsD9sqR2M+niOFnT
KBHcLDDiEU3llprD8FRV3unYrl0F0B2GGdRk
-----END CERTIFICATE-----
41 changes: 26 additions & 15 deletions custom_components/climate_ip/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
ATTR_TARGET_TEMP_HIGH,
ATTR_TARGET_TEMP_LOW,
DOMAIN,
ClimateEntity,
HVAC_MODE_OFF,
ClimateEntity,
)
from homeassistant.components.climate.const import (
ATTR_MAX_TEMP,
Expand All @@ -48,17 +48,17 @@
CONF_TOKEN,
STATE_OFF,
STATE_ON,
STATE_UNAVAILABLE,
STATE_UNKNOWN,
TEMP_CELSIUS,
TEMP_FAHRENHEIT,
STATE_UNKNOWN,
STATE_UNAVAILABLE,
)
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
from homeassistant.helpers.service import extract_entity_ids
#from homeassistant.util.temperature import convert as convert_temperature
from homeassistant.util.unit_conversion import TemperatureConverter

# from homeassistant.util.temperature import convert as convert_temperature
from homeassistant.util.unit_conversion import TemperatureConverter

from .controller import ATTR_POWER, ClimateController, create_controller
from .yaml_const import (
Expand Down Expand Up @@ -113,13 +113,12 @@
vol.Optional(
CONFIG_DEVICE_UPDATE_DELAY, default=DEFAULT_UPDATE_DELAY
): cv.string,
vol.Optional(CONF_DEVICE_ID, default='032000000'): cv.string,
vol.Optional(CONF_DEVICE_ID, default="032000000"): cv.string,
}
)


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):

_LOGGER.setLevel(logging.INFO if config.get("debug", False) else logging.ERROR)
_LOGGER.info("climate_ip: async setup platform")

Expand All @@ -130,6 +129,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
except Exception as e:
_LOGGER.error("climate_ip: error while creating controller!")
import traceback

_LOGGER.error(traceback.format_exc())
_LOGGER.error(e)
raise
Expand Down Expand Up @@ -192,9 +192,10 @@ def __init__(self, rac_controller, config):
self.rac = rac_controller
self._name = config.get(CONFIG_DEVICE_NAME, None)
_LOGGER.info("self._name: {}".format(self._name))

self._poll = None
self._unique_id = None
self._unique_id = self._name
_LOGGER.info("self._unique_id: {}".format(self._unique_id))
str_poll = config.get(CONFIG_DEVICE_POLL, "")
if str_poll:
str_poll = str_poll.lower()
Expand All @@ -208,7 +209,7 @@ def __init__(self, rac_controller, config):
features |= SUPPORTED_FEATURES_MAP[f]
for f in SUPPORTED_FEATURES_MAP.keys():
_LOGGER.info("Feature: {}".format(f))

if f in self.rac.attributes:
features |= SUPPORTED_FEATURES_MAP[f]
self._supported_features = features
Expand Down Expand Up @@ -250,10 +251,15 @@ def should_poll(self):

@property
def unique_id(self):
if self._unique_id is None and self.rac.unique_id is not None:
_LOGGER.info("About to set unique id {}".format(self.rac.unique_id))
self._unique_id = "climate_ip_" + self.rac.unique_id

# if self._unique_id is None and self.rac.unique_id is not None:
# _LOGGER.info("About to set unique id {}".format(self.rac.unique_id))
# self._unique_id = "climate_ip_" + self.rac.unique_id

if self._unique_id is None:
name_value = self._name
_LOGGER.info("About to set unique id {}".format(name_value))
self._unique_id = "climate_ip_" + name_value

_LOGGER.info("Returning unique id of {}".format(self._unique_id))
return self._unique_id

Expand Down Expand Up @@ -306,7 +312,12 @@ def target_temperature_low(self):

@property
def hvac_mode(self):
return HVAC_MODE_OFF if self.rac.get_property(ATTR_HVAC_MODE) in [STATE_UNKNOWN, STATE_UNAVAILABLE, ''] else self.rac.get_property(ATTR_HVAC_MODE)
return (
HVAC_MODE_OFF
if self.rac.get_property(ATTR_HVAC_MODE)
in [STATE_UNKNOWN, STATE_UNAVAILABLE, ""]
else self.rac.get_property(ATTR_HVAC_MODE)
)

@property
def hvac_modes(self):
Expand Down
14 changes: 9 additions & 5 deletions custom_components/climate_ip/connection_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
import json
import logging
import os
import ssl
import time
import traceback
import ssl

from requests.adapters import HTTPAdapter
from homeassistant.const import CONF_IP_ADDRESS, CONF_MAC, CONF_PORT, CONF_TOKEN
from requests.adapters import HTTPAdapter

from .connection import Connection, register_connection
from .yaml_const import (
Expand All @@ -20,6 +20,7 @@
CONNECTION_TYPE_REQUEST = "request"
CONNECTION_TYPE_REQUEST_PRINT = "request_print"


class SamsungHTTPAdapter(HTTPAdapter):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand All @@ -30,6 +31,7 @@ def init_poolmanager(self, *args, **kwargs):
kwargs["ssl_context"] = ssl_context
return super().init_poolmanager(*args, **kwargs)


class ConnectionRequestBase(Connection):
def __init__(self, hass_config, logger):
super(ConnectionRequestBase, self).__init__(hass_config, logger)
Expand All @@ -39,7 +41,7 @@ def __init__(self, hass_config, logger):
self.update_configuration_from_hass(hass_config)
self._condition_template = None
self._thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=1)

def __del__(self):
self._thread_pool.shutdown(wait=False)

Expand Down Expand Up @@ -117,7 +119,7 @@ def execute_internal(self, template, value, device_state) -> (json, bool, int):
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
with requests.sessions.Session() as session:
self.logger.info("Setting up HTTP Adapter and ssl context")
session.mount('https://', SamsungHTTPAdapter())
session.mount("https://", SamsungHTTPAdapter())
self.logger.info(self._params)

try:
Expand All @@ -131,7 +133,9 @@ def execute_internal(self, template, value, device_state) -> (json, bool, int):
try:
resp = future.result()
except:
self.logger.error("Request result exception: {}".format(future.exception()))
self.logger.error(
"Request result exception: {}".format(future.exception())
)
return (None, False, 0)

self.logger.info(
Expand Down
4 changes: 2 additions & 2 deletions custom_components/climate_ip/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ def service_schema_map(self):

@property
def operations(self):
""" Return a list of available operations """
"""Return a list of available operations"""
return []

@property
def attributes(self):
""" Return a list of available attributes """
"""Return a list of available attributes"""
return []


Expand Down
Loading

0 comments on commit 01fb81b

Please sign in to comment.