Skip to content

Commit 326e354

Browse files
committed
Added GSB3_40_V2, GSB3_60_V2, GSB3_90_V2, GSB3_40Sx_V2, GSB3_60Sx_V2, GSB3_90Sx_V2, MSB3_40, MSB3_60, MSB3_90
1 parent 4948ae2 commit 326e354

File tree

4 files changed

+137
-11
lines changed

4 files changed

+137
-11
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ Supported bus devices
7575
- GSB3-60SX (139)
7676
- GSB3-20SX (140)
7777
- GBP3-60 (141)
78+
- GSB3-40-V2 (143)
79+
- GSB3-60-V2 (144)
80+
- GSB3-90-V2 (146)
7881
- DAC3-04B (147)
7982
- DAC3-04M (148)
8083
- DCDA-33M (150)
@@ -89,5 +92,11 @@ Supported bus devices
8992
- Virtual cooling regulator (168)
9093
- SA3_014M (169)
9194
- JA3_014M (170)
95+
- GSB3-40Sx-V2 (174)
96+
- GSB3-60Sx-V2 (175)
97+
- GSB3-90Sx-V2 (176)
98+
- MSB3-40 (177)
99+
- MSB3-60 (178)
100+
- MSB3-90 (179)
92101
- BITS (bits)
93102
- INTEGETS (integers)

inelsmqtt/const.py

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@
8989
JA3_014M = "JA3-014M"
9090
DALI_DMX_UNIT = "DALI-DMX-Unit"
9191
DALI_DMX_UNIT_2 = "DALI-DMX-Unit-2"
92+
MSB3_40 = "MSB3-40"
93+
MSB3_60 = "MSB3-60"
94+
MSB3_90 = "MSB3-90"
95+
GSB3_40_V2 = "GSB3-40-V2"
96+
GSB3_60_V2 = "GSB3-60-V2"
97+
GSB3_90_V2 = "GSB3-90-V2"
98+
GSB3_40SX_V2 = "GSB3-40SX-V2"
99+
GSB3_60SX_V2 = "GSB3-60SX-V2"
100+
GSB3_90SX_V2 = "GSB3-90SX-V2"
92101
INTEGERS = "INTEGERS"
93102
BITS = "BITS"
94103

@@ -160,6 +169,11 @@
160169
"139": GSB3_60SX,
161170
"140": GSB3_20SX,
162171
"141": GBP3_60,
172+
173+
"143": GSB3_40_V2,
174+
"144": GSB3_60_V2,
175+
"146": GSB3_90_V2,
176+
163177
"147": DAC3_04B,
164178
"148": DAC3_04M,
165179

@@ -181,6 +195,13 @@
181195

182196
"170": JA3_014M,
183197

198+
"174": GSB3_40SX_V2,
199+
"175": GSB3_60SX_V2,
200+
"176": GSB3_90SX_V2,
201+
"177": MSB3_40,
202+
"178": MSB3_60,
203+
"179": MSB3_90,
204+
184205
"bits": BITS,
185206
"integers": INTEGERS,
186207
}
@@ -238,12 +259,16 @@
238259
"129": SWITCH, # GCH3_31,
239260

240261
"136": SENSOR, # GSP3_100,
241-
"137": SENSOR, # GDB3_10,
262+
"137": BUTTON, # GDB3_10,
242263
"138": BUTTON, # GSB3_40SX,
243264
"139": BUTTON, # GSB3_60SX
244265
"140": BUTTON, # GSB3_20SX,
245266
"141": BUTTON, # GBP3_60,
246267

268+
"143": SENSOR, # GSB3_40_V2
269+
"144": SENSOR, # GSB3_60_V2
270+
"146": SENSOR, # GSB3_90_V2
271+
247272
"147": LIGHT, # DAC3_04B,
248273
"148": LIGHT, # DAC3_04M,
249274
"150": LIGHT, # DCDA_33M,
@@ -264,6 +289,13 @@
264289

265290
"170": COVER, # JA3_014M
266291

292+
"174": SENSOR, # GSB3_40SX_V2
293+
"175": SENSOR, # GSB3_60SX_V2
294+
"176": SENSOR, # GSB3_90SX_V2
295+
"177": SENSOR, # MSB3_40
296+
"178": SENSOR, # MSB3_60
297+
"179": SENSOR, # MSB3_90
298+
267299
"bits": SWITCH,
268300
"integers": NUMBER,
269301
}
@@ -621,6 +653,17 @@ class Climate_presets(IntEnum):
621653
AIN: [8, 9],
622654
}
623655

