11"""Utility classes."""
22from dataclasses import dataclass
33import logging
4+ import json
5+ import re
46
57from operator import itemgetter
68from typing import Any , Dict , Optional
205207 Shutter_state ,
206208 Climate_action ,
207209 Climate_modes ,
210+
211+ BITS ,
212+ INTEGERS ,
213+ NUMBER ,
208214)
209215
216+ #bit
217+ @dataclass
218+ class Bit ():
219+ is_on : bool
220+ addr : str
221+
222+ #number
223+ @dataclass
224+ class Number ():
225+ value : int
226+ addr : str
227+
210228#relay
211229@dataclass
212230class SimpleRelay ():
@@ -278,6 +296,29 @@ def break_into_bytes(line: str):
278296 return [line [i :i + 2 ] for i in range (0 , len (line ), 2 )]
279297 return []
280298
299+ def xparse_formated_json (data ):
300+ regex = r"state\":\{(.*)\}\}"
301+ match = re .search (regex , data )
302+ addr_val_list = []
303+ if match != None :
304+ states = match .group (1 )
305+ addr_value_pair_list = states .split (',' )
306+ for item in addr_value_pair_list :
307+ addr , val = item .split (':' )
308+ addr_val_list .append (
309+ (addr , int (val ))
310+ )
311+ return addr_val_list
312+
313+ def parse_formated_json (data ):
314+ addr_val_list = []
315+ data = json .loads (data )
316+ for addr , val in data ['state' ].items ():
317+ addr_val_list .append (
318+ (addr , val )
319+ )
320+ return addr_val_list
321+
281322class DeviceValue (object ):
282323 """Device value interpretation object."""
283324
@@ -842,6 +883,42 @@ def __find_ha_value(self) -> None:
842883 card_present = card_present ,
843884 card_id = card_id ,
844885 )
886+ elif self .__inels_type is BITS :
887+ bit : list [Bit ] = []
888+ for addr , val in parse_formated_json (self .__inels_status_value ):
889+ bit .append (
890+ Bit (
891+ is_on = val , addr = addr
892+ )
893+ )
894+
895+ self .__ha_value = new_object (
896+ bit = bit ,
897+ )
898+
899+ set_val = {}
900+ for bit in self .ha_value .bit :
901+ set_val [bit .addr ] = bit .is_on
902+
903+ self .__inels_set_value = json .dumps ({"cmd" : set_val })
904+ elif self .__device_type is NUMBER :
905+ number : list [Number ] = []
906+ for addr , val in parse_formated_json (self .__inels_status_value ):
907+ number .append (
908+ Number (
909+ value = val , addr = addr
910+ )
911+ )
912+
913+ self .__ha_value = new_object (
914+ number = number ,
915+ )
916+
917+ set_val = {}
918+ for number in self .ha_value .number :
919+ set_val [number .addr ] = number .value
920+
921+ self .__inels_set_value = json .dumps ({"cmd" : set_val })
845922 elif self .__device_type is SENSOR : # temperature sensor
846923 if self .__inels_type is RF_TEMPERATURE_INPUT :
847924 battery = int (self .__trim_inels_status_values (DEVICE_TYPE_10_DATA , BATTERY , "" ), 16 )
@@ -1193,8 +1270,8 @@ def __find_ha_value(self) -> None:
11931270 self .__inels_set_value = DEVICE_TYPE_13_COMM_TEST
11941271 self .__ha_value = None
11951272 else :
1196- simple_light = []
1197- simple_light .append (
1273+ warm_light = []
1274+ warm_light .append (
11981275 WarmLight (
11991276 brightness = round (
12001277 int (self .__trim_inels_status_values (DEVICE_TYPE_13_DATA , OUT , "" ), 16 ) * 100.0 / 255.0
@@ -1205,7 +1282,7 @@ def __find_ha_value(self) -> None:
12051282 ),
12061283 )
12071284
1208- self .__ha_value = new_object (simple_light = simple_light )
1285+ self .__ha_value = new_object (warm_light = warm_light )
12091286 elif self .__inels_type is DA3_22M :
12101287 temp = self .__trim_inels_status_values (DA3_22M_DATA , TEMP_IN , "" )
12111288
@@ -2181,7 +2258,19 @@ def __find_inels_value(self) -> None:
21812258 elif self .__inels_type in [GCR3_11 , GCH3_31 ]:
21822259 set_val = "04\n " if self .ha_value .simple_relay [0 ].is_on else "00\n "
21832260 set_val += "00\n " * 9
2184- self .__inels_set_value = set_val
2261+ self .__inels_set_value = set_val
2262+ elif self .__inels_type is BITS :
2263+ set_val = {}
2264+ for bit in self .ha_value .bit :
2265+ set_val [bit .addr ] = int (bit .is_on )
2266+
2267+ self .__inels_set_value = json .dumps ({"cmd" : set_val })
2268+ elif self .__device_type is NUMBER :
2269+ set_val = {}
2270+ for number in self .ha_value .number :
2271+ set_val [number .addr ] = int (number .value )
2272+
2273+ self .__inels_set_value = json .dumps ({"cmd" : set_val })
21852274 elif self .__device_type is LIGHT :
21862275 if self .__inels_type in [RF_SINGLE_DIMMER , RF_DIMMER ]:
21872276 if self .__ha_value is None :
@@ -2204,7 +2293,7 @@ def __find_inels_value(self) -> None:
22042293 if self .__ha_value is None :
22052294 self .__inels_set_value = DEVICE_TYPE_13_COMM_TEST
22062295 else :
2207- self .__inels_set_value = f"0F\n 00\n 00\n 00\n { round (self .ha_value .simple_light [0 ].brightness * 2.55 ):02X} \n { round (self .ha_value .simple_light [0 ].relative_ct * 2.55 ):02X} \n "
2296+ self .__inels_set_value = f"0F\n 00\n 00\n 00\n { round (self .ha_value .warm_light [0 ].brightness * 2.55 ):02X} \n { round (self .ha_value .warm_light [0 ].relative_ct * 2.55 ):02X} \n "
22082297 elif self .__inels_type is DA3_22M :
22092298 # correct the values
22102299 out1 = round (self .__ha_value .light_coa_toa [0 ].brightness , - 1 )
0 commit comments