From b6a9fd242b8ee2ec8655fdf27a90a43e1a7bbce7 Mon Sep 17 00:00:00 2001 From: Ernst Klamer Date: Sat, 6 Jul 2024 14:11:30 +0200 Subject: [PATCH] Add Linptech KS1 en KS1BP --- .../ble_monitor/ble_parser/xiaomi.py | 127 ++++++++++++++++++ custom_components/ble_monitor/const.py | 48 +++++++ custom_components/ble_monitor/sensor.py | 4 + docs/_devices/Linptech_KS1.md | 30 +++++ docs/_devices/Linptech_KS1BP.md | 32 +++++ docs/assets/images/Linptech_KS1.png | Bin 0 -> 9144 bytes docs/assets/images/Linptech_KS1BP.png | Bin 0 -> 13301 bytes 7 files changed, 241 insertions(+) create mode 100644 docs/_devices/Linptech_KS1.md create mode 100644 docs/_devices/Linptech_KS1BP.md create mode 100644 docs/assets/images/Linptech_KS1.png create mode 100644 docs/assets/images/Linptech_KS1BP.png diff --git a/custom_components/ble_monitor/ble_parser/xiaomi.py b/custom_components/ble_monitor/ble_parser/xiaomi.py index 52ba55c9..5005744e 100755 --- a/custom_components/ble_monitor/ble_parser/xiaomi.py +++ b/custom_components/ble_monitor/ble_parser/xiaomi.py @@ -78,6 +78,8 @@ 0x38BB: "PTX", 0x3531: "XMPIRO2SXS", 0x3F4C: "PS1BB", + 0x3A61: "KS1", + 0x3E17: "KS1BP", } # Structured objects for data conversions @@ -700,6 +702,13 @@ def obj3003(xobj): # The following data objects are device specific. For now only added for # LYWSD02MMC, XMWSDJ04MMC, MJWSD05MMC, XMWXKG01YL, LINPTECH MS1BB(MI), HS1BB(MI), K9BB # https://miot-spec.org/miot-spec-v2/instances?status=all + +def obj4801(xobj): + """Temperature""" + (temp,) = struct.unpack("f", xobj) + return {"temperature": temp} + + def obj4803(xobj): """Battery""" batt = xobj[0] @@ -731,6 +740,12 @@ def obj4806(xobj): return {"moisture detected": wet} +def obj4808(xobj): + """Humidity""" + (humi,) = struct.unpack("f", xobj) + return {"humidity": humi} + + def obj4810(xobj): """Sleep State""" sleep_state = xobj[0] @@ -1050,6 +1065,12 @@ def obj4e1c(xobj): return {"device reset": xobj[0]} +def obj5003(xobj): + """Battery""" + batt = xobj[0] + return {"battery": batt} + + def obj5010(xobj): """Sleep State""" sleep_state = xobj[0] @@ -1073,12 +1094,111 @@ def obj5403(xobj): return {"battery": xobj[0]} +def obj5414(xobj): + """Mode""" + mode = xobj[0] + return {"mode": mode} + + def obj5601(xobj): """Low Battery""" low_batt = xobj[0] return {"low battery": low_batt} +def obj560c(xobj, device_type): + """Click""" + if device_type in ["KS1", "KS1BP"]: + click = xobj[0] + if click == 1: + result = { + "four btn switch 1": "toggle", + "button switch": "single press", + } + elif click == 2: + result = { + "four btn switch 2": "toggle", + "button switch": "single press", + } + elif click == 3: + result = { + "four btn switch 3": "toggle", + "button switch": "single press", + } + elif click == 4: + result = { + "four btn switch 4": "toggle", + "button switch": "single press", + } + else: + result = None + return result + else: + return None + + +def obj560d(xobj, device_type): + """Click""" + if device_type in ["KS1", "KS1BP"]: + click = xobj[0] + if click == 1: + result = { + "four btn switch 1": "toggle", + "button switch": "double press", + } + elif click == 2: + result = { + "four btn switch 2": "toggle", + "button switch": "double press", + } + elif click == 3: + result = { + "four btn switch 3": "toggle", + "button switch": "double press", + } + elif click == 4: + result = { + "four btn switch 4": "toggle", + "button switch": "double press", + } + else: + result = None + return result + else: + return None + + +def obj560e(xobj, device_type): + """Click""" + if device_type in ["KS1", "KS1BP"]: + click = xobj[0] + if click == 1: + result = { + "four btn switch 1": "toggle", + "button switch": "long press", + } + elif click == 2: + result = { + "four btn switch 2": "toggle", + "button switch": "long press", + } + elif click == 3: + result = { + "four btn switch 3": "toggle", + "button switch": "long press", + } + elif click == 4: + result = { + "four btn switch 4": "toggle", + "button switch": "long press", + } + else: + result = None + return result + else: + return None + + def obj5a16(xobj): """Bed occupancy""" event = xobj[0] @@ -1124,10 +1244,12 @@ def obj5a16(xobj): 0x100E: obj100e, 0x2000: obj2000, 0x3003: obj3003, + 0x4801: obj4801, 0x4803: obj4803, 0x4804: obj4804, 0x4805: obj4805, 0x4806: obj4806, + 0x4808: obj4808, 0x4810: obj4810, 0x4811: obj4811, 0x4818: obj4818, @@ -1158,10 +1280,15 @@ def obj5a16(xobj): 0x4e16: obj4e16, 0x4e17: obj4e17, 0x4e1c: obj4e1c, + 0x5003: obj5003, 0x5010: obj5010, 0x5011: obj5011, 0x5403: obj5403, + 0x5414: obj5414, 0x5601: obj5601, + 0x560c: obj560c, + 0x560d: obj560d, + 0x560e: obj560e, 0x5a16: obj5a16, } diff --git a/custom_components/ble_monitor/const.py b/custom_components/ble_monitor/const.py index 2610685b..38ddf5d7 100755 --- a/custom_components/ble_monitor/const.py +++ b/custom_components/ble_monitor/const.py @@ -1722,6 +1722,50 @@ class BLEMonitorBinarySensorEntityDescription( device_class=None, state_class=None, ), + BLEMonitorSensorEntityDescription( + key="four btn switch 1", + sensor_class="SwitchSensor", + update_behavior="Instantly", + name="ble four button switch 1", + unique_id="btn_switch_1_", + icon="mdi:gesture-tap-button", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + ), + BLEMonitorSensorEntityDescription( + key="four btn switch 2", + sensor_class="SwitchSensor", + update_behavior="Instantly", + name="ble four button switch 2", + unique_id="btn_switch_2_", + icon="mdi:gesture-tap-button", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + ), + BLEMonitorSensorEntityDescription( + key="four btn switch 3", + sensor_class="SwitchSensor", + update_behavior="Instantly", + name="ble four button switch 3", + unique_id="btn_switch_3_", + icon="mdi:gesture-tap-button", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + ), + BLEMonitorSensorEntityDescription( + key="four btn switch 4", + sensor_class="SwitchSensor", + update_behavior="Instantly", + name="ble four button switch 4", + unique_id="btn_switch_4_", + icon="mdi:gesture-tap-button", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + ), BLEMonitorSensorEntityDescription( key="remote", sensor_class="BaseRemoteSensor", @@ -1849,6 +1893,8 @@ class BLEMonitorBinarySensorEntityDescription( 'MS1BB(MI)' : [["battery", "rssi"], ["button"], ["opening"]], 'HS1BB(MI)' : [["illuminance", "battery", "rssi"], [], ["motion"]], 'PS1BB' : [["battery", "rssi", "pressure present duration", "pressure not present duration", "pressure present time set", "pressure not present time set"], [], ["reset", "pressure state"]], + 'KS1' : [["battery", "rssi"], ["four btn switch 1", "four btn switch 2", "four btn switch 3", "four btn switch 4"], []], + 'KS1BP' : [["temperature", "humidity", "battery", "rssi"], ["four btn switch 1", "four btn switch 2", "four btn switch 3", "four btn switch 4"], []], 'XMPIRO2SXS' : [["illuminance", "battery", "rssi"], [], ["motion"]], 'XMWXKG01YL' : [["rssi"], ["two btn switch left", "two btn switch right"], []], 'XMWXKG01LM' : [["battery", "rssi"], ["one btn switch"], []], @@ -1989,6 +2035,8 @@ class BLEMonitorBinarySensorEntityDescription( 'MS1BB(MI)' : 'Linptech', 'HS1BB(MI)' : 'Linptech', 'PS1BB' : 'Linptech', + 'KS1' : 'Linptech', + 'KS1BP' : 'Linptech', 'XMWXKG01YL' : 'Xiaomi', 'XMWXKG01LM' : 'Xiaomi', 'PTX' : 'Xiaomi', diff --git a/custom_components/ble_monitor/sensor.py b/custom_components/ble_monitor/sensor.py index fcf1bd18..1b0b13ad 100644 --- a/custom_components/ble_monitor/sensor.py +++ b/custom_components/ble_monitor/sensor.py @@ -395,6 +395,10 @@ class BaseSensor(RestoreSensor, SensorEntity): # | | |**three btn switch left # | | |**three btn switch middle # | | |**three btn switch right + # | | |**four btn switch 1 + # | | |**four btn switch 2 + # | | |**four btn switch 3 + # | | |**four btn switch 4 # | |--BaseRemoteSensor (Class) # | | |**remote # | | |**fan remote diff --git a/docs/_devices/Linptech_KS1.md b/docs/_devices/Linptech_KS1.md new file mode 100644 index 00000000..97673a65 --- /dev/null +++ b/docs/_devices/Linptech_KS1.md @@ -0,0 +1,30 @@ +--- +manufacturer: Linptech +name: Smart Wireless Switch KS1 +model: KS1 +image: Linptech_KS1.png +physical_description: +broadcasted_properties: + - four btn switch 1 + - four btn switch 2 + - four btn switch 3 + - four btn switch 4 + - battery + - rssi +broadcasted_property_notes: + - property: four btn switch 1 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 2 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 3 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 4 + note: returns 'short press', 'double press' or 'long press' +broadcast_rate: +active_scan: +encryption_key: Probably (not confirmed yet) +custom_firmware: +notes: + - There are two different versions of this switch, without temperature/humidity (KS1) and with temperature/humidity (KS1). + - The switch sensor state will return to `no press` after the time set with the [reset_timer](configuration_params#reset_timer) option. It is advised to change the reset time to 1 second (default = 35 seconds). +--- diff --git a/docs/_devices/Linptech_KS1BP.md b/docs/_devices/Linptech_KS1BP.md new file mode 100644 index 00000000..04d60349 --- /dev/null +++ b/docs/_devices/Linptech_KS1BP.md @@ -0,0 +1,32 @@ +--- +manufacturer: Linptech +name: Smart Wireless Switch KS1 Pro +model: KS1BP +image: Linptech_KS1BP.png +physical_description: +broadcasted_properties: + - temperature + - humidity + - four btn switch 1 + - four btn switch 2 + - four btn switch 3 + - four btn switch 4 + - battery + - rssi +broadcasted_property_notes: + - property: four btn switch 1 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 2 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 3 + note: returns 'short press', 'double press' or 'long press' + - property: four btn switch 4 + note: returns 'short press', 'double press' or 'long press' +broadcast_rate: +active_scan: +encryption_key: Probably (not confirmed yet) +custom_firmware: +notes: + - There are two different versions of this switch, without temperature/humidity (KS1) and with temperature/humidity (KS1BP). + - The switch sensor state will return to `no press` after the time set with the [reset_timer](configuration_params#reset_timer) option. It is advised to change the reset time to 1 second (default = 35 seconds). +--- diff --git a/docs/assets/images/Linptech_KS1.png b/docs/assets/images/Linptech_KS1.png new file mode 100644 index 0000000000000000000000000000000000000000..986e47b4414d5119ef836909fa9c04368824c6cb GIT binary patch literal 9144 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 op71iNY3W%`(2QkJe*Z=?k literal 0 HcmV?d00001 diff --git a/docs/assets/images/Linptech_KS1BP.png b/docs/assets/images/Linptech_KS1BP.png new file mode 100644 index 0000000000000000000000000000000000000000..9d356d9a627ad8ae199fc193c57678656eac220b GIT binary patch literal 13301 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 literal 0 HcmV?d00001