656+
GSB3_V2_DATA = {
657+
SW: [0],
658+
DIN: [1],
659+
TEMP_IN: [2, 3],
660+
LIGHT_IN: [4, 5, 6, 7],
661+
AIN: [8, 9],
662+
HUMIDITY: [10, 11],
663+
DEW_POINT: [12, 13],
664+
}
665+
666+
624667
GSP3_100_DATA = {
625668
GSP3_100: [0, 1],
626669
TEMP_IN: [2, 3],
@@ -806,11 +849,27 @@ class Climate_presets(IntEnum):
806849
}
807850

808851
DA3_AMOUNTS = {DA3_22M: 2, DA3_66M: 6}
809-
GSB3_AMOUNTS = {GSB3_20SX: 2, GSB3_40SX: 4, GSB3_60SX: 6, GSB3_90SX: 9, GBP3_60: 6}
810852
IM3_AMOUNTS = {IM3_20B: 2, IM3_40B: 4, IM3_80B: 8, IM3_140M: 14}
811853
TI3_AMOUNTS = {TI3_10B: 1, TI3_40B: 4, TI3_60M: 6}
812854
WSB3_AMOUNTS = {WSB3_20: 2, WSB3_20H: 2, WSB3_40: 4, WSB3_40H: 4}
813855

856+
GSB3_AMOUNTS = {
857+
GSB3_20SX: 2,
858+
GSB3_40SX: 4,
859+
GSB3_60SX: 6,
860+
GSB3_90SX: 9,
861+
GBP3_60: 6,
862+
GSB3_40_V2: 4,
863+
GSB3_60_V2: 6,
864+
GSB3_90_V2: 9,
865+
GSB3_40SX_V2: 4,
866+
GSB3_60SX_V2: 6,
867+
GSB3_90SX_V2: 9,
868+
MSB3_40: 4,
869+
MSB3_60: 6,
870+
MSB3_90: 9,
871+
}
872+
814873
VIRT_CONT_STATUS_TABLE = {
815874
0 : "User control",
816875
1 : "Two temperature autonomous",

inelsmqtt/util.py

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@
169169
WSB3_240HUM_DATA,
170170
DMD3_1_DATA,
171171
GSB3_DATA,
172+
GSB3_V2_DATA,
172173
RC3_610DALI_DATA,
173174
FA3_612M_DATA,
174175

@@ -208,6 +209,16 @@
208209
Climate_action,
209210
Climate_modes,
210211

212+
MSB3_40,
213+
MSB3_60,
214+
MSB3_90,
215+
GSB3_40_V2,
216+
GSB3_60_V2,
217+
GSB3_90_V2,
218+
GSB3_40SX_V2,
219+
GSB3_60SX_V2,
220+
GSB3_90SX_V2,
221+
211222
BITS,
212223
INTEGERS,
213224
NUMBER,
@@ -579,7 +590,7 @@ def __find_ha_value(self) -> None:
579590
overflows.append(alerts[15-i] == "1")
580591

581592
digital_inputs = self.__trim_inels_status_values(
582-
SA3_012M_DATA, SA3_012M, "")
593+
SA3_022M_DATA, SW, "")
583594
digital_inputs = f"0x{digital_inputs}"
584595
digital_inputs = f"{int(digital_inputs, 16):0>16b}"
585596

@@ -646,7 +657,7 @@ def __find_ha_value(self) -> None:
646657
for relay in self.__trim_inels_status_bytes(IOU3_108M_DATA, RELAY):
647658
re.append((int(relay, 16) & 1) != 0)
648659

649-
temps = self.__trim_inels_status_values(IOU3_108M_DATA, TEMP_IN)
660+
temps = self.__trim_inels_status_values(IOU3_108M_DATA, TEMP_IN, "")
650661
temps = [temps[0:4], temps[4:8]]
651662

652663
digital_inputs = self.__trim_inels_status_values(
@@ -1224,7 +1235,53 @@ def __find_ha_value(self) -> None:
12241235
temp_in=temp_in,
12251236
temp_out=temp_out,
12261237
)
1227-
elif self.__device_type is LIGHT: # dimmer
1238+
elif self.__inels_type in [GSB3_40_V2, GSB3_60_V2, GSB3_90_V2, GSB3_40SX_V2, GSB3_60SX_V2, GSB3_90SX_V2, MSB3_40, MSB3_60, MSB3_90]:
1239+
switches = self.__trim_inels_status_values(GSB3_V2_DATA, SW, "")
1240+
switches = f"0x{switches}"
1241+
switches = f"{int(switches, 16):0>8b}"
1242+
1243+
digital_inputs = self.__trim_inels_status_values(GSB3_V2_DATA, DIN, "")
1244+
digital_inputs = f"0x{digital_inputs}"
1245+
digital_inputs = f"{int(digital_inputs, 16):0>8b}"
1246+
1247+
interface=[]
1248+
1249+
# Determine the number of buttons to process based on INTERFACE_BUTTON_COUNT
1250+
gsb3_amount = GSB3_AMOUNTS[self.__inels_type]
1251+
num_buttons = gsb3_amount if gsb3_amount < 8 else gsb3_amount - 1
1252+
1253+
# Append states from 'switches' based on the number of buttons
1254+
for i in range(num_buttons):
1255+
interface.append(switches[7 - i] == "1")
1256+
1257+
# If there are 8 or more buttons, use the last digital input for the button
1258+
if gsb3_amount >= 8:
1259+
interface.append(digital_inputs[7] == "1")
1260+
1261+
din=[digital_inputs[6] == "1"]
1262+
prox=digital_inputs[4] == "1"
1263+
1264+
temp_in = self.__trim_inels_status_values(GSB3_V2_DATA, TEMP_IN, "")
1265+
1266+
light_in = self.__trim_inels_status_values(GSB3_V2_DATA, LIGHT_IN, "")
1267+
1268+
ain = self.__trim_inels_status_values(GSB3_V2_DATA, AIN, "")
1269+
1270+
humidity = self.__trim_inels_status_values(GSB3_V2_DATA, HUMIDITY, "")
1271+
1272+
dewpoint = self.__trim_inels_status_values(GSB3_V2_DATA, DEW_POINT, "")
1273+
1274+
self.__ha_value = new_object(
1275+
interface=interface,
1276+
din=din,
1277+
prox=prox,
1278+
temp_in=temp_in,
1279+
light_in=light_in,
1280+
ain=ain,
1281+
humidity=humidity,
1282+
dewpoint=dewpoint,
1283+
)
1284+
elif self.__device_type == LIGHT: # dimmer
12281285
if self.__inels_type in [RF_SINGLE_DIMMER, RF_DIMMER]:
12291286
if self.inels_status_value is None:
12301287
_LOGGER.info("inels_status_value was None for RFDAC")
@@ -1418,8 +1475,8 @@ def __find_ha_value(self) -> None:
14181475
aout_val=[]
14191476
aouts = self.__trim_inels_status_bytes(DCDA_33M_DATA, OUT)
14201477
for i in range(len(aouts)):
1421-
brightness = int(i, 16)
1422-
brightness = brightness if brightness > 100 else 100
1478+
brightness = int(aouts[i], 16)
1479+
brightness = brightness if brightness < 100 else 100
14231480
aout_val.append(brightness)
14241481

14251482
aout=[]
@@ -2133,11 +2190,12 @@ def __find_ha_value(self) -> None:
21332190
switches = f"{int(switches, 16):0>8b}"
21342191

21352192
digital_inputs = self.__trim_inels_status_values(
2136-
GLASS_CONTROLLER_DATA, SW, "")
2193+
GLASS_CONTROLLER_DATA, DIN, "")
21372194
digital_inputs = f"0x{digital_inputs}"
21382195
digital_inputs = f"{int(digital_inputs, 16):0>8b}"
21392196

21402197
interface = []
2198+
din = []
21412199
for i in range(3):
21422200
interface.append(switches[6-2*i]=="1")
21432201
for i in range(2):
@@ -2316,7 +2374,7 @@ def __find_inels_value(self) -> None:
23162374
elif self.__inels_type in DCDA_33M:
23172375
set_val = "00\n"*4
23182376
for i in range(4):
2319-
aout = self.__ha_value.out[i].brightness
2377+
aout = self.__ha_value.aout[i].brightness
23202378
set_val += f"{aout:02X}\n"
23212379
self.__inels_set_value = set_val
23222380
elif self.__inels_type is DA3_66M:
@@ -2370,7 +2428,7 @@ def __find_inels_value(self) -> None:
23702428
self.__inels_set_value = f"{''.join([SIMPLE_SHUTTER_STATE_SET[x.state] for x in self.__ha_value.simple_shutters])}"
23712429
elif self.__device_type is CLIMATE:
23722430
if self.__inels_type is RF_WIRELESS_THERMOVALVE:
2373-
required_temp = int(round(self.__ha_value.climate.required * 2, 0))
2431+
required_temp = int(round(self.__ha_value.thermovalve.required * 2, 0))
23742432
self.__inels_set_value = f"00\n{required_temp:02X}\n00\n"
23752433
elif self.__inels_type is VIRT_CONTR:
23762434
cc = self.ha_value.climate_controller

setup.py

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

44
setup(
55
name="elkoep-mqtt",
6-
version="0.2.31",
6+
version="0.2.32",
77
url="https://github.com/epdevlab/elkoep-mqtt",
88
license="MIT",
99
author="Elko EP s.r.o.",

0 commit comments

Comments
 (0)