pax_global_header00006660000000000000000000000064145577406360014533gustar00rootroot0000000000000052 comment=8aaf60d6f6ec49d1725702109736d5a0e97d84c9 danielperna84-pyhomematic-8aaf60d/000077500000000000000000000000001455774063600172015ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/.github/000077500000000000000000000000001455774063600205415ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/.github/CONTRIBUTING.md000066400000000000000000000010321455774063600227660ustar00rootroot00000000000000# Contributing to pyhomematic If there is anything you want to see in pyhomematic (features, bugfixes etc.), you can fork this repository, make your changes and then create a pull request (against the devel-branch). Just like with most of the other repositories here. Please restrict your changes to the actual code within the pyhomematic-folder. The repository-maintainers are keeping track of changes and will updated the changelog and setup.py. If you can't do it yourself, feel free to create an issue and we'll have a look at it. danielperna84-pyhomematic-8aaf60d/.github/ISSUE_TEMPLATE/000077500000000000000000000000001455774063600227245ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000004111455774063600254120ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve --- The old integration based on pyhomematic is being deprecated. Please switch to the [new integration](https://github.com/danielperna84/custom_homematic), currently available as a custom component. danielperna84-pyhomematic-8aaf60d/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000004141455774063600264500ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project --- The old integration based on pyhomematic is being deprecated. Please switch to the [new integration](https://github.com/danielperna84/custom_homematic), currently available as a custom component. danielperna84-pyhomematic-8aaf60d/.gitignore000066400000000000000000000003321455774063600211670ustar00rootroot00000000000000MANIFEST .idea /.vscode/ Compiled python modules. *.pyc # Setuptools distribution folder. /dist/ # Python egg metadata, regenerated from source files by setuptools. /*.egg-info # Tox stuff, lint /.tox/ /.pylint.d/danielperna84-pyhomematic-8aaf60d/.travis.yml000066400000000000000000000004361455774063600213150ustar00rootroot00000000000000sudo: false matrix: fast_finish: true include: - python: "3.6" env: TOXENV=pyhomematic - python: "3.6" env: TOXENV=lint - python: "3.7" env: TOXENV=lint - python: "3.8" env: TOXENV=lint install: pip install -U tox language: python script: toxdanielperna84-pyhomematic-8aaf60d/LICENSE.txt000066400000000000000000000020611455774063600210230ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Daniel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. danielperna84-pyhomematic-8aaf60d/MANIFEST.in000066400000000000000000000002351455774063600207370ustar00rootroot00000000000000include README.rst include LICENSE.txt include pyhomematic/devicetypes/json/device_descriptions.json include pyhomematic/devicetypes/json/device_details.jsondanielperna84-pyhomematic-8aaf60d/PULL_REQUEST_TEMPLATE.md000066400000000000000000000010461455774063600230030ustar00rootroot00000000000000Please point your pull request at the __devel__ branch. Also provide some information about the changes. This pull request: - fixes issue: \ - adds support for HomeMatic device: \ - New class: \ - Home Assistant [platform](https://github.com/home-assistant/home-assistant/blob/0da3e737651a150c17016f43b5f9144deff7ddd7/homeassistant/components/homematic/__init__.py#L65): \ - does the following: \ danielperna84-pyhomematic-8aaf60d/README.rst000066400000000000000000000123071455774063600206730ustar00rootroot00000000000000Deprecation warning =================== This project is being deprecated in favour of the new integration (https://github.com/danielperna84/custom_homematic) based on hahomematic (https://github.com/danielperna84/hahomematic). If you are a user of the RaspberryMatic add-on, please follow these very detailed instructions to install the new integration as a custom component: https://github.com/jens-maus/RaspberryMatic/wiki/HomeAssistant-Integration Less detailed instructions also suitable for other installation types: https://github.com/danielperna84/custom_homematic/wiki/Installation Essentially the process is the same. When using a real CCU or RaspberryMatic Home Assistants auto-discovery may already detect your hub-device and you only have to provide credentials. If you encounter problems with the new integration, please report them in the hahomematic repository. If you add a new device to your CCU and don't see the name you have set reflected in Home Assistant, please follow these instructions: https://github.com/danielperna84/hahomematic/wiki/Howto's Other interesting information can be found here: https://github.com/danielperna84/hahomematic/tree/devel/docs pyhomematic =========== .. image:: https://travis-ci.org/danielperna84/pyhomematic.svg?branch=master :target: https://travis-ci.org/danielperna84/pyhomematic Python 3 Interface to interact with Homematic devices. Important: This project will be deprecated in favor of https://github.com/danielperna84/hahomematic at some point in the future. A custom component to work with hahomematic can be found here: https://github.com/danielperna84/custom_homematic. Feel free to contribute! This library provides easy (bi-directional) control of Homematic devices hooked up to a regular CCU or Homegear. The focus is to be able to receive events. If you are only interested in actively controlling devices, you can use the Python-built-in xmlrpc.client.ServerProxy (Python 3). See pyhomematic._server.ServerThread.connect on how to connect to a CCU / Homegear as a client. Included is a XML-RPC server to receive events emitted by devices. Multiple callback functions can be set for devices to handle events. You can choose to bequeath callbacks from devices to their channels or not. Channels can not bequeath to their parent devices. You can also pass a callback funtion when creating the server, which then will (additionally) receive all events emitted by any paired device. You may specify a devicefile (JSON) to store known devices. This might speed up startup a bit. If you don't, paired devices will always be propagated upon startup. If devices get paired while the server is running, they should be automatically detected and usable. To get notified about such events, it is possible to pass a systemcallback(source, *args)-function while creating the server. Compatibility currently is only given for Python 3, since this library is primarily intended to add Homematic to https://home-assistant.io/, wich is written in Python 3. As of now, usage is as follows (you could leave away the listening and remote addresses when everything is running on one machine): >>> def syscb(src, *args): >>> print(src) >>> for arg in args: >>> print(arg) >>> def cb1(address, interface_id, key, value): >>> print("CALLBACK WITH CHANNELS: %s, %s, %s, %s" % (address, interface_id, key, value)) >>> def cb2(address, interface_id, key, value): >>> print("CALLBACK WITHOUT CHANNELS: %s, %s, %s, %s" % (address, interface_id, key, value)) >>> from pyhomematic import HMConnection >>> pyhomematic = HMConnection(local="192.168.1.12", localport=7080, remote="192.168.1.23", remoteport=2001, systemcallback=syscb) # Create server thread >>> pyhomematic.start() # Start server thread, connect to homegear, initialize to receive events >>> pyhomematic.devices['address_of_rollershutter_device'].move_down() # Move rollershutter down >>> pyhomematic.devices_all['address_of_doorcontact:1'].getValue("STATE") # True or False, depending on state >>> pyhomematic.devices['address_of_doorcontact'].setEventCallback(cb1) # Add first callback >>> pyhomematic.devices['address_of_doorcontact'].setEventCallback(cb2, bequeath=False) # Add second callback >>> pyhomematic.stop() # Shutdown to finish the server thread and quit This example connects to the Homegear-server running on the same machine, closes the window shutter using the rollershutter device, queries the state of a door contact, adds callbacks for the door contact, then stops the server thread because a sample doesn't need to do more. The server has to be stopped because otherwise Python might hang. An example.py can be found at https://github.com/danielperna84/pyhomematic Theoretically all Homematic devices will be automatically detected and directly provide the getValue and setValue methods needed to perform any action. Additionally, implemented devices provide convenience-properties and methods to perform certain tasks. For more information visit the Wiki: https://github.com/danielperna84/pyhomematic/wiki If pyhomematic doesn't seem to be what you need to interact with your CCU, then https://github.com/LarsMichelsen/pmatic might be (if Homegear support is not required). danielperna84-pyhomematic-8aaf60d/changelog.txt000066400000000000000000000422151455774063600216750ustar00rootroot00000000000000Version 0.1.78 (2024-02-04) - Add support for HmIP-SWDM-2 @ranasenR - Add support for HmIP-BROLL-2 @waldling - Add support for HmIPW-WRC2 @derco0n - Add support for Nurtic-Vibe @Nurtic-Vibe - Add support for HmIP-PSM-2 @l-mb - Add warning for missing device support Version 0.1.77 (2022-01-10) - Add HmIP-WRCR @danielperna84 - Add HmIP-SMI55-2 @hzpz - Add HB-RC-12-EP-C @danielperna84 - Add HmIP-SMO-2 (Issue #453) @danielperna84 - Add Sensors for HmIP-SPI @danielperna84 - Add HmIPW-SMI55 & HmIPW-WRC6 (Issue #452) @danielperna84 - Reduce loglevel for events Version 0.1.76 (2021-10-20) - Add HmIP-WHS2 @wutr - Add HmIP-eTRV-E @emufan Version 0.1.75 (2021-10-03) - Reduce some log levels - Add RSSI for HmIP-DRSI1 (Issue #428) @emufan - Add support for HM-Sec-SD-2-Team @anyc - Add sabotage for HmIP-SMI @emufan - Add HmIP-DLD as sensor (#394) @danielperna84 Version 0.1.74 (2021-08-13) - HmIP-WGC @mwagner - HmIP-SCTH230 @macrojames - HmIP-DRDI3 @gbotti - HmIP-MOD-RC8 @maedball - HmIP-USBSM @maedball - HmIP-BWTH add switching state for heating valve @sVnsation - HmIPW-DRI32 + HmIPW-DRI16 fix button mode @GagaPete Version 0.1.73 (2021-06-06) - Add support for HmIPW-FALMOT-C12 @Knechtie - Fix HmIP-STHD and HmIP-STH @yschroeder - Add tilt-support for shutters @Knechtie - Add support vor HmIP-MIO16-PCB @Knechtie - Add HmIPW-STH @GagaPete - Fix HmIP-STE2-PCB @danielperna84 - Add port-offset 40000 (Issue #393) @danielperna84 - Minor thermostat improvement as provided by @neffs Version 0.1.72 (2021-03-14) - Disable TLS-check in JSON-RPC (Issue #372) @danielperna84 - Improve some HmIP-remotes @SukramJ - Support Bosch ETRVs @niecore - Support HmIP-eTRV-C-2 @klada - Fix press-events von HmIP devices @chiss158 - Support HB-WDS40-THP-O @SuperMasterPhoenix - Remove low_bat for HmIP-SRD @SujramJ - Support HmIP-HAP @dfigus - Add low_bat for HmIP-PCBS-BAT @danielperna84 - Support for HmIP-STE2-PCB @danielperna84 Version 0.1.71 (2021-01-01) - Improve naming of covers @weissm - Add support for HmIP-DRSI1 (Issue #353) @lukasriegel - Add support for HmIP-WRCC2 @Remko76 - Implement INHIBIT parameter @PH89 - Sensornode for HmIP blind actuators @rbloehm - Add HmIP-FALMOT-C12 (Issue #367) @danielperna84 - Add HmIP-SRD (Issue #347) @danielperna84 - Set loglevel for getValue to Info + cleanup @danielperna84 Version 0.1.70 (2020-10-03) - Remove toplevel tests (Issue #334) @onkelbeh Version 0.1.69 (2020-10-01) - Support for HmIP-PCBS2 + HmIP-FSI16 @leinich - Support for HB-LC-Sw2PBU-FM @oechslein - Add lowbat for KeyMatic @trilu2000 - Support for HmIP-ASIR @stefangries - Improved HmIPW-FIO6 @p0l0 Version 0.1.68 (2020-08-04) - Support rx_mode @rusitschka - HomeMatic IP stability @weissm - Add Sensor-Node for HmIP-Covers @danielperna84 - Add support for HmIPW devices @p0l0 - Add support for HB-UNI-RGB-LED-CTR @lukasriegel Version 0.1.67 (2020-05-14) - Refactoring @danielperna84 - Add support for HmIP-SWDO-PL @rgriebl - Add buttons for HmIP-SMI55 @angelnu - Add support for HmIP-DSD-PCB @Ahrak - Add support for HmIPW-DRS4, HmIPW-DRS8, HmIPW-DRI32, HmIPW-DRI16 @henningweiler - Add support for HmIP-DBB, HB-UNI-Sen-WEA @danielperna84 Version 0.1.66 (2020-04-17) - Add support for HmIP-DRSI4 @danielperna84 - Add support for HmIP-PMFS @k-laus - Add support for HmIP-WRCD @macrojames - Fix attribute errors @macrojames - Fix HmIP Thermostats @pg5 Version 0.1.65 (2020-02-20) - Add support for HmIP-DRBLI4 @danielperna84 - Add support for HmIP-WTH-B @srehlig - Change LOWBAT attributes @flexkra - Fix for HmIP thermostats and smoke detectors @hanzoh - Fix HMW-Sen-SC-12-DR @dk1305hb Version 0.1.64 (2020-02-02) - Add support for HmIP-MOD-OC8 @danielperna84 - Add support for HM-LC-DW-WM @angelnu Version 0.1.63 (2020-01-08) - Add support for HM-DW-WM @stealth20 - Add WINDOW_STATE support for IP thermostats @dtretyakov - Add support for HmIP-MOD-HO @Nico0302 - Add support for HB-UNI-Sen-TEMP-DS18B20 @oechslein - Add support for HmIP-FCI1 and HmIP-FCI6 @macrojames Version 0.1.62 (2019-12-04) - Remove `LOWBAT` for some devices (#230) @danielperna84 - Add battery reporting for `HMIP-WRC2` @pg5 - Add output-support for `HMW-IO-12-FM` (#269) @Lokla - Add action-nodes for `HmIP-BWTH`, `HmIP-BWTH24` (#270) @dickesW Version 0.1.61 (2019-10-13) - Fix device storage @danielperna84 - Add battery attribute for BC-PB-2-WM @danielperna84 - Improve HmIP-helper classes, Issue #240 @danielperna84 - Add Light-support for HmIP-BSL (Issue #255) @guillempages - Add support for HmIP-RCV-50 (Issue #262) @danielperna84 Version 0.1.60 (2019-07-15) - Added support for HmIP-PCBS-BAT (Issue #235) @danielperna84 - Fix LOWBAT warning for some devices (Issue #230) @danielperna84, @klada - Add support for HB-UNI-Sensor1 @oechslein - Add support for HmIP-SCI @SukramJ Version 0.1.59 (2019-05-13) - Added classes for battery operated remotes @sander76 - Added HmIP eTRV-C @danielperna84 Version 0.1.58 (2019-03-12) - KeyMatic, add LOWBAT, move STATE_UNCERTAIN & ERROR to attributes (Issue #229) @danielperna84 - Remove LOWBAT for specific motion detectors & Thermostats (Issue #230) @danielperna84 - Remove SABOTAGE from some HmIP shutter contacts (Issue #230) @danielperna84 - Added support for HmIP-BWTH24 @TimJuni Version 0.1.57 (2019-03-02) - Fix/add support for HmIP-WTH & HmIP-WTH-2 (Issue #223) @DieterChmod - Add support for HM-Sec-SFA-SM @danielperna84 Version 0.1.56 (2019-02-19) - Remove SABOTAGE from HmIP-SMO(-A) (Issue #212) @danielperna84 - Fix resolving names with JSON with SSL @danielperna84 - Added PRESS_* events to IP Powermeter switches @dagobert - Added OPERATING_VOLTAGE to some IP devices @dagobert - Fix LOWBAT-Helper for IP shutter contact @dagobert - Code cleanup @dagobert, @danielperna84 Version 0.1.55 (2019-01-24) - Add support for HmIP-MIOB @danielperna84 - Add support for HmIP-BSL @danielperna84 - Add support for HmIP-SWD @danielperna84 - Add support for HmIP-BRC2 @hg8496 - Add support for HmIP-KRC4 @l-mb - Add support for HmIP-SWDM-B2 @haggybear - Add support for multiple variants of existing devices for other regions @danielperna84 Version 0.1.54 (2018-12-30) - Set SABOTAGE helper for HmIP devices to channel 0 @rgriebl - Fix log-message for callbacks @danielperna84 - Add support for HmIP-FBL @Alex-ala - Add support for HmIP-SWDM @leoMehlig - Add support for HmIP-SMI55 @janbrummer Version 0.1.53 (2018-12-05) - Changed loglevel for getValue to `warning` (Issue #153) @danielperna84 - Channel for LOW_BAT always is 0 for HmIP devices (Issue #186) @danielperna84 - Support hostnames for XML-RPC endpoints @danielperna84 - Add support for HmIP-eTRV-B @SiwYv - Added support for HmIP-FDT @DieterChmod - Added support for HB-UW-Sen-THPL-O and HB-UW-Sen-THPL-I @rgriebl - Add support for SSL and authentication with CCU3 @danielperna84 - Added support for HmIP-B1 @jberrenberg Version 0.1.52 (2018-11-15) - Added HmIP-MOD-TM (Issue #170) @danielperna84 - Added HM-LC-RGBW-WM @chr1st1ank - Added caching of parameters received by events @chr1st1ank - Added HmIP-PCBS (Issue #178) @danielperna84 - Fix HM-CC-TC obsolete battery (Issue #183) @danielperna84 - Added HmIP-PDT (Issue #181) @danielperna84 Version 0.1.51 (2018-10-14) - Added device_descriptions.json to distributed package to allow performing tests with vccu - Add valve level to IP Thermostat attributes @hanzoh - Added HmIP-SLO @noxhirsch Version 0.1.50 (2018-10-01) - Added Support for HmIP-FROLL @jplck - Added missing channel for HM-LC-Dim2T @danielperna84 - Added ping-method for HMConnection object @danielperna84 Version 0.1.49 (2018-09-16) - Rework RSSI handling (Issue #164, Issue #121) @klada - Prevent failure of everything when single host is down (Issue #162) Version 0.1.48 (2018-09-13) - Added Support for HmIP-SWO-PL and HmIP-SWO-B @dickesW - Fix callbacks for channel 0 @klada Version 0.1.47 (2018-08-20) - Fix HmIP-BWTH (Issue #151) @danielperna84 - Added HmIP-KRCA @danielperna84 - Fix RSSI reporting (Issue #155) @klada Version 0.1.46 (2018-07-21) - Added PRESS event for HmIP-BSM @ToSa27 - Added Smartware Motion Detector @maxm87 - Fix PRESS* events for HM-RCV-50 @danielperna84 - Added putParamset-method to HMConnection (Issue #139) @danielperna84 - Added HmIP-HEATING groups (Issue #140) @danielperna84 Version 0.1.45 (2018-07-11) - Fix variables (Issue #146) @danielperna84 - Added HmIP-SPDR @danielperna84 Version 0.1.44 (2018-06-20) - Added HM-Sen-MDIR-O-3 @danielperna84 - Allow custom port for JSON-RPC @hanzoh - Switched HM-CC-TC to LOWBAT parameter (Issue #102) @danielperna84 Version 0.1.43 (2018-05-22) - Improved HmIP-SRH implementation @hanzoh Version 0.1.42 (2018-04-26) - Added HmIP-FSM16 @emkay82 Version 0.1.41 (2018-04-10) - Added HmIP-SWDO-I @smoldaner - Added HmIP-SWO-PR @pascalhahn Version 0.1.40 (2018-03-20) - Added HmIP-SMO-A @danielperna84 - Added HmIP-STHO(-A) @danielperna84 - Added HmIP-SAM @danielperna84 - Added HmIP-STH @smoldaner Version 0.1.39 (2018-02-09) - Fixed exception when "resolvenames" not set @danielperna84 - Cleaning up JSON as workaround for CCU bug @danielperna84 - Added virtual CCU and some tests @danielperna84 - Added HmIP-SRH @pascalhahn - Added HM-LC-Dim1T-Pl-2 @krawadl Version 0.1.38 (2018-01-26) - KeyMatic improvements @PH89 - Fix skipping remotes @danielperna84 - Added lowercase variants for some IP-devices (Issue #110) @danielperna84 Version 0.1.37 (2018-01-11) - Allow skipping remotes @pvizeli - Fix HmIP-dTRV-2 @daenny - Added HMIP-WC6 @rexyiy - Added HmIP-BBL @steffenslavetinsky - Added REV-Ritter-Switch @widder - Added HmIP-BROLL @steffenslavetinsky - Added tilt-support @steffenslavetinsky - Added HmIP-SMO @mcdeck Version 0.1.36 (2017-12-15) - Added HMIP-WTH @ch-world - Added HmIP-BWTH @gethash Version 0.1.35 (2017-11-27) - Added HM-Dis-EP-WM55 @marconfus - Added HM-Sec-Sir-WM @danielperna84 - Added HmIP-SPI @danielperna84 Version 0.1.34 (2017-10-19) - Fixed HMIP-PSM @Munsio - Added HmIP-RC8 @gesslein Version 0.1.33 (2017-10-05) - Added HM-PB-4Dis-WM-2 @gomez - Added support for HM-CC-VG-1 Groups @danielperna84 - Added HM-LC-Dim1T-DR @LeonVos - Added IT-Switch (1 Channel Intertechno Switch via Homegear) @danielperna84 Version 0.1.32 (2017-09-19) - Added HMIP-WRC2 @danielperna84 Version 0.1.31 (2017-09-19) - HmIP-PSM-CH @peterrothert - Added HmIP-eTRV-2, HmIP-STHD, HmIP-SWSD @danielperna84 Version 0.1.30 (2017-07-27) - Added HM-LC-Sw1-PCB @cgeidt - Added support for HmIP-FSM and HmIP-BSM @Munsio - Added FRQUENCY parameter for some pwermeters @buxit Version 0.1.29 (2017-07-13) - Fixed BC-PB-2-WM @tseel - Added HMIP-STHD @ch-world - Added HM-LC-Ja1PBU-FM @danielperna84 Version 0.1.28 (2017-06-07) - Fixed HMIP-BDT @danielperna84 Version 0.1.27 (2017-05-26) - Setting backend to unkonwn in case of exception - Disabled backend detection Version 0.1.26 (2017-05-17) - KeyMatic fixes @danielperna84 - Detecting CCU or Homegear backend @danielperna84 - Fixed de-init on server stop @danielperna84 - Added homegearCheckInit method @danielperna84 - Added BC-TC-C-WM-2 as MAX! Wall Thermostat @danielperna84 Version 0.1.25 (2017-04-25) - Added HM-Sen-RD-O + HM-Sen-Wa-Od @danielperna84 - Fixed HMW-IO-* events, added HM-OU-LED16 & HM-PB-4Dis-WM events @danielperna84 - Added HM-Sec-Win as blind @danielperna84 - Added HMW-Sen-SC-12-FM & HMW-Sen-SC-12-DR @danielperna84 - Added HM-CC-VD as sensor @danielperna84 - Added ST6-SH @danielperna84 - Added HMIP-BDT @danielperna84 Version 0.1.24 (2017-03-25) - Fix Eco- and Comfort mode for HM-TC-IT-WM-W-EU (Issue #65) @danielperna84 Version 0.1.23 (2017-03-24) - Added missing thermostat control modes @danielperna84 - Fix for HMW-LC-Dim1L-DR @danielperna84 Version 0.1.22 (2017-02-14) - Added support for HMIP-eTRV (Homematic IP Thermostat) @braindump - Added support for BC-RT-TRX-CyN @ch-world - Added support for per-remote-callback-definitions @danielperna84 Version 0.1.21 (2017-02-01) - Fixed setting bool-variable values via JSON-RPC @danielperna84 Version 0.1.20 (2017-01-22) - Fix for HMW-IO-12-Sw14-DR @danielperna84 - Better handling of empty nodeLists @danielperna84 - RSSI_DEVICE helper for wired devices @danielperna84 - Fix for HMW-LC-Bl1-DR @danielperna84 - Fix for MAX! devices @jannau - Added support for BC-SC-Rd-WM and BC-PB-2-WM @tringler Version 0.1.19 (2017-01-13) - Added support for HMW-IO-12-Sw14-DR (Issue #38) @danielperna84 - Added support for MAX! devices (BC-SC-Rd-WM-2, BC-TC-C-WM-4) @jannau - Fixed MAX wall Thermostat @cyclingengineer - Added support for HmIP-SMI @legien Version 0.1.18 (2016-11-29) - Fixed KeyMatic Bug @pvizeli (Issue #45) - Bugfix for failure when stopping server thread @danielperna84 - Other minor fixes @pvizeli @danielperna84 Version 0.1.17 (2016-11-24) - Fixed HmIP Switches @danielperna84 (Issue #37) - New options to initialize pyhomematic to support multiple XML-RPC backends @danielperna84 - Code cleanup and reconnect-method for HMConnection-object @pvizeli Version 0.1.16 (2016-10-03) - Bugfix for RSSI @pvizeli Version 0.1.15 (2016-10-03) - ELEMENT-property now returns list of channels instead of int for better device support - Added support for all wired devices, HMW-IO-12-Sw14-DR partially @danielperna84 (Issue #38) - Added support IP devices @pvizeli (Issue #37) - Bugfixes - Local IP and port are now optional parameters @danielperna84 (Issue #41) - Added further RF devices @danielperna84 (Issue #28) Version 0.1.14 (2016-09-13) - Bugfix for Thermostats @pvizeli Version 0.1.13 (2016-08-24) - Added WeatherSensor (HM-WDS100-C6-O and compatible) @mcdeck - Added HM-PB-2-FM @danielperna84 - Added delete/set/getMetadata methods (Issue #15) @danielperna84 - Added listBidcosInterfaces method @danielperna84 - Added weather stations (WS550 and compatible) @danielperna84 - Added tilt-sensor HM-Sec-TiS @danielperna84 - Added Chimes (HM-OU-CM-PCB etc.) @danielperna84 - Added some other HA-compatible devices (switches, blinds) @danielperna84 - Added CO2 Sensor HM-CC-SCD @danielperna84 - Added temperature sensors @danielperna84 Version 0.1.12 (2016-08-19) - Added getServiceMessages, rssiInfo, get/setInstallMode @danielperna84 - Clearing dicts when stopping server @pvizeli Version 0.1.11 (2016-08-09) - Allow system-variable modification via _server-attribute @danielperna84 - Added wrapper for system-variable modification @pvizeli - Added support for HM-LC-Sw1PBU-FM and HM-PBI-4-FM @danielperna84 Version 0.1.10 (2016-07-20) - Bugfix and stability @pvizeli Version 0.1.9 (2016-07-13) - Fix LOWBAT for MAX! Thermostats @bimbar - Added support vor HM-RCV-50 (50 virtual buttons of CCU) @pvizeli - Added support for HM-ES-TX-WM @pvizeli - Added support for HM-Sen-LI-O, HM-Sen-EP, HM-Sen-X @pvizeli Version 0.1.8 (2016-06-29) - PRESS_CONT instead of PRESS_LONG_CONT Version 0.1.7 (2016-06-29) - resolvenames=True now doesn't set resolveparamsets=True anymore - Added support for water detector like HM-Sec-WDS by @pvizeli - Added PRESS_LONG_CONT and PRESS_LONG_RELEASE for sensors (Issue #23) - Added JSON-RPC to fetch device names from CUU (Issue #29) Version 0.1.6 (2016-06-23) - Added support for lots of devices @pvizeli - New metadata design @pvizeli Version 0.1.5 (2016-06-21) - (Hopefully) Finished restructuring by @pvizeli Version 0.1.4 (2016-06-19) - Further restructuring and improvements by @pvizeli making devices much more modular Version 0.1.3 (2016-06-14) - Major restructuring by @pvizeli for smoother HA integration Version 0.1.2 (2016-06-11) - Added *args and **kwargs to __init__.start + stop because latter gets called with argument by home-assistant Version 0.1.1 (2016-05-19) - Switched to setuptools for packaging because files were missing in 0.1.0 release Version 0.1.0 (2016-05-19) - Added device-support (other IDs for existing implementations with identical hardware) - Minor code improvements - Added working-property for rollershutters - Added support for remote HM-RC-8 - Not getting paramsets by default - Resolving names from metadata if available (Issue #15) - Renamed HMDoorContact to HMShutterContact (official name) - Added support for powermeter-switches like HM-ES-PMSw1-Pl - Restructured devices Version 0.0.9 (2016-05-03) - _server.RPCFunctions.createDeviceObjects and listDevices uses systemcallbacks - Thermostats differentiate between set temperature and actual temperature @bimbar - Added MAX! thermostat support (BC-RT-TRX-CyG, BC-RT-TRX-CyG-2, BC-RT-TRX-CyG-3, BC-RT-TRX-CyG-4) @bimbar - Locking the Proxy-Object to circumvent threading issues (Issue #13) Version 0.0.8 (2016-04-10) - Added working-flag (pyhomematic._server.working) @jazzaj - Added option to resolve devicenames if XML-API is installed on CCU (initially device-address) @jazzaj Version 0.0.7 (2016-04-09) - Intermediate version for PyPi Version 0.0.6 (2016-04-09) - Fixed missing _proxy in device-objects (Issue #4) - Renamed package to pyhomematic to avoid conflicts (Issue #5) - Added 'UNREACH' state for devices (Issue #8) @jazzaj - Added devices HM-LC-Bl1PBU-FM, HM-LC-Dim1L-Pl-3, HM-LC-Sw1-Pl-2 @jazzaj Version 0.0.5 (2016-03-04) - Extended example.py and updated README.rst to reflect changes in module - Added systemcallback support in _server.py - Cleaned up and restructured code - Easier to use - Minor fixes Version 0.0.4 (2016-03-03) - Fixed incorrect reporting of open / closed state for HM-Sec-SC-2 - Added _devices.HMDevice.setEventCallback method for devices - _server.RPCFunctions.event now uses full signature for callbacks - Extended example.py and updated README.rst Version < 0.0.4 - Everything else until 0.0.4 danielperna84-pyhomematic-8aaf60d/datapoints.py000066400000000000000000000046241455774063600217270ustar00rootroot00000000000000#!/usr/bin/python3 import sys import pprint import random import json import xmlrpc.client """ Use this script to fetch the datapoints of the devices paired with your CCU. Depending on the specified port different devices will be presented: 2000 -> BidCos-Wired 2001 -> BidCos-RF 2010 -> HmIP-RF Availability of these ports may depend on the CCU version, and as of now, Homegear has no HmIP support. To use this script (on Linux with Python 3 installed) place it on the machines filesystem, mark it executable (chmod 755 datapoints.py), and execute like this: /path/to/file/datapoints.py http://ccu.ip.addr.ess:2001 This will print out all available details of your devices for you to analyze. If you want to provide this data to someone else, append a filename (devices.json) to the command above. The raw JSON that's being saved isn't pretty to read, but can be imported and read by capable applications. Device-IDs, addresses etc. are being anonymized. So posting the results of this script online shouldn't be an issue since no private data is leaked (unless I forgot to overwrite something critical). Note: this is a quick-and-dirty script with minor testing and no validation of provided parameters. So as always, use at your own risk. """ args = sys.argv[1:] if not args: print("Usage: ./datapoints.py http://ccu.ip.addr.ess:2001 [outfile.json]") sys.exit(1) ccu = args[0] if len(args) > 1: outfile = args[1] else: outfile = False proxy = xmlrpc.client.ServerProxy(ccu) devices = proxy.listDevices() for device in devices: paramsets = {} for i in range(len(device['PARAMSETS'])): try: paramsets[device['PARAMSETS'][i]] = proxy.getParamsetDescription(device['ADDRESS'], device['PARAMSETS'][i]) except Exception: pass if 'CHILDREN' in device: for i in range(len(device['CHILDREN'])): device['CHILDREN'][i] = device['CHILDREN'][i][-3:] device['ADDRESS'] = device['ADDRESS'][-3:] if 'PARENT' in device: device['PARENT'] = device['PARENT'][-3:] r = random.randint(0, 5000) if 'PHYSICAL_ADDRESS' in device: device['PHYSICAL_ADDRESS'] = device['PHYSICAL_ADDRESS'] + r if 'RF_ADDRESS' in device: device['RF_ADDRESS'] = device['RF_ADDRESS'] + r device['PARAMSETS'] = paramsets if not outfile: pprint.pprint(devices) else: with open(outfile, 'w') as f: f.write(json.dumps(devices)) sys.exit(0) danielperna84-pyhomematic-8aaf60d/example.py000066400000000000000000000050261455774063600212110ustar00rootroot00000000000000#!/usr/bin/python3 import time import sys import logging from pyhomematic import HMConnection logging.basicConfig(level=logging.INFO) DEVICE1 = 'address_of_rollershutter_device' # e.g. KEQ7654321 DEVICE2 = 'address_of_doorcontact' # e.g. LEQ1234567 DEVICE3 = 'address_of_thermostat' def systemcallback(src, *args): print(src) for arg in args: print(arg) try: # Create a server that listens on 127.0.0.1:7080 and identifies itself as myserver. # Connect to Homegear at 127.0.0.1:2001 # Automatically start everything. Without autostart, pyhomematic.start() can be called. # We add a systemcallback so we can see what else happens besides the regular events. pyhomematic = HMConnection(interface_id="myserver", autostart=True, systemcallback=systemcallback, remotes={"rf":{ "ip":"127.0.0.1", "port": 2001}}) except Exception: sys.exit(1) sleepcounter = 0 def eventcallback(address, interface_id, key, value): print("CALLBACK: %s, %s, %s, %s" % (address, interface_id, key, value)) while not pyhomematic.devices and sleepcounter < 20: print("Waiting for devices") sleepcounter += 1 time.sleep(1) print(pyhomematic.devices) # Get level of rollershutter from 0.0 to 1.0. print(pyhomematic.devices[DEVICE1].get_level()) # Set level of rollershutter to 50%. pyhomematic.devices[DEVICE1].set_level(0.5) time.sleep(10) # Move rollershutter down. pyhomematic.devices[DEVICE1].move_down() time.sleep(10) # Get level of rollershutter from 0.0 to 1.0 directly from channel. print(pyhomematic.devices_all[DEVICE1 + ':1'].getValue("LEVEL")) # Check if doorcontact is open by querying the device. print(pyhomematic.devices[DEVICE2].is_open()) # Check if doorcontact is open or closed by querying the device-channel. True or False, depending on state. print(pyhomematic.devices_all[DEVICE2 + ':1'].getValue("STATE")) # Get Actual Temperature print(pyhomematic.devices[DEVICE3].actual_temperature) # Get Set Temperature print(pyhomematic.devices[DEVICE3].set_temperature) # Get Battery State print(pyhomematic.devices[DEVICE3].battery_state) # Set an eventcallback for the doorcontact that should be called when events occur. pyhomematic.devices[DEVICE2].setEventCallback(eventcallback) time.sleep(10) # Now open / close doorcontact and watch the eventcallback being called. # Stop the server thread so Python can exit properly. pyhomematic.stop() sys.exit(0) danielperna84-pyhomematic-8aaf60d/manual_test.py000066400000000000000000000165331455774063600220770ustar00rootroot00000000000000import time import sys import logging import click from pyhomematic import HMConnection from pyhomematic.devicetypes.actors import GenericSwitch from pyhomematic.devicetypes.helper import HelperLowBat, HelperSabotage, HelperWorking, HelperBatteryState, \ HelperValveState, HelperInhibit from pyhomematic.devicetypes.sensors import WeatherSensor, AreaThermostat, ShutterContact, Smoke, Motion, Remote from pyhomematic.devicetypes.thermostats import HMThermostat, IPThermostat def systemcallback(src, *args): print("##### SYSTEMCALLBACK #######") print(src) for arg in args: print(arg) print("############################") def eventcallback(address, interface_id, key, value): print("## CALLBACK: %s, %s, %s, %s ##" % (address, interface_id, key, value)) @click.command() @click.option("--local", "-l", default="0.0.0.0", help="Local address for server") @click.option("--localPort", "-lp", default=0, help="Local Port for server") @click.option("--remote", "-r", help="Remote address for CCU/homegear") @click.option("--remotePort", "-rp", default=2001, help="Remote port for CCU/homegear") @click.option("--address", "-a", help="Address of homematic device for tests") @click.option("--channel", "-c", default=None, help="Homematic device channel") @click.option("--state", "-s", default=1, help="Set STATE value for actors") @click.option("--toggle", "-to", is_flag=True, help="Set STATE is this activated") @click.option("--timer", "-t", default=30, help="Time in sec for waiting of events (debug)") @click.option("--debug", "-d", is_flag=True, help="Use DEBUG instead INFO for logger") @click.option("--user", "-u", default="Admin", help="Username") @click.option("--password", "-p", default="", help="Password") @click.option("--variable", "-v", default=None, help="Variable for set data") @click.option("--data", "-vd", default=None, help="Input data for variable") def cli(local, localport, remote, remoteport, address, channel, state, toggle, timer, debug, user, password, variable, data): # debug? if debug: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) try: # Connect to HM pyhomematic = HMConnection(interface_id="testpyhomatic", local=local, localport=localport, remote=remote, remoteport=remoteport, autostart=True, rpcusername=user, rpcpassword=password, systemcallback=systemcallback) except Exception: print("Can't init HMConnection!") sys.exit(1) sleepcounter = 0 while not pyhomematic.devices and sleepcounter < 20: print("Waiting for devices") sleepcounter += 1 time.sleep(1) print(pyhomematic.devices) # read system variables print("******************************") print("Read all: %s" % str(pyhomematic.getAllSystemVariables('default'))) if variable is not None: pyhomematic.setSystemVariable(variable, data) print("Read: %s" % str(pyhomematic.getSystemVariable(variable))) print("******************************") # need test a hm object? if address in pyhomematic.devices: device = pyhomematic.devices[address] print("******************************") print("* Show metadata from %s" % address) print("* Elements: %s / Childs: %i" % (device.ELEMENT, len(device.CHANNELS))) print("* Class: %s" % str(device.__class__)) print("* Base: %s" % str(device.__class__.__bases__)) print("* Sensor datapoint: %s" % str(device.SENSORNODE)) print("* Binary datapoint: %s" % str(device.BINARYNODE)) print("* Write datapoint: %s" % str(device.WRITENODE)) print("* Attribute datapoint: %s" % str(device.ATTRIBUTENODE)) print("* Event datapoint: %s" % str(device.EVENTNODE)) print("* Action datapoint: %s" % str(device.ACTIONNODE)) print("******************************") # WeatherSensor if isinstance(device, WeatherSensor): print(" / Temperature: %f" % device.get_temperature()) print(" / Humidity: %i" % device.get_humidity()) print(" / Rain Counter: %f" % device.get_rain_counter()) print(" / Wind Speed: %f" % device.get_wind_speed()) print(" / Wind Direction: %i" % device.get_wind_direction()) print(" / Wind Direction Range: %i" % device.get_wind_direction_range()) print(" / Sunshineduration: %i" % device.get_sunshineduration()) print(" / Brightness: %i" % device.get_brightness()) print(" / Is Raining: %s" % str(device.is_raining())) # AreaThermostat if isinstance(device, AreaThermostat): print(" / Temperature: %f" % device.get_temperature()) print(" / Humidity: %i" % device.get_humidity()) # ShutterContact if isinstance(device, ShutterContact): print(" / Contact open: %s" % str(device.is_open())) # Smoke if isinstance(device, Smoke): print(" / Smoke detect: %s" % str(device.is_smoke())) # Motion if isinstance(device, Motion): print(" / Motion detect: %s" % str(device.is_motion())) print(" / Brightness: %i" % device.get_brightness()) # Remote if isinstance(device, Remote): print(" / is a Remote") if toggle: print(" / Press short/long") device.press_long(channel) device.press_short(channel) # Switch if isinstance(device, GenericSwitch): print(" / Switch is on: %s" % str(device.is_on(channel))) if toggle: print(" / Changee state to: %s" % str(bool(state))) device.set_state(bool(state), channel) print(" / Switch is on: %s" % str(device.is_on(channel))) # Thermostat if isinstance(device, HMThermostat): print(" / Working mode: %i" % device.MODE) print(" / Target temperature: %.1f" % device.get_set_temperature()) print(" / Actual temperature: %.1f" % device.actual_temperature()) if isinstance(device, IPThermostat): print(" / Window is opened: %s" % str(bool(device.get_window_state()))) ########### Attribute ######### print(" / RSSI_PEER: %i" % device.get_rssi()) if isinstance(device, HelperLowBat): print(" / Low batter: %s" % str(device.low_batt())) if isinstance(device, HelperSabotage): print(" / Sabotage: %s" % str(device.sabotage())) if isinstance(device, HelperWorking): print(" / Working: %s" % str(device.is_working())) if isinstance(device, HelperInhibit): print(" / Inhibit: %s" % str(device.get_inhibit())) if isinstance(device, HelperValveState): print(" / Valve state: %i" % device.valve_state()) if isinstance(device, HelperBatteryState): print(" / Battery state: %f" % device.battery_state()) # do nothing for show & debug events print("Now waiting for events/callback") time.sleep(timer) # end pyhomematic.stop() if __name__ == "__main__": cli() danielperna84-pyhomematic-8aaf60d/pyhomematic/000077500000000000000000000000001455774063600215205ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/pyhomematic/__init__.py000066400000000000000000000000611455774063600236260ustar00rootroot00000000000000 from pyhomematic.connection import HMConnection danielperna84-pyhomematic-8aaf60d/pyhomematic/_hm.py000066400000000000000000001336331455774063600226460ustar00rootroot00000000000000import os import threading import json import ssl import urllib.request import urllib.parse import xml.etree.ElementTree as ET from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler import xmlrpc.client import socket #from socketserver import ThreadingMixIn import logging from pyhomematic import devicetypes from pyhomematic.devicetypes.generic import HMChannel LOG = logging.getLogger(__name__) # Constants LOCAL = '0.0.0.0' LOCALPORT = 0 DEFAULT_JSONPORT = 80 REMOTES = { 'default': { 'ip': '127.0.0.1', 'port': 2001, 'path': '', 'username': 'Admin', 'password': '', 'jsonport': DEFAULT_JSONPORT, 'resolvenames': False, 'connect': True, }} DEVICEFILE = None # e.g. devices_%s.json PARAMSETFILE = None # e.g. paramsets_%s.json INTERFACE_ID = 'pyhomematic' XML_API_URL = '/config/xmlapi/devicelist.cgi' JSONRPC_URL = '/api/homematic.cgi' BACKEND_UNKNOWN = 0 BACKEND_CCU = 1 BACKEND_HOMEGEAR = 2 WORKING = False # Device-storage devices = {} devices_all = {} devices_raw = {} devices_raw_dict = {} paramsets = {} def make_http_credentials(username=None, password=None): """Build auth part for api_url.""" credentials = '' if username is None: return credentials if username is not None: if ':' in username: return credentials credentials += username if credentials and password is not None: credentials += ":%s" % password return "%s@" % credentials def build_api_url(host=REMOTES['default']['ip'], port=REMOTES['default']['port'], path=REMOTES['default']['path'], username=None, password=None, ssl=False): """Build API URL from components.""" credentials = make_http_credentials(username, password) scheme = 'http' if not path: path = '' if path and not path.startswith('/'): path = "/%s" % path if ssl: scheme += 's' return "%s://%s%s:%i%s" % (scheme, credentials, host, port, path) # Object holding the methods the XML-RPC server should provide. class RPCFunctions(): def __init__(self, devicefile=DEVICEFILE, paramsetfile=PARAMSETFILE, proxies={}, remotes={}, eventcallback=False, systemcallback=False, resolveparamsets=False): global devices, devices_all, devices_raw, devices_raw_dict, paramsets LOG.debug("RPCFunctions.__init__") self.devicefile = None if devicefile is not None: if "%s" in devicefile: self.devicefile = devicefile else: LOG.warning("RPCFunctions.__init__: Invalid devicefile template") self.devicefile = None self.paramsetfile = None if paramsetfile is not None: if "%s" in paramsetfile: self.paramsetfile = paramsetfile else: LOG.warning("RPCFunctions.__init__: Invalid paramsetfile template") self.paramsetfile = None self.eventcallback = eventcallback self.systemcallback = systemcallback self.resolveparamsets = resolveparamsets self.remotes = remotes self._paramsets = paramsets # The methods need to know about the proxyies to be able to pass it on # to the device-objects self._proxies = proxies # Devices w/o channels will be accessible using the device-address as # the key self.devices = devices # Devices including channels will be accessible using the # device-address + channel as the key self.devices_all = devices_all # The plain JSON (actually dicts) are stored as well self._devices_raw_dict = devices_raw_dict self._devices_raw = devices_raw for interface_id in proxies: LOG.debug("RPCFunctions.__init__: iterating proxy = %s", interface_id) remote = interface_id.split('-')[-1] self.devices[remote] = {} self.devices_all[remote] = {} self._devices_raw[remote] = [] self._devices_raw_dict[remote] = {} self._paramsets[remote] = {} # If there are stored devices, we load them instead of getting them # from the server. if self.devicefile is not None: devicefilename = self.devicefile % remote LOG.debug("RPCFunctions.__init__: devicefile = %s", devicefilename) if os.path.isfile(devicefilename): with open(devicefilename, 'r') as fptr: fcontent = fptr.read() if fcontent: self._devices_raw[remote] = json.loads(fcontent) # Load stored paramsets if available if self.paramsetfile is not None: paramsetfilename = self.paramsetfile % remote LOG.debug("RPCFunctions.__init__: paramsetfile = %s", paramsetfilename) if os.path.isfile(paramsetfilename): with open(paramsetfilename, 'r') as fptr: fcontent = fptr.read() if fcontent: self._paramsets[remote] = json.loads(fcontent) # Continue if there are no stored devices if not self._devices_raw.get(remote): continue for device in self._devices_raw[remote]: self._devices_raw_dict[remote][device['ADDRESS']] = device LOG.debug("RPCFunctions.__init__: devices_raw = %s" % (str(self._devices_raw[remote]), )) # Create the "interactive" device-objects from cache and store # them in self._devices and self._devices_all self.createDeviceObjects(interface_id) def createDeviceObjects(self, interface_id): """Transform the raw device descriptions into instances of devicetypes.generic.HMDevice or availabe subclass.""" global WORKING WORKING = True remote = interface_id.split('-')[-1] LOG.debug( "RPCFunctions.createDeviceObjects: iterating interface_id = %s", remote) # First create parent object for dev in self._devices_raw[remote]: if not dev['PARENT']: if dev['ADDRESS'] not in self.devices_all[remote]: try: if dev['TYPE'] in devicetypes.SUPPORTED: deviceObject = devicetypes.SUPPORTED[dev['TYPE']]( dev, self._proxies[interface_id], self.resolveparamsets) LOG.debug("RPCFunctions.createDeviceObjects: created %s as SUPPORTED device for %s" % ( dev['ADDRESS'], dev['TYPE'])) else: deviceObject = devicetypes.UNSUPPORTED( dev, self._proxies[interface_id], self.resolveparamsets) LOG.warning("RPCFunctions.createDeviceObjects: Created %s as UNSUPPORTED device for %s. Please switch to https://github.com/danielperna84/custom_homematic to use this device in Home Assistant." % ( dev['ADDRESS'], dev['TYPE'])) LOG.debug( "RPCFunctions.createDeviceObjects: adding to self.devices_all") self.devices_all[remote][dev['ADDRESS']] = deviceObject LOG.debug( "RPCFunctions.createDeviceObjects: adding to self.devices") self.devices[remote][dev['ADDRESS']] = deviceObject except Exception as err: LOG.critical( "RPCFunctions.createDeviceObjects: Parent: %s", str(err)) # Then create all children for parent for dev in self._devices_raw[remote]: if dev['PARENT']: try: if dev['ADDRESS'] not in self.devices_all[remote]: deviceObject = HMChannel( dev, self._proxies[interface_id], self.resolveparamsets) self.devices_all[remote][dev['ADDRESS']] = deviceObject self.devices[remote][dev['PARENT']].CHANNELS[ dev['INDEX']] = deviceObject except Exception as err: LOG.critical( "RPCFunctions.createDeviceObjects: Child: %s", str(err)) if self.devices_all[remote] and self.remotes[remote].get('resolvenames', False): self.addDeviceNames(remote) WORKING = False if self.systemcallback: self.systemcallback('createDeviceObjects') return True def error(self, interface_id, errorcode, msg): """When some error occurs the CCU / Homegear will send it's error message here""" LOG.debug("RPCFunctions.error: interface_id = %s, errorcode = %i, message = %s", interface_id, int(errorcode), str(msg)) if self.systemcallback: self.systemcallback('error', interface_id, errorcode, msg) return True def saveDevices(self, remote): """We save known devices into a json-file so we don't have to work through the whole list of devices the CCU / Homegear presents us""" if self.devicefile is not None: devicefilename = self.devicefile % remote LOG.debug("RPCFunctions.saveDevices: devicefile: %s", devicefilename) try: with open(devicefilename, 'w') as df: df.write(json.dumps(self._devices_raw[remote])) return True except Exception as err: LOG.warning( "RPCFunctions.saveDevices: Exception saving _devices_raw: %s", str(err)) return False else: return True def saveParamsets(self, remote): """Write known paramsets to disk.""" if self.paramsetfile is not None: paramsetfilename = self.paramsetfile % remote LOG.debug("RPCFunctions.saveParamsets: paramsetfile: %s", paramsetfilename) try: with open(paramsetfilename, 'w') as df: df.write(json.dumps(self._paramsets[remote])) return True except Exception as err: LOG.warning( "RPCFunctions.saveParamsets: Exception saving _paramsets: %s", str(err)) return False def event(self, interface_id, address, value_key, value): """If a device emits some sort event, we will handle it here.""" LOG.debug("RPCFunctions.event: interface_id = %s, address = %s, value_key = %s, value = %s" % ( interface_id, address, value_key.upper(), str(value))) self.devices_all[interface_id.split( '-')[-1]][address].event(interface_id, value_key.upper(), value) if self.eventcallback: self.eventcallback(interface_id=interface_id, address=address, value_key=value_key.upper(), value=value) return True def listDevices(self, interface_id): """The CCU / Homegear asks for devices known to our XML-RPC server. We respond to that request using this method.""" LOG.debug("RPCFunctions.listDevices: interface_id = %s, _devices_raw = %s" % ( interface_id, str(self._devices_raw))) remote = interface_id.split('-')[-1] if remote not in self._devices_raw: self._devices_raw[remote] = [] if self.systemcallback: self.systemcallback('listDevices', interface_id) # return empty list for HmIP, as currently the maximum lenght is limited to 8192 bytes (see #318 for details) if self.remotes.get(remote, {}).get('port') in [2010, 32010, 42010]: return [] return self._devices_raw[remote] def newDevices(self, interface_id, dev_descriptions): """The CCU / Homegear informs us about newly added devices. We react on that and add those devices as well.""" LOG.debug("RPCFunctions.newDevices: interface_id = %s, dev_descriptions = %s" % ( interface_id, str(dev_descriptions))) remote = interface_id.split('-')[-1] if remote not in self._devices_raw: self._devices_raw[remote] = [] if remote not in self._devices_raw_dict: self._devices_raw_dict[remote] = {} if remote not in self._paramsets: self._paramsets[remote] = {} hmip = self.remotes.get(remote, {}).get('port') in [2010, 32010, 42010] for d in dev_descriptions: if hmip: if d in self._devices_raw[remote]: continue self._devices_raw[remote].append(d) self._devices_raw_dict[remote][d['ADDRESS']] = d self._paramsets[remote][d['ADDRESS']] = {} self.saveDevices(remote) self.saveParamsets(remote) self.createDeviceObjects(interface_id) if self.systemcallback: self.systemcallback('newDevices', interface_id, dev_descriptions) return True def deleteDevices(self, interface_id, addresses): """The CCU / Homegear informs us about removed devices. We react on that and remove those devices as well.""" LOG.debug("RPCFunctions.deleteDevices: interface_id = %s, addresses = %s" % ( interface_id, str(addresses))) # TODO: remove known device objects as well remote = interface_id.split('-')[-1] self._devices_raw[remote] = [device for device in self._devices_raw[ remote] if not device['ADDRESS'] in addresses] self.saveDevices(remote) for address in addresses: try: del self._paramsets[remote][address] except KeyError: pass self.saveParamsets(remote) if self.systemcallback: self.systemcallback('deleteDevice', interface_id, addresses) return True def updateDevice(self, interface_id, address, hint): LOG.debug("RPCFunctions.updateDevice: interface_id = %s, address = %s, hint = %s" % ( interface_id, address, str(hint))) # TODO: Implement updateDevice if self.systemcallback: self.systemcallback('updateDevice', interface_id, address, hint) return True def replaceDevice(self, interface_id, oldDeviceAddress, newDeviceAddress): LOG.debug("RPCFunctions.replaceDevice: interface_id = %s, oldDeviceAddress = %s, newDeviceAddress = %s" % ( interface_id, oldDeviceAddress, newDeviceAddress)) # TODO: Implement replaceDevice if self.systemcallback: self.systemcallback('replaceDevice', interface_id, oldDeviceAddress, newDeviceAddress) return True def readdedDevice(self, interface_id, addresses): LOG.debug("RPCFunctions.readdedDevices: interface_id = %s, addresses = %s" % ( interface_id, str(addresses))) # TODO: Implement readdedDevice if self.systemcallback: self.systemcallback('readdedDevice', interface_id, addresses) return True def jsonRpcPost(self, host, jsonport, method, params={}, verify=False): LOG.debug("RPCFunctions.jsonRpcPost: Method: %s" % method) try: payload = json.dumps( {"method": method, "params": params, "jsonrpc": "1.1", "id": 0}).encode('utf-8') headers = {"Content-Type": 'application/json', "Content-Length": len(payload)} ctx = None if jsonport == 443: apiendpoint = "https://%s:%s%s" % (host, jsonport, JSONRPC_URL) if not verify: ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE else: apiendpoint = "http://%s:%s%s" % (host, jsonport, JSONRPC_URL) LOG.debug("RPCFunctions.jsonRpcPost: API-Endpoint: %s" % apiendpoint) req = urllib.request.Request(apiendpoint, payload, headers) # pylint: disable=consider-using-with resp = urllib.request.urlopen(req, context=ctx) if resp.status == 200: try: return json.loads(resp.read().decode('utf-8')) except ValueError as err: # Workaround for bug in CCU return json.loads(resp.read().decode('utf-8').replace("\\", "")) else: LOG.error("RPCFunctions.jsonRpcPost: Status: %i" % resp.status) return {'error': resp.status, 'result': {}} except Exception as err: LOG.error("RPCFunctions.jsonRpcPost: Exception: %s" % str(err)) return {'error': str(err), 'result': {}} def addDeviceNames(self, remote): """ If XML-API (http://www.homematic-inside.de/software/addons/item/xmlapi) is installed on CCU this function will add names to CCU devices """ LOG.debug("RPCFunctions.addDeviceNames") # First try to get names from metadata when nur credentials are set if self.remotes[remote]['resolvenames'] == 'metadata': for address in self.devices[remote]: try: name = self.devices[remote][ address]._proxy.getMetadata(address, 'NAME') self.devices[remote][address].NAME = name for address, device in self.devices[remote][address].CHANNELS.items(): device.NAME = name self.devices_all[remote][device.ADDRESS].NAME = name except Exception as err: LOG.debug( "RPCFunctions.addDeviceNames: Unable to get name for %s from metadata." % str(address)) # Then try to get names via JSON-RPC elif (self.remotes[remote]['resolvenames'] == 'json' and self.remotes[remote]['username'] and self.remotes[remote]['password']): LOG.debug("RPCFunctions.addDeviceNames: Getting names via JSON-RPC") try: session = False params = {"username": self.remotes[remote][ 'username'], "password": self.remotes[remote]['password']} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.login", params) if response['error'] is None and response['result']: session = response['result'] if not session: LOG.warning( "RPCFunctions.addDeviceNames: Unable to open session.") return params = {"_session_id_": session} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Interface.listInterfaces", params) interface = False if response['error'] is None and response['result']: for i in response['result']: if i['port'] in [self.remotes[remote]['port'], self.remotes[remote]['port'] + 30000, self.remotes[remote]['port'] + 40000]: interface = i['name'] break LOG.debug( "RPCFunctions.addDeviceNames: Got interface: %s" % interface) if not interface: params = {"_session_id_": session} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.logout", params) return params = {"_session_id_": session} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Device.listAllDetail", params) if response['error'] is None and response['result']: LOG.debug( "RPCFunctions.addDeviceNames: Resolving devicenames") for i in response['result']: try: if i.get('address') in self.devices[remote]: self.devices[remote][ i['address']].NAME = i['name'] for channel_device_response in i['channels']: name = channel_device_response['name'] self.devices_all[remote][channel_device_response['address']].NAME = name except Exception as err: LOG.warning( "RPCFunctions.addDeviceNames: Exception: %s" % str(err)) params = {"_session_id_": session} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.logout", params) except Exception as err: params = {"_session_id_": session} response = self.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.logout", params) LOG.warning( "RPCFunctions.addDeviceNames: Exception: %s" % str(err)) # Then try to get names from XML-API elif self.remotes[remote]['resolvenames'] == 'xml': LOG.warning("Resolving names with the XML-API addon will be disabled in a future release. Please switch to json.") try: # pylint: disable=consider-using-with response = urllib.request.urlopen( "http://%s%s" % (self.remotes[remote]['ip'], XML_API_URL), timeout=5) device_list = response.read().decode("ISO-8859-1") except Exception as err: LOG.warning( "RPCFunctions.addDeviceNames: Could not access XML-API: %s" % (str(err), )) return device_list_tree = ET.ElementTree(ET.fromstring(device_list)) for device in device_list_tree.getroot(): address = device.attrib['address'] name = device.attrib['name'] if address in self.devices[remote]: self.devices[remote][address].NAME = name for address, device in self.devices[remote][address].CHANNELS.items(): device.NAME = name self.devices_all[remote][device.ADDRESS].NAME = name class LockingServerProxy(xmlrpc.client.ServerProxy): """ ServerProxy implementation with lock when request is executing """ def __init__(self, *args, **kwargs): """ Initialize new proxy for server and get local ip """ self._remote = kwargs.pop("remote", None) self._skipinit = kwargs.pop("skipinit", False) self._callbackip = kwargs.pop("callbackip", None) self._callbackport = kwargs.pop("callbackport", None) self._ssl = kwargs.pop("ssl", False) self._verify_ssl = kwargs.pop("verify_ssl", True) self.lock = threading.Lock() if self._ssl and not self._verify_ssl and self._verify_ssl is not None: kwargs['context'] = ssl._create_unverified_context() xmlrpc.client.ServerProxy.__init__(self, encoding="ISO-8859-1", *args, **kwargs) urlcomponents = urllib.parse.urlparse(args[0]) self._remoteip = urlcomponents.hostname self._remoteport = urlcomponents.port LOG.debug("LockingServerProxy.__init__: Getting local ip") tmpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) tmpsocket.connect((self._remoteip, self._remoteport)) self._localip = tmpsocket.getsockname()[0] tmpsocket.close() LOG.debug("LockingServerProxy.__init__: Got local ip %s" % self._localip) def __request(self, *args, **kwargs): """ Call method on server side """ with self.lock: parent = xmlrpc.client.ServerProxy # pylint: disable=E1101 return parent._ServerProxy__request(self, *args, **kwargs) def __getattr__(self, *args, **kwargs): """ Magic method dispatcher """ return xmlrpc.client._Method(self.__request, *args, **kwargs) # Restrict to particular paths. class RequestHandler(SimpleXMLRPCRequestHandler): """We handle requests to / and /RPC2""" rpc_paths = ('/', '/RPC2',) # pylint: disable=too-many-public-methods class ServerThread(threading.Thread): """XML-RPC server thread to handle messages from CCU / Homegear""" def __init__(self, local=LOCAL, localport=LOCALPORT, remotes=REMOTES, devicefile=DEVICEFILE, paramsetfile=PARAMSETFILE, interface_id=INTERFACE_ID, eventcallback=False, systemcallback=False, resolveparamsets=False): LOG.debug("ServerThread.__init__") threading.Thread.__init__(self) # Member self._interface_id = interface_id self._local = local self._localport = int(localport) self._devicefile = devicefile self._paramsetfile = paramsetfile self.remotes = remotes self.eventcallback = eventcallback self.systemcallback = systemcallback self.resolveparamsets = resolveparamsets self.proxies = {} self.failed_inits = [] self.createProxies() if not self.proxies: LOG.warning("No proxies available. Aborting.") raise Exception self._rpcfunctions = RPCFunctions(devicefile=self._devicefile, paramsetfile=self._paramsetfile, proxies=self.proxies, remotes=self.remotes, eventcallback=self.eventcallback, systemcallback=self.systemcallback, resolveparamsets=self.resolveparamsets) # Setup server to handle requests from CCU / Homegear LOG.debug("ServerThread.__init__: Setting up server") # class SimpleThreadedXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): # pass # self.server = SimpleThreadedXMLRPCServer((self._local, self._localport), # requestHandler=RequestHandler, # logRequests=False) self.server = SimpleXMLRPCServer((self._local, self._localport), requestHandler=RequestHandler, logRequests=False) self._localport = self.server.socket.getsockname()[1] self.server.register_introspection_functions() self.server.register_multicall_functions() LOG.debug("ServerThread.__init__: Registering RPC functions") self.server.register_instance( self._rpcfunctions, allow_dotted_names=True) def run(self): LOG.info("Starting server at http://%s:%i" % (self._local, self._localport)) self.server.serve_forever() def createProxies(self): """Create proxies to interact with CCU / Homegear""" LOG.debug("createProxies: Creating proxies") for remote, host in self.remotes.items(): # Initialize XML-RPC try: socket.gethostbyname(host['ip']) except Exception as err: LOG.info("Skipping proxy: %s", str(err)) continue if 'path' not in host: host['path'] = '' LOG.info("Creating proxy %s. Connecting to %s:%i%s" % (remote, host['ip'], host['port'], host['path'])) host['id'] = "%s-%s" % (self._interface_id, remote) try: api_url = build_api_url(host=host['ip'], port=host['port'], path=host['path'], username=host.get('username'), password=host.get('password'), ssl=host.get('ssl')) self.proxies[host['id']] = LockingServerProxy( api_url, remote=remote, callbackip=host.get('callbackip', None), callbackport=host.get('callbackport', None), skipinit=not host.get('connect', True), ssl=host.get('ssl', False), verify_ssl=host.get('verify_ssl', True)) except Exception as err: LOG.warning("Failed connecting to proxy at http://%s:%i%s" % (host['ip'], host['port'], host['path'])) LOG.debug("__init__: Exception: %s" % str(err)) # pylint: disable=raise-missing-from raise Exception try: host['type'] = BACKEND_UNKNOWN #if "Homegear" in self.proxies[host['id']].getVersion(): # LOG.debug("__init__: Host is Homegear") # host['type'] = BACKEND_HOMEGEAR #else: # LOG.debug("__init__: Host is CCU") # host['type'] = BACKEND_CCU except Exception as err: LOG.warning("__init__: Failed to detect backend type: %s" % str(err)) host['type'] = BACKEND_UNKNOWN def clearProxies(self): """Remove existing proxy objects.""" LOG.debug("clearProxies: Clearing proxies") self.proxies.clear() def proxyInit(self): """ To receive events the proxy has to tell the CCU / Homegear where to send the events. For that we call the init-method. """ # Call init() with local XML RPC config and interface_id (the name of # the receiver) to receive events. XML RPC server has to be running. for interface_id, proxy in self.proxies.items(): if proxy._skipinit: LOG.info("Skipping init for %s", interface_id) continue if proxy._callbackip and proxy._callbackport: callbackip = proxy._callbackip callbackport = proxy._callbackport else: callbackip = proxy._localip callbackport = self._localport LOG.debug("ServerThread.proxyInit: init('http://%s:%i', '%s')" % (callbackip, callbackport, interface_id)) try: # For HomeMatic IP, init is not working correctly. We fetch the device list and create # the device objects before the init is performed. if proxy._remoteport in [2010, 32010, 42010]: dev_list = proxy.listDevices(interface_id) self._rpcfunctions.newDevices(interface_id=interface_id, dev_descriptions=dev_list) proxy.init("http://%s:%i" % (callbackip, callbackport), interface_id) LOG.info("Proxy for %s initialized", interface_id) except Exception as err: LOG.debug("proxyInit: Exception: %s" % str(err)) LOG.warning("Failed to initialize proxy for %s", interface_id) self.failed_inits.append(interface_id) def proxyDeInit(self): """De-Init from the proxies.""" stopped = [] for interface_id, proxy in self.proxies.items(): if interface_id in self.failed_inits: LOG.warning("ServerThread.proxyDeInit: Not performing de-init for %s", interface_id) continue if proxy._callbackip and proxy._callbackport: callbackip = proxy._callbackip callbackport = proxy._callbackport else: callbackip = proxy._localip callbackport = self._localport remote = "http://%s:%i" % (callbackip, callbackport) LOG.debug("ServerThread.proxyDeInit: init('%s')", remote) if not interface_id in stopped: try: proxy.init(remote) stopped.append(interface_id) LOG.info("proxyDeInit: Proxy for %s de-initialized: %s", interface_id, remote) except Exception as err: LOG.debug("proxyDeInit: Exception: %s", err) LOG.warning("proxyDeInit: Failed to de-initialize proxy") def stop(self): """To stop the server we de-init from the CCU / Homegear, then shut down our XML-RPC server.""" self.proxyDeInit() self.clearProxies() LOG.info("Shutting down server") self.server.shutdown() LOG.debug("ServerThread.stop: Stopping ServerThread") self.server.server_close() LOG.info("HomeMatic XML-RPC Server stopped") def parseCCUSysVar(self, data): """Helper to parse type of system variables of CCU""" if data['type'] == 'LOGIC': return data['name'], data['value'] == 'true' elif data['type'] == 'NUMBER': return data['name'], float(data['value']) elif data['type'] == 'LIST': return data['name'], int(data['value']) else: return data['name'], data['value'] def jsonRpcLogin(self, remote): """Login to CCU and return session""" session = False try: params = {"username": self.remotes[remote][ 'username'], "password": self.remotes[remote]['password']} response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.login", params) if response['error'] is None and response['result']: session = response['result'] if not session: LOG.warning( "ServerThread.jsonRpcLogin: Unable to open session.") except Exception as err: LOG.debug( "ServerThread.jsonRpcLogin: Exception while logging in via JSON-RPC: %s" % str(err)) return session def jsonRpcLogout(self, remote, session): """Logout of CCU""" logout = False try: params = {"_session_id_": session} response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "Session.logout", params) if response['error'] is None and response['result']: logout = response['result'] except Exception as err: LOG.debug( "ServerThread.jsonRpcLogout: Exception while logging in via JSON-RPC: %s" % str(err)) return logout def getAllSystemVariables(self, remote): """Get all system variables from CCU / Homegear""" variables = {} if self.remotes[remote]['username'] and self.remotes[remote]['password']: LOG.debug( "ServerThread.getAllSystemVariables: Getting all System variables via JSON-RPC") session = self.jsonRpcLogin(remote) if not session: return try: params = {"_session_id_": session} response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "SysVar.getAll", params) if response['error'] is None and response['result']: for var in response['result']: key, value = self.parseCCUSysVar(var) variables[key] = value self.jsonRpcLogout(remote, session) except Exception as err: self.jsonRpcLogout(remote, session) LOG.warning( "ServerThread.getAllSystemVariables: Exception: %s" % str(err)) else: try: variables = self.proxies[ "%s-%s" % (self._interface_id, remote)].getAllSystemVariables() except Exception as err: LOG.debug( "ServerThread.getAllSystemVariables: Exception: %s" % str(err)) return variables def getSystemVariable(self, remote, name): """Get single system variable from CCU / Homegear""" var = None if self.remotes[remote]['username'] and self.remotes[remote]['password']: LOG.debug( "ServerThread.getSystemVariable: Getting System variable via JSON-RPC") session = self.jsonRpcLogin(remote) if not session: return try: params = {"_session_id_": session, "name": name} response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "SysVar.getValueByName", params) if response['error'] is None and response['result']: try: var = float(response['result']) except Exception as err: var = response['result'] == 'true' self.jsonRpcLogout(remote, session) except Exception as err: self.jsonRpcLogout(remote, session) LOG.warning( "ServerThread.getSystemVariable: Exception: %s" % str(err)) else: try: var = self.proxies[ "%s-%s" % (self._interface_id, remote)].getSystemVariable(name) except Exception as err: LOG.debug( "ServerThread.getSystemVariable: Exception: %s" % str(err)) return var def deleteSystemVariable(self, remote, name): """Delete a system variable from CCU / Homegear""" if self.remotes[remote]['username'] and self.remotes[remote]['password']: LOG.debug( "ServerThread.deleteSystemVariable: Getting System variable via JSON-RPC") session = self.jsonRpcLogin(remote) if not session: return try: params = {"_session_id_": session, "name": name} response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "SysVar.deleteSysVarByName", params) if response['error'] is None and response['result']: deleted = response['result'] LOG.warning( "ServerThread.deleteSystemVariable: Deleted: %s" % str(deleted)) self.jsonRpcLogout(remote, session) except Exception as err: self.jsonRpcLogout(remote, session) LOG.warning( "ServerThread.deleteSystemVariable: Exception: %s" % str(err)) else: try: return self.proxies["%s-%s" % (self._interface_id, remote)].deleteSystemVariable(name) except Exception as err: LOG.debug( "ServerThread.deleteSystemVariable: Exception: %s" % str(err)) def setSystemVariable(self, remote, name, value): """Set a system variable on CCU / Homegear""" if self.remotes[remote]['username'] and self.remotes[remote]['password']: LOG.debug( "ServerThread.setSystemVariable: Setting System variable via JSON-RPC") session = self.jsonRpcLogin(remote) if not session: return try: params = {"_session_id_": session, "name": name, "value": value} if value is True or value is False: params['value'] = int(value) response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "SysVar.setBool", params) else: response = self._rpcfunctions.jsonRpcPost( self.remotes[remote]['ip'], self.remotes[remote].get('jsonport', DEFAULT_JSONPORT), "SysVar.setFloat", params) if response['error'] is None and response['result']: res = response['result'] LOG.debug( "ServerThread.setSystemVariable: Result while setting variable: %s" % str(res)) else: if response['error']: LOG.debug("ServerThread.setSystemVariable: Error while setting variable: %s" % str( response['error'])) self.jsonRpcLogout(remote, session) except Exception as err: self.jsonRpcLogout(remote, session) LOG.warning( "ServerThread.setSystemVariable: Exception: %s" % str(err)) else: try: return self.proxies["%s-%s" % (self._interface_id, remote)].setSystemVariable(name, value) except Exception as err: LOG.debug( "ServerThread.setSystemVariable: Exception: %s" % str(err)) def getServiceMessages(self, remote): """Get service messages from CCU / Homegear""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].getServiceMessages() except Exception as err: LOG.debug("ServerThread.getServiceMessages: Exception: %s" % str(err)) def rssiInfo(self, remote): """Get RSSI information for all devices from CCU / Homegear""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].rssiInfo() except Exception as err: LOG.debug("ServerThread.rssiInfo: Exception: %s" % str(err)) def setInstallMode(self, remote, on=True, t=60, mode=1, address=None): """Activate or deactivate installmode on CCU / Homegear""" try: args = [on] if on and t: args.append(t) if address: args.append(address) else: args.append(mode) return self.proxies["%s-%s" % (self._interface_id, remote)].setInstallMode(*args) except Exception as err: LOG.debug("ServerThread.setInstallMode: Exception: %s" % str(err)) def getInstallMode(self, remote): """Get remaining time in seconds install mode is active from CCU / Homegear""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].getInstallMode() except Exception as err: LOG.debug("ServerThread.getInstallMode: Exception: %s" % str(err)) def getAllMetadata(self, remote, address): """Get all metadata of device""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].getAllMetadata(address) except Exception as err: LOG.debug("ServerThread.getAllMetadata: Exception: %s" % str(err)) def getMetadata(self, remote, address, key): """Get metadata of device""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].getMetadata(address, key) except Exception as err: LOG.debug("ServerThread.getMetadata: Exception: %s" % str(err)) def setMetadata(self, remote, address, key, value): """Set metadata of device""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].setMetadata(address, key, value) except Exception as err: LOG.debug("ServerThread.setMetadata: Exception: %s" % str(err)) def deleteMetadata(self, remote, address, key): """Delete metadata of device""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].deleteMetadata(address, key) except Exception as err: LOG.debug("ServerThread.deleteMetadata: Exception: %s" % str(err)) def listBidcosInterfaces(self, remote): """Return all available BidCos Interfaces""" try: return self.proxies["%s-%s" % (self._interface_id, remote)].listBidcosInterfaces() except Exception as err: LOG.debug( "ServerThread.listBidcosInterfaces: Exception: %s" % str(err)) def ping(self, remote): """Send ping to CCU/Homegear to generate PONG event""" try: self.proxies["%s-%s" % (self._interface_id, remote)].ping("%s-%s" % (self._interface_id, remote)) except Exception as err: LOG.warning("ServerThread.ping: Exception: %s" % str(err)) def homegearCheckInit(self, remote): """Check if proxy is still initialized""" rdict = self.remotes.get(remote) if not rdict: return False if rdict.get('type') != BACKEND_HOMEGEAR: return False try: interface_id = "%s-%s" % (self._interface_id, remote) return self.proxies[interface_id].clientServerInitialized(interface_id) except Exception as err: LOG.debug( "ServerThread.homegearCheckInit: Exception: %s" % str(err)) return False def putParamset(self, remote, address, paramset, value, rx_mode=None): """Set paramsets manually""" try: proxy = self.proxies["%s-%s" % (self._interface_id, remote)] if rx_mode is None: return proxy.putParamset(address, paramset, value) else: return proxy.putParamset(address, paramset, value, rx_mode) except Exception as err: LOG.debug("ServerThread.putParamset: Exception: %s" % str(err)) danielperna84-pyhomematic-8aaf60d/pyhomematic/connection.py000066400000000000000000000160321455774063600242330ustar00rootroot00000000000000import logging from pyhomematic import _hm LOG = logging.getLogger(__name__) class HMConnection(): def __init__(self, local=_hm.LOCAL, localport=_hm.LOCALPORT, remotes=_hm.REMOTES, remote=None, remoteport=None, devicefile=_hm.DEVICEFILE, paramsetfile=_hm.PARAMSETFILE, interface_id=_hm.INTERFACE_ID, autostart=False, eventcallback=False, systemcallback=False, resolvenames=None, resolveparamsets=False, rpcusername=None, rpcpassword=None): """ Helper function to quickly create the server thread to which the CCU / Homegear will emit events. Without specifying the remote data we'll assume we're running Homegear on localhost on the default port. """ LOG.debug("HMConnection: Creating server object") # Device-storage self.devices = _hm.devices self.devices_all = _hm.devices_all self.devices_raw = _hm.devices_raw self.devices_raw_dict = _hm.devices_raw_dict self.paramsets = _hm.paramsets if remote and remoteport: remotes['default']['ip'] = remote remotes['default']['port'] = remoteport if resolvenames: remotes['default']['resolvenames'] = resolvenames if rpcusername: remotes['default']['username'] = rpcusername if rpcpassword: remotes['default']['password'] = rpcpassword try: self._server = _hm.ServerThread(local=local, localport=localport, remotes=remotes, devicefile=devicefile, paramsetfile=paramsetfile, interface_id=interface_id, eventcallback=eventcallback, systemcallback=systemcallback, resolveparamsets=resolveparamsets) except Exception as err: LOG.critical("Failed to create server %s", err) LOG.debug(str(err)) if autostart: self.start() def start(self, *args, **kwargs): """ Start the server thread if it wasn't created with autostart = True. """ if args: LOG.debug("args: %s" % str(args)) if kwargs: LOG.debug("kwargs: %s" % str(kwargs)) try: self._server.start() self._server.proxyInit() return True except Exception as err: LOG.critical("Failed to start server: %s", err) LOG.debug(str(err)) self._server.stop() return False def stop(self, *args, **kwargs): """ Stop the server thread. """ if args: LOG.debug("args: %s" % str(args)) if kwargs: LOG.debug("kwargs: %s" % str(kwargs)) try: self._server.stop() self._server = None # Device-storage clear self.devices.clear() self.devices_all.clear() self.devices_raw.clear() self.devices_raw_dict.clear() return True except Exception as err: LOG.critical("Failed to stop server") LOG.debug(str(err)) return False def reconnect(self): """Reinit all RPC proxy.""" if self._server is not None: self._server.proxyInit() def getAllSystemVariables(self, remote): """Get all system variables from CCU / Homegear""" if self._server is not None: return self._server.getAllSystemVariables(remote) def getSystemVariable(self, remote, name): """Get single system variable from CCU / Homegear""" if self._server is not None: return self._server.getSystemVariable(remote, name) def deleteSystemVariable(self, remote, name): """Delete a system variable from CCU / Homegear""" if self._server is not None: return self._server.deleteSystemVariable(remote, name) def setSystemVariable(self, remote, name, value): """Set a system variable on CCU / Homegear""" if self._server is not None: return self._server.setSystemVariable(remote, name, value) def getServiceMessages(self, remote): """Get service messages from CCU / Homegear""" if self._server is not None: return self._server.getServiceMessages(remote) def rssiInfo(self, remote): """Get RSSI information for all devices from CCU / Homegear""" if self._server is not None: return self._server.rssiInfo(remote) def setInstallMode(self, remote, on=True, t=60, mode=1, address=None): """Activate or deactivate installmode on CCU / Homegear""" if self._server is not None: return self._server.setInstallMode(remote, on, t, mode, address) def getInstallMode(self, remote): """Get remaining time in seconds install mode is active from CCU / Homegear""" if self._server is not None: return self._server.getInstallMode(remote) def getAllMetadata(self, remote, address): """Get all metadata of device""" if self._server is not None: return self._server.getAllMetadata(remote, address) def getMetadata(self, remote, address, key): """Get metadata of device""" if self._server is not None: # pylint: disable=E1121 return self._server.getAllMetadata(remote, address, key) def setMetadata(self, remote, address, key, value): """Set metadata of device""" if self._server is not None: # pylint: disable=E1121 return self._server.getAllMetadata(remote, address, key, value) def deleteMetadata(self, remote, address, key): """Delete metadata of device""" if self._server is not None: # pylint: disable=E1121 return self._server.deleteMetadata(remote, address, key) def listBidcosInterfaces(self, remote): """Return all available BidCos Interfaces""" if self._server is not None: return self._server.listBidcosInterfaces(remote) def ping(self, remote): """Send ping to CCU/Homegear to generate PONG-event""" if self._server is not None: self._server.ping(remote) def homegearCheckInit(self, remote): """Check if proxy is still initialized""" if self._server is not None: return self._server.homegearCheckInit(remote) def putParamset(self, remote, address, paramset, value, rx_mode=None): """Set paramsets manually""" if self._server is not None: return self._server.putParamset(remote, address, paramset, value, rx_mode) danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/000077500000000000000000000000001455774063600240445ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/__init__.py000066400000000000000000000007411455774063600261570ustar00rootroot00000000000000import logging from pyhomematic.devicetypes import generic, misc, sensors, actors, thermostats LOG = logging.getLogger(__name__) try: UNSUPPORTED = generic.HMDevice SUPPORTED = {} SUPPORTED.update(actors.DEVICETYPES) SUPPORTED.update(sensors.DEVICETYPES) SUPPORTED.update(thermostats.DEVICETYPES) SUPPORTED.update(misc.DEVICETYPES) except Exception as err: LOG.critical("devicetypes Exception: %s" % (err,)) UNSUPPORTED = False SUPPORTED = {} danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/actors.py000066400000000000000000001253131455774063600257160ustar00rootroot00000000000000 import logging from pyhomematic.devicetypes.generic import HMDevice from pyhomematic.devicetypes.sensors import HMSensor from pyhomematic.devicetypes.misc import HMEvent from pyhomematic.devicetypes.helper import ( HelperWorking, HelperActorState, HelperActorLevel, HelperActorBlindTilt, HelperActionOnTime, HelperActionPress, HelperEventRemote, HelperWired, HelperRssiPeer, HelperRssiDevice, HelperDeviceTemperature, HelperInhibit, HelperLowBatIP) LOG = logging.getLogger(__name__) class HMActor(HMDevice): """ Generic HM Actor Object """ class GenericBlind(HMActor, HelperActorLevel): """ Blind switch that raises and lowers roller shutters or window blinds. """ def move_up(self, channel=None): """Move the shutter up all the way.""" self.set_level(1.0, channel) def move_down(self, channel=None): """Move the shutter down all the way.""" self.set_level(0.0, channel) def stop(self, channel=None): """Stop moving.""" self.actionNodeData("STOP", True, channel) class Blind(GenericBlind, HelperInhibit, HelperWorking, HelperRssiPeer): """ Blind switch that raises and lowers roller shutters or window blinds. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ACTIONNODE.update({"STOP": self.ELEMENT}) class IPBlind(GenericBlind, HelperRssiPeer): """ Blind switch that raises and lowers roller shutters or window blinds. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"ACTIVITY_STATE": self.ELEMENT, "LEVEL_STATUS": self.ELEMENT, "SECTION": self.ELEMENT}) self.ACTIONNODE.update({"STOP": self.ELEMENT}) self.SENSORNODE.update({"LEVEL": [3]}) self.WRITENODE.update({"LEVEL": self.ELEMENT}) class KeyBlind(Blind, HelperActionPress, HelperWired): """ Blind switch that raises and lowers roller shutters or window blinds. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"LEVEL": self.ELEMENT}) self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) @property def ELEMENT(self): return [3] class IPKeyBlind(IPBlind, HelperActionPress): """ Blind switch that raises and lowers homematic ip roller shutters or window blinds. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) @property def ELEMENT(self): return [4] class IPKeyBlindMulti(KeyBlind): """ Multi-blind actor HmIP-DRBLI4 """ @property def ELEMENT(self): return [10, 14, 18, 22] class IPKeyBlindTilt(IPKeyBlind, HelperActorBlindTilt): """ Blind switch that raises, lowers and adjusts the slat position of shutters or blinds. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"LEVEL_2": [3]}) def close_slats(self, channel=None): """Move the shutter up all the way.""" self.set_cover_tilt_position(0.0, channel) def open_slats(self, channel=None): """Move the shutter down all the way.""" self.set_cover_tilt_position(1.0, channel) class GenericDimmer(HMActor, HelperActorLevel): """ Dimmer switch that controls level of light brightness. """ def on(self, channel=None): """Turn light to maximum brightness.""" self.set_level(1.0, channel) def off(self, channel=None): """Turn light off.""" self.set_level(0.0, channel) class Dimmer(GenericDimmer, HelperInhibit, HelperWorking): """ Dimmer switch that controls level of light brightness. """ @property def ELEMENT(self): if "Dim2L" in self._TYPE or "Dim2T" in self._TYPE or self._TYPE == "HM-DW-WM": return [1, 2] return [1] class KeyDimmer(GenericDimmer, HelperInhibit, HelperWorking, HelperActionPress): """ Dimmer switch that controls level of light brightness. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG_RELEASE": [1, 2]}) @property def ELEMENT(self): return [3] class IPDimmer(GenericDimmer): """ IP Dimmer switch that controls level of light brightness. """ @property def ELEMENT(self): if "PDT" in self._TYPE: return [3] return [2] class IPKeyDimmer(GenericDimmer, HelperActionPress): """ IP Dimmer with buttons switch that controls level of light brightness. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) channels = [] if "HMIP-DRDI3" in self.TYPE.upper(): channels = [1, 2, 3] else: channels = [1, 2] # init metadata self.EVENTNODE.update({"PRESS_SHORT": channels, "PRESS_LONG": channels}) @property def ELEMENT(self): if "HMIP-DRDI3" in self.TYPE.upper(): return [5, 9, 13] else: return [4] class GenericSwitch(HMActor, HelperActorState): """ Switch turning plugged in device on or off. """ def is_on(self, channel=None): """ Returns True if switch is on. """ return self.get_state(channel) def is_off(self, channel=None): """ Returns True if switch is off. """ return not self.get_state(channel) def on(self, channel=None): """Turn switch on.""" self.set_state(True, channel) def off(self, channel=None): """Turn switch off.""" self.set_state(False, channel) class Rain(GenericSwitch, HelperInhibit, HelperWorking): """Rain / Heat sensor with heating switch""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"STATE": [1]}) def is_rain(self, channel=None): """ Returns True when raining. """ return self.get_state(channel) @property def ELEMENT(self): return [2] class Switch(GenericSwitch, HelperInhibit, HelperWorking, HelperRssiPeer): """ Switch turning plugged in device on or off. """ @property def ELEMENT(self): if "LC-Sw2" in self.TYPE or "Sec-SFA-SM" in self.TYPE: return [1, 2] elif "LC-Sw4" in self.TYPE: return [1, 2, 3, 4] elif "Re-8" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8] elif "HM-OU-CFM-Pl" in self.TYPE or "HM-OU-CFM-TW" in self.TYPE or "HM-OU-CF-Pl" in self.TYPE: return [1, 2] elif "HMW-IO-12-Sw14-DR" in self.TYPE: return [1, 2, 3, 4, 5, 6] elif "HMW-IO-12-Sw7-DR" in self.TYPE: return [13, 14, 15, 16, 17, 18, 19] return [1] class IOSwitchWireless(GenericSwitch, HelperInhibit, HelperWorking, HelperEventRemote, HelperRssiPeer): """ Switch turning attached device on or off. Can controll relais and buttons independently. """ @property def ELEMENT(self): return [1, 2] class IOSwitchNoInhibit(GenericSwitch, HelperWorking, HelperEventRemote, HelperWired): """ Switch turning attached device on or off and not having a inhibit function. """ def __init__(self, device_description, proxy, resolveparamsets=False): self._doc = [] super().__init__(device_description, proxy, resolveparamsets) if "HMW-IO-12-FM" in self.TYPE: for chan in range(1, 13): if self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("BEHAVIOUR", None) == 1: self._doc.append(chan) @property def ELEMENT(self): if "HMW-IO-12-FM" in self.TYPE: return self._doc return [1] class IOSwitch(GenericSwitch, HelperInhibit, HelperWorking, HelperEventRemote, HelperWired): """ Switch turning attached device on or off. """ @property def ELEMENT(self): if "HMW-IO-12-Sw7-DR" in self.TYPE: return [13, 14, 15, 16, 17, 18, 19] if "HMW-LC-Sw2-DR" in self.TYPE: return [3, 4] return [1] class HMWIOSwitch(GenericSwitch, HelperWired): """ Wired IO module controlling and sensing attached devices. """ def __init__(self, device_description, proxy, resolveparamsets=False): # Output channels (digital) self._doc = [1, 2, 3, 4, 5, 6] # Output channels (digital/analog) self._daoc = [7, 8, 9, 10, 11, 12, 13, 14] # Output channels (analog), how do we expose these? self._aoc = [] # Input channels (digital/frequency) self._dfic = [15, 16, 17, 18, 19, 20] # Input channels (digital/analog) self._daic = [21, 22, 23, 24, 25, 26] # Input channels (digital) self._dic = [] # Input channels (frequency) self._fic = [] # Input channels (analog) self._aic = [] super().__init__(device_description, proxy, resolveparamsets) # Need to know the operational mode to return digital switch channels with ELEMENT-property for chan in self._daoc: if self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("BEHAVIOUR", None) == 1: # We add the digital channels to self._doc self._doc.append(chan) else: # We add the analog channels to self._aoc self._aoc.append(chan) # We also want to know how the inputs are configured for chan in self._dfic: if self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("BEHAVIOUR", None) == 1: # We add the digital channels to self._dic self._dic.append(chan) else: # We add the frequency channels to self._fic self._fic.append(chan) for chan in self._daic: if self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("BEHAVIOUR", None) == 1: # We add the digital channels to self._dic self._dic.append(chan) else: # We add the analog channels to self._aic self._aic.append(chan) # init metadata self.BINARYNODE.update({"STATE": self._dic}) self.SENSORNODE.update({"FREQUENCY": self._fic, # mHz, from 0.0 to 350000.0 "VALUE": self._aic}) # No specific unit, float from 0.0 to 1000.0 @property def ELEMENT(self): return self._doc class IPWSwitch(GenericSwitch, HelperDeviceTemperature, HelperWired): """ IP-Wired Switch units turning attached device on or off. """ @property def ELEMENT(self): if "HmIPW-DRS4" in self.TYPE: # Address correct switching channels for each relais return [2, 6, 10, 14] elif "HmIPW-DRS8" in self.TYPE: # Address correct switching channels for each relais return [2, 6, 10, 14, 18, 22, 26, 30] return [1] class IPWDimmer(GenericDimmer, HelperDeviceTemperature, HelperWired): """ IP-Wired Dimmer switch that controls level of light brightness. """ @property def ELEMENT(self): if "HmIPW-DRD3" in self._TYPE: # Address correct switching channels for each relais return [2, 6, 10] return [1] class IPWKeyBlindMulti(KeyBlind, HelperActorBlindTilt,HelperDeviceTemperature, HelperWired): """ Multi-blind actor HmIPW-DRBL4 """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self._shutter_channels = [] self._blind_channels = [] # Get Operation Mode for Input Channels for chan in self.ELEMENT: address_channel = "%s:%i" % (self._ADDRESS, chan -1) try: channel_paramset = self._proxy.getParamset(address_channel, "MASTER", 0) channel_operation_mode = channel_paramset.get("CHANNEL_OPERATION_MODE") if "CHANNEL_OPERATION_MODE" in channel_paramset else 1 if channel_operation_mode == 0: self._blind_channels.append(chan) self.WRITENODE.pop("LEVEL_2", None) else: self._shutter_channels.append(chan) except Exception as err: LOG.error("IPWKeyBlindMulti: Failure to determine channel mode of IPWKeyBlindMulti %s %s", address_channel, err) # init metadata self.ATTRIBUTENODE.update({"ACTIVITY_STATE": self.ELEMENT, "LEVEL_STATUS": self.ELEMENT, "SECTION": self.ELEMENT}) self.ACTIONNODE.update({"STOP": self.ELEMENT}) self.WRITENODE.update({"LEVEL": self.ELEMENT}) if len(self._shutter_channels) > 0: self.WRITENODE.update({"LEVEL_2": self._shutter_channels}) self.SENSORNODE.update({"LEVEL_2": self._shutter_channels}) def close_slats(self, channel=None): """Move the shutter up all the way.""" self.set_cover_tilt_position(0.0, channel) def open_slats(self, channel=None): """Move the shutter down all the way.""" self.set_cover_tilt_position(1.0, channel) @property def ELEMENT(self): return [2, 6, 10, 14] class IPWInputDevice(HMEvent, HelperDeviceTemperature, HelperWired): """ IP-Wired component to support long / short press events and state report (e.g. if window contact or on/off switch) """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self._hmipw_keypress_event_channels = [] self._hmipw_binarysensor_channels = [] for chan in self.ELEMENT: address_channel = "%s:%i" % (self._ADDRESS, chan) try: channel_paramset = self._proxy.getParamset(address_channel, "MASTER", 0) channel_operation_mode = channel_paramset.get("CHANNEL_OPERATION_MODE") if "CHANNEL_OPERATION_MODE" in channel_paramset else 1 if channel_operation_mode == 1: self._hmipw_keypress_event_channels.append(chan) elif channel_operation_mode in [2, 3]: self._hmipw_binarysensor_channels.append(chan) except Exception as err: LOG.error("IPWInputDevice: Failure to determine input channel operations mode of HmIPW input device %s: %s", address_channel, err) self.EVENTNODE.update({"PRESS_SHORT": self._hmipw_keypress_event_channels, "PRESS_LONG": self._hmipw_keypress_event_channels}) self.BINARYNODE.update({"STATE": self._hmipw_binarysensor_channels}) @property def ELEMENT(self): """ General channel definition """ if "HmIPW-DRI16" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] elif "HmIPW-DRI32" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] return [1] class IPWIODevice(HMEvent, GenericSwitch, HelperWired): """ IP-Wired I/O component to support long / short press events and state report (e.g. if window contact or on/off switch) """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self._hmipw_keypress_event_channels = [] self._hmipw_binarysensor_channels = [] self._ic = [1] # Set Input Channels depending on Device if "HmIPW-FIO6" in self.TYPE: self._ic = [1, 2, 3, 4, 5, 6] # Get Operation Mode for Input Channels for chan in self._ic: try: if self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("CHANNEL_OPERATION_MODE", None) == 1: self._hmipw_keypress_event_channels.append(chan) else: self._hmipw_binarysensor_channels.append(chan) except Exception as err: LOG.error("IPWIODevice: Failure to determine input channel operations mode of HmIPW input device %s:%i %s", self._ADDRESS, chan, err) self.ACTIONNODE.update({"PRESS_SHORT": self._hmipw_keypress_event_channels, "PRESS_LONG": self._hmipw_keypress_event_channels}) self.BINARYNODE.update({"STATE": self._hmipw_binarysensor_channels}) @property def ELEMENT(self): """ General output channel definition """ if "HmIPW-FIO6" in self.TYPE: return [8, 12, 16, 20, 24, 28] return [1] class RFSiren(GenericSwitch, HelperInhibit, HelperWorking, HelperRssiPeer): """ HM-Sec-Sir-WM Siren """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"ERROR_SABOTAGE": self.ELEMENT, "LOWBAT": self.ELEMENT}) self.SENSORNODE.update({"ARMSTATE": [4]}) self.WRITENODE.update({"ARMSTATE": [4]}) @property def ELEMENT(self): return [1, 2, 3] class KeyMatic(HMActor, HelperInhibit, HelperActorState, HelperRssiPeer): """ Lock, Unlock or Open KeyMatic. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ACTIONNODE.update({"OPEN": self.ELEMENT}) self.ATTRIBUTENODE.update({"STATE_UNCERTAIN": self.ELEMENT, "ERROR": self.ELEMENT, "LOWBAT": self.ELEMENT}) def is_unlocked(self, channel=None): """ Returns True if KeyMatic is unlocked. """ return self.get_state(channel) def is_locked(self, channel=None): """ Returns True if KeyMatic is locked. """ return not self.get_state(channel) def unlock(self, channel=None): """Unlocks the door lock.""" return self.set_state(True, channel) def lock(self, channel=None): """Locks the door lock""" return self.set_state(False, channel) def open(self): """Opens the door. Keep in mind that in most cases the door can only be closed physically. If the KeyMatic is in locked state it will unlock first. After opening the door the state of KeyMatic is unlocked. """ return self.setValue("OPEN", True) @property def ELEMENT(self): return [1] class IPSwitch(GenericSwitch, HelperActionOnTime): """ Switch turning attached device on or off. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) channels = [] if "HMIP-PS" in self.TYPE.upper() or "HmIP-PCBS" in self.TYPE or "HmIP-FSI16" in self.TYPE: channels = [1] elif "HmIP-MOD-OC8" in self.TYPE: channels = [1,2,3,4,5,6,7,8] elif "HmIP-DRSI4" in self.TYPE: channels = [1,2,3,4] if channels: self.EVENTNODE.update({"PRESS_SHORT": channels, "PRESS_LONG": channels}) @property def ELEMENT(self): if "HmIP-BSM" in self.TYPE: return [4] elif "HmIP-PCBS2" in self.TYPE: return [4, 8] elif "HmIP-FSM" in self.TYPE or "HmIP-FSM16" in self.TYPE: return [2] elif "HmIP-MOD-OC8" in self.TYPE: return [10, 14, 18, 22, 26, 30, 34, 38] elif "HmIP-DRSI4" in self.TYPE: return [6, 10, 14, 18] else: return [3] class IPSwitchRssiDevice(GenericSwitch, HelperActionOnTime, HelperRssiDevice): """ Switch turning attached device on or off. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) channels = [] if "HmIP-DRSI1" in self.TYPE: channels = [1] if channels: self.EVENTNODE.update({"PRESS_SHORT": channels, "PRESS_LONG": channels}) @property def ELEMENT(self): return [3] class IPSwitchBattery(GenericSwitch, HelperActionOnTime, HelperLowBatIP): """ Battery powered switch turning attached device on or off. """ @property def ELEMENT(self): return [3] class IPKeySwitch(IPSwitch, HMEvent, HelperActionPress): """ Switch turning plugged in device on or off and measuring energy consumption. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) @property def ELEMENT(self): return [4] class IPKeySwitchLevel(GenericDimmer, GenericSwitch, HMEvent, HelperActionPress, HelperActorLevel): """ Switch with two independent controllable LEDs, turning plugged in device on or off. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.WRITENODE.update({"STATE": [4], "COLOR": [8, 12], "LEVEL": [8, 12]}) self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) def on(self, channel=None): """Turn light/switch on.""" if channel in self.WRITENODE["LEVEL"]: self.set_level(1.0, channel) else: self.set_state(True, channel) def off(self, channel=None): """Turn light/switch off.""" if channel in self.WRITENODE["LEVEL"]: self.set_level(0.0, channel) else: self.set_state(False, channel) def get_hs_color(self, channel=None): """ Return the color of the light as HSV color without the "value" component for the brightness. Returns (hue, saturation) tuple with values in range of 0-1, representing the H and S component of the HSV color system. """ # Get the color from homematic. This is one of the predefined colors, that need to be converted to h/s value hm_color = self.getCachedOrUpdatedValue("COLOR", channel) if hm_color == 7: #WHITE return 0, 0 elif hm_color == 6: #YELLOW return 60/360, 1 elif hm_color == 2: #GREEN return 120/360, 1 elif hm_color == 3: #TURQUOISE / CYAN return 180/360, 1 elif hm_color == 1: #BLUE return 240/360, 1 elif hm_color == 5: #PURPLE return 300/360, 1 elif hm_color == 4: #RED return 0, 1 else: return 1, 1 #No way to specify "black", so just pick a different shade of red def set_hs_color(self, hue: float, saturation: float, channel=None): """ Set a fixed color. :param hue: Hue component (range 0-1) :param saturation: Saturation component (range 0-1). Yields white for values near 0, other values are interpreted as 100% saturation. The input values are the components of an HSV color without the value/brightness component. Example colors: * Green: set_hs_color(120/360, 1) * Blue: set_hs_color(240/360, 1) * Yellow: set_hs_color(60/360, 1) * White: set_hs_color(0, 0) """ hue = hue * 360 if saturation < 0.1: # Special case (white) hm_color = 'WHITE' elif hue in range(30, 89): hm_color = 'YELLOW' elif hue in range(90, 149): hm_color = 'GREEN' elif hue in range(150, 209): hm_color = 'TURQUOISE' # actually cyan elif hue in range(210, 269): hm_color = 'BLUE' elif hue in range(270, 329): hm_color = 'PURPLE' # actually magenta else: hm_color = 'RED' self.setValue(key="COLOR", value=hm_color, channel=channel) @property def ELEMENT(self): return [4, 8, 12] class SwitchPowermeter(Switch, HelperActionOnTime, HMSensor): """ Switch turning plugged in device on or off and measuring energy consumption. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"POWER": [2], "CURRENT": [2], "VOLTAGE": [2], "FREQUENCY": [2], "ENERGY_COUNTER": [2]}) @property def ELEMENT(self): return [1] class EcoLogic(Switch, HelperActionOnTime, HelperActionPress, HMSensor): """ Switching device and humidity sensor for automatic watering """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"SENSOR": [3, 4]}) self.EVENTNODE.update({"PRESS_SHORT": [5, 6, 7, 8, 9]}) @property def ELEMENT(self): return [1, 2] class IPSwitchPowermeter(IPSwitch, HMSensor, HelperRssiDevice): """ Switch turning plugged in device on or off and measuring energy consumption. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) # init metadata sensorIndex = None if "HmIP-FSM" in self.TYPE or "HmIP-FSM16" in self.TYPE: sensorIndex = 5 elif "HMIP-PSM" in self.TYPE or "HmIP-PSM" in self.TYPE or "HmIP-PSM-2" in self.TYPE or "HmIP-USBSM" in self.TYPE or "HmIP-PSM-CH" in self.TYPE: sensorIndex = 6 elif "HmIP-BSM" in self.TYPE: sensorIndex = 7 if sensorIndex is not None: self.SENSORNODE.update({"POWER": [sensorIndex], "CURRENT": [sensorIndex], "VOLTAGE": [sensorIndex], "FREQUENCY": [sensorIndex], "ENERGY_COUNTER": [sensorIndex]}) class IPKeySwitchPowermeter(IPSwitchPowermeter, HMEvent, HelperActionPress): """ Switch turning plugged in device on or off and measuring energy consumption. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS_SHORT": [1, 2], "PRESS_LONG": [1, 2]}) class IPGarage(GenericSwitch, GenericBlind, HMSensor): """ HmIP-MOD-HO and HmIP-MOD-TM Garage actor """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"DOOR_STATE": [1]}) def is_closed(self, state): """Returns whether the door is closed""" # States: # 0: closed # 1: open # 2: ventilation # 3: unknown if state in [2, 3]: return None return state == 0 def move_up(self, channel=1): """Opens the garage""" # channel needs to be hardcoded to "1"; home assistant somehow calls the cover entity with channel=2 # and then the command does not work. return self.setValue("DOOR_COMMAND", 1, channel=1) def stop(self, channel=1): """Stop motion""" # channel needs to be hardcoded to "1"; home assistant somehow calls the cover entity with channel=2 # and then the command does not work. return self.setValue("DOOR_COMMAND", 2, channel=1) def move_down(self, channel=1): """Close the garage""" # channel needs to be hardcoded to "1"; home assistant somehow calls the cover entity with channel=2 # and then the command does not work. return self.setValue("DOOR_COMMAND", 3, channel=1) def vent(self): """Go to ventilation position""" return self.setValue("DOOR_COMMAND", 4, channel=1) @property def ELEMENT(self): return [2] class IPGarageSwitch(GenericSwitch, HelperEventRemote, HMSensor): """ HmIP-WGC Garage Actor """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"LOW_BAT": [0], "OPERATING_VOLTAGE": [0], "RSSI_DEVICE": [0], "RSSI_PEER": [0]}) @property def ELEMENT(self): return [3] class IPMultiIO(IPSwitch): """ HmIP-MIOB Multi IO Box """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"CHANGE_OVER": [9, 10], "EXTERNAL_CLOCK": [9, 10], "HUMIDITY_LIMITER": [9, 10], "STATE": [9, 10], "TACTILE_SWITCH": [9, 10], "TEMPERATURE_LIMITER": [9, 10]}) self.SENSORNODE.update({"LEVEL": [11]}) @property def ELEMENT(self): return [2, 3, 4, 6, 7, 8] class ColorEffectLight(Dimmer): """ Color light with dimmer function and color effects. """ _level_channel = 1 _color_channel = 2 _effect_channel = 3 _light_effect_list = ['Off', 'Slow color change', 'Medium color change', 'Fast color change', 'Campfire', 'Waterfall', 'TV simulation'] def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"COLOR": [self._color_channel], "PROGRAM": [self._effect_channel]}) # pylint: disable=unused-argument def get_hs_color(self, channel=None): """ Return the color of the light as HSV color without the "value" component for the brightness. Returns (hue, saturation) tuple with values in range of 0-1, representing the H and S component of the HSV color system. """ # Get the color from homematic. In general this is just the hue parameter. hm_color = self.getCachedOrUpdatedValue("COLOR", channel=self._color_channel) if hm_color >= 200: # 200 is a special case (white), so we have a saturation of 0. # Larger values are undefined. For the sake of robustness we return "white" anyway. return 0, 0 # For all other colors we assume saturation of 1 return hm_color/200, 1 # pylint: disable=unused-argument def set_hs_color(self, hue: float, saturation: float, channel=None): """ Set a fixed color and also turn off effects in order to see the color. :param hue: Hue component (range 0-1) :param saturation: Saturation component (range 0-1). Yields white for values near 0, other values are interpreted as 100% saturation. The input values are the components of an HSV color without the value/brightness component. Example colors: * Green: set_hs_color(120/360, 1) * Blue: set_hs_color(240/360, 1) * Yellow: set_hs_color(60/360, 1) * White: set_hs_color(0, 0) """ self.turn_off_effect() if saturation < 0.1: # Special case (white) hm_color = 200 else: hm_color = int(round(max(min(hue, 1), 0) * 199)) self.setValue(key="COLOR", channel=self._color_channel, value=hm_color) def get_effect_list(self) -> list: """Return the list of supported effects.""" return self._light_effect_list def get_effect(self) -> str: """Return the current color change program of the light.""" effect_value = self.getCachedOrUpdatedValue("PROGRAM", channel=self._effect_channel) try: return self._light_effect_list[effect_value] except IndexError: LOG.error("Unexpected color effect returned by CCU") return "Unknown" def set_effect(self, effect_name: str): """Sets the color change program of the light.""" try: effect_index = self._light_effect_list.index(effect_name) except ValueError: LOG.error("Trying to set unknown light effect") return False return self.setValue(key="PROGRAM", channel=self._effect_channel, value=effect_index) def turn_off_effect(self): return self.set_effect(self._light_effect_list[0]) class ColdWarmDimmer(Dimmer): """ Dimmer with controls for Cold and Warm LEDs. """ _level_channel = 1 _temp_channel = 2 def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"LEVEL": [self._level_channel, self._temp_channel]}) # pylint: disable=unused-argument def get_color_temp(self, channel=None): """ Return the color temperature. Returns the color temperature with 0 being the warmest and 1 the coldest value """ return self.getCachedOrUpdatedValue("LEVEL", channel=self._temp_channel) # pylint: disable=unused-argument def set_color_temp(self, color_temp: float, channel=None): """ Set the color temperature. :param color_temp: Color temperature (range 0:warmest - 1:coldest) """ # Ensure color_temp is within range color_temp = max(0.0, color_temp) color_temp = min(1.0, color_temp) return self.setValue(key="LEVEL", channel=self._temp_channel, value=color_temp) class IPMultiIOPCB(GenericSwitch, HelperRssiDevice, HelperRssiPeer): """HmIP-MIO16-PCB""" def __init__(self, device_description, proxy, resolveparamsets=False): # Input channels (analog inputs 0-12V) self._aic = [1, 4, 7, 10] # Input channels (digital low active inputs) self._dic = [13, 14, 15, 16] # Output channels # CH18, CH22, CH26, CH30: relay outputs (24 V/0,5 A) # CH34, CH38, CH42, CH46: open collector outputs (30 V/0,2 A) self._doc = [18, 22, 26, 30, 34, 38, 42, 46] super().__init__(device_description, proxy, resolveparamsets) self._keypress_event_channels = [] self._binarysensor_channels = [] self._channel_operation_mode = 0 # Get Operation Mode for Input Channels for chan in self._dic: try: self._channel_operation_mode = self._proxy.getParamset("%s:%i" % (self._ADDRESS, chan), "MASTER").get("CHANNEL_OPERATION_MODE", None) if self._channel_operation_mode == 1: self._keypress_event_channels.append(chan) elif self._channel_operation_mode != 0: self._binarysensor_channels.append(chan) except Exception as err: LOG.error("IPMultiIOPCB: Failure to determine input channel operations mode of IPMultiIOPCB %s:%i %s", self._ADDRESS, chan, err) self.BINARYNODE.update({"STATE": self._binarysensor_channels}) self.SENSORNODE.update({"VOLTAGE": self._aic}) # button events not successfully implemented yet (SHORT_PRESS, LOMG_PRESS) def get_voltage(self, channel=None): """Return analog input in V""" return float(self.getSensorData("VOLTAGE", channel)) @property def ELEMENT(self): return self._doc class IPWHS2(GenericSwitch, HelperActionOnTime, HelperRssiDevice): """ HmIP-WHS2 Central Heating and Hot Water actuator """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # Channels 1 and 5 show the state of physical output 1 and 2 respectively. self.BINARYNODE.update({"STATE": [1, 5]}) @property def ELEMENT(self): return [2, 6] DEVICETYPES = { "HM-LC-Bl1-SM": Blind, "HM-LC-Bl1-SM-2": Blind, "HM-LC-Bl1-FM": Blind, "HM-LC-Bl1-FM-2": Blind, "HM-LC-Bl1PBU-FM": Blind, "HM-LC-Bl1-PB-FM": Blind, "HM-LC-Ja1PBU-FM": Blind, "ZEL STG RM FEP 230V": Blind, "263 146": Blind, "263 147": Blind, "HM-LC-BlX": Blind, "HM-Sec-Win": Blind, "HmIP-BROLL": IPKeyBlind, "HmIP-BROLL-2": IPKeyBlind, "HmIP-FROLL": IPKeyBlind, "HmIP-BBL": IPKeyBlindTilt, "HmIP-FBL": IPKeyBlindTilt, "HmIP-DRBLI4": IPKeyBlindMulti, "HM-LC-Dim1L-Pl": Dimmer, "HM-LC-Dim1L-Pl-2": Dimmer, "HM-LC-Dim1L-Pl-3": Dimmer, "HM-LC-Dim1L-CV": Dimmer, "HM-LC-Dim1L-CV-2": Dimmer, "HM-LC-Dim1T-Pl": Dimmer, "HM-LC-Dim1T-Pl-2": Dimmer, "HM-LC-Dim1T-Pl-3": Dimmer, "HM-LC-Dim1T-CV": Dimmer, "HM-LC-Dim1T-CV-2": Dimmer, "HM-LC-Dim1T-DR": Dimmer, "HM-LC-Dim1T-FM": Dimmer, "HM-LC-Dim1T-FM-2": Dimmer, "HM-LC-Dim1T-FM-LF": Dimmer, "HM-LC-Dim1PWM-CV": Dimmer, "HM-LC-Dim1PWM-CV-2": Dimmer, "HM-LC-Dim1TPBU-FM": Dimmer, "HM-LC-Dim1TPBU-FM-2": Dimmer, "HM-LC-Dim2L-CV": Dimmer, "HM-LC-Dim2L-SM": Dimmer, "HM-LC-Dim2L-SM-2": Dimmer, "HM-LC-Dim2T-SM": Dimmer, "HM-LC-Dim2T-SM-2": Dimmer, "HSS-DX": Dimmer, "263 132": Dimmer, "263 133": Dimmer, "263 134": Dimmer, "HM-Dis-TD-T": Switch, "HM-OU-CF-Pl": Switch, "HM-OU-CM-PCB": Switch, "HM-OU-CFM-Pl": Switch, "HM-OU-CFM-TW": Switch, "HM-LC-Sw1-PCB": Switch, "HM-LC-Sw1-Pl": Switch, "HM-LC-Sw1-Pl-2": Switch, "HM-LC-Sw1-Pl-3": Switch, "HM-LC-Sw1-Pl-DN-R1": Switch, "HM-LC-Sw1-Pl-DN-R2": Switch, "HM-LC-Sw1-Pl-DN-R3": Switch, "HM-LC-Sw1-Pl-DN-R4": Switch, "HM-LC-Sw1-Pl-DN-R5": Switch, "HM-LC-Sw1-Pl-CT-R1": Switch, "HM-LC-Sw1-Pl-CT-R2": Switch, "HM-LC-Sw1-Pl-CT-R3": Switch, "HM-LC-Sw1-Pl-CT-R4": Switch, "HM-LC-Sw1-Pl-CT-R5": Switch, "HM-LC-Sw1-Pl-OM54": Switch, "HM-LC-Sw1-DR": Switch, "HM-LC-Sw1-SM": Switch, "HM-LC-Sw1-SM-2": Switch, "HM-LC-Sw1-FM": Switch, "HM-LC-Sw1-FM-2": Switch, "HM-LC-Sw1-PB-FM": Switch, "HM-LC-Sw1-Ba-PCB": Switch, "HM-LC-Sw1-SM-ATmega168": Switch, "HM-LC-Sw1PBU-FM": Switch, "HM-LC-Sw2-SM": Switch, "HM-LC-Sw2-FM": Switch, "HM-LC-Sw2-FM-2": Switch, "HM-LC-Sw2-DR": Switch, "HM-LC-Sw2-DR-2": Switch, "HM-LC-Sw2-PB-FM": Switch, "HM-LC-Sw2PBU-FM": Switch, "HM-LC-Sw4-Ba-PCB": Switch, "HM-LC-Sw4-SM": Switch, "HM-LC-Sw4-SM-2": Switch, "HM-LC-Sw4-SM-ATmega168": Switch, "HM-LC-Sw4-PCB": Switch, "HM-LC-Sw4-PCB-2": Switch, "HM-LC-Sw4-WM": Switch, "HM-LC-Sw4-WM-2": Switch, "HM-LC-Sw4-DR": Switch, "HM-LC-Sw4-DR-2": Switch, "263 130": Switch, "263 131": Switch, "ZEL STG RM FZS": Switch, "ZEL STG RM FZS-2": Switch, "HM-LC-SwX": Switch, "HM-MOD-Re-8": Switch, "IT-Switch": Switch, "REV-Ritter-Switch": Switch, "HM-Sec-SFA-SM": Switch, "HM-ES-PMSw1-Pl": SwitchPowermeter, "HM-ES-PMSw1-Pl-DN-R1": SwitchPowermeter, "HM-ES-PMSw1-Pl-DN-R2": SwitchPowermeter, "HM-ES-PMSw1-Pl-DN-R3": SwitchPowermeter, "HM-ES-PMSw1-Pl-DN-R4": SwitchPowermeter, "HM-ES-PMSw1-Pl-DN-R5": SwitchPowermeter, "HM-ES-PMSw1-DR": SwitchPowermeter, "HM-ES-PMSw1-SM": SwitchPowermeter, "HM-ES-PMSwX": SwitchPowermeter, "HMW-IO-12-Sw7-DR": IOSwitch, "HMW-IO-12-Sw14-DR": HMWIOSwitch, "HMW-IO-12-FM": IOSwitchNoInhibit, "HMW-LC-Sw2-DR": IOSwitch, "HB-LC-Sw2PBU-FM": IOSwitchWireless, "HMW-LC-Bl1-DR": KeyBlind, "HMW-LC-Bl1-DR-2": KeyBlind, "HMW-LC-Dim1L-DR": KeyDimmer, "HmIPW-DRS4": IPWSwitch, "HmIPW-DRS8": IPWSwitch, "HmIPW-DRI32": IPWInputDevice, "HmIPW-DRI16": IPWInputDevice, "HmIPW-FIO6": IPWIODevice, "HmIPW-DRD3": IPWDimmer, "HmIPW-DRBL4": IPWKeyBlindMulti, "HMIP-PS": IPSwitch, "HmIP-PS": IPSwitch, "HmIP-PS-CH": IPSwitch, "HmIP-PS-PE": IPSwitch, "HmIP-PS-UK": IPSwitch, "HmIP-PCBS": IPSwitch, "HmIP-PCBS2": IPSwitch, "HmIP-PCBS-BAT": IPSwitchBattery, "HmIP-PMFS": IPSwitch, "HmIP-MOD-OC8": IPSwitch, "HmIP-DRSI1": IPSwitchRssiDevice, "HmIP-DRSI4": IPSwitch, "HmIP-BSL": IPKeySwitchLevel, "HmIP-USBSM": IPSwitchPowermeter, "HMIP-PSM": IPSwitchPowermeter, "HmIP-PSM": IPSwitchPowermeter, "HmIP-PSM-2": IPSwitchPowermeter, "HmIP-PSM-CH": IPSwitchPowermeter, "HmIP-PSM-IT": IPSwitchPowermeter, "HmIP-PSM-PE": IPSwitchPowermeter, "HmIP-PSM-UK": IPSwitchPowermeter, "HmIP-FSI16": IPSwitch, "HmIP-FSM": IPSwitchPowermeter, "HmIP-FSM16": IPSwitchPowermeter, "HmIP-BSM": IPKeySwitchPowermeter, "HMIP-BDT": IPKeyDimmer, "HmIP-BDT": IPKeyDimmer, "HmIP-DRDI3": IPKeyDimmer, "HmIP-FDT": IPDimmer, "HmIP-PDT": IPDimmer, "HmIP-PDT-UK": IPDimmer, "HM-Sec-Key": KeyMatic, "HM-Sec-Key-S": KeyMatic, "HM-Sec-Key-O": KeyMatic, "HM-Sec-Key-Generic": KeyMatic, "HM-Sen-RD-O": Rain, "ST6-SH": EcoLogic, "HM-Sec-Sir-WM": RFSiren, "HmIP-MOD-HO": IPGarage, "HmIP-MOD-TM": IPGarage, "HmIP-WGC": IPGarageSwitch, "HM-LC-RGBW-WM": ColorEffectLight, "HmIP-MIOB": IPMultiIO, "HM-DW-WM": Dimmer, "HM-LC-DW-WM": ColdWarmDimmer, "HB-UNI-RGB-LED-CTRL": ColorEffectLight, "HmIP-MIO16-PCB": IPMultiIOPCB, "HmIP-WHS2": IPWHS2, } danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/generic.py000066400000000000000000000363151455774063600260420ustar00rootroot00000000000000import logging LOG = logging.getLogger(__name__) # Parameter operations. Just needed if we would get the paramset-descriptions to do some auto-configuration magic. PARAM_OPERATION_READ = 1 PARAM_OPERATION_WRITE = 2 PARAM_OPERATION_EVENT = 4 PARAM_UNREACH = 'UNREACH' PARAMSET_VALUES = 'VALUES' class HMGeneric(): # pylint: disable=unused-argument def __init__(self, device_description, proxy, resolveparamsets): # These properties are available for every device and its channels self._ADDRESS = device_description.get('ADDRESS') LOG.debug("HMGeneric.__init__: device_description: " + str(self._ADDRESS) + " : " + str(device_description)) self._FAMILY = device_description.get('FAMILY') self._FLAGS = device_description.get('FLAGS') self._ID = device_description.get('ID') self._PARAMSETS = device_description.get('PARAMSETS') self._PARAMSET_DESCRIPTIONS = {} self._TYPE = device_description.get('TYPE') self._VERSION = device_description.get('VERSION') self._proxy = proxy self._paramsets = {} self._eventcallbacks = [] self._name = None self._VALUES = {} # Dictionary to cache values. They are updated in the event() function. self._VALUES[PARAM_UNREACH] = None @property def ADDRESS(self): return self._ADDRESS @property def TYPE(self): return self._TYPE @property def PARAMSETS(self): return self._paramsets @property def NAME(self): return self._name @NAME.setter def NAME(self, name): self._name = name def event(self, interface_id, key, value): """ Handle the event received by server. """ LOG.debug( "HMGeneric.event: address=%s, interface_id=%s, key=%s, value=%s" % (self._ADDRESS, interface_id, key, value)) self._VALUES[key] = value # Cache the value for callback in self._eventcallbacks: LOG.debug("HMGeneric.event: Using callback %s", str(callback)) callback(self._ADDRESS, interface_id, key, value) def getParamsetDescription(self, paramset): """ Descriptions for paramsets are available to determine what can be don with the device. """ try: self._PARAMSET_DESCRIPTIONS[paramset] = self._proxy.getParamsetDescription(self._ADDRESS, paramset) except Exception as err: LOG.error("HMGeneric.getParamsetDescription: Exception: %s", err) return False def updateParamset(self, paramset): """ Devices should not update their own paramsets. They rely on the state of the server. Hence we pull the specified paramset. """ try: if paramset: if self._proxy: returnset = self._proxy.getParamset(self._ADDRESS, paramset) if returnset: self._paramsets[paramset] = returnset if self.PARAMSETS: if self.PARAMSETS.get(PARAMSET_VALUES): self._VALUES[PARAM_UNREACH] = self.PARAMSETS.get(PARAMSET_VALUES).get(PARAM_UNREACH) return True return False except Exception as err: LOG.debug("HMGeneric.updateParamset: Exception: %s, %s, %s" % (str(err), str(self._ADDRESS), str(paramset))) return False def updateParamsets(self): """ Devices should update their own paramsets. They rely on the state of the server. Hence we pull all paramsets. """ try: for ps in self._PARAMSETS: self.updateParamset(ps) return True except Exception as err: LOG.error("HMGeneric.updateParamsets: Exception: %s", err) return False def putParamset(self, paramset, data={}, rx_mode=None): """ Some devices act upon changes to paramsets. A "putted" paramset must not contain all keys available in the specified paramset, just the ones which are writable and should be changed. """ try: if paramset in self._PARAMSETS and data: if rx_mode is None: self._proxy.putParamset(self._ADDRESS, paramset, data) else: self._proxy.putParamset(self._ADDRESS, paramset, data, rx_mode) # We update all paramsets to at least have a temporarily accurate state for the device. # This might not be true for tasks that take long to complete (lifting a rollershutter completely etc.). # For this the server-process has to call the updateParamsets-method when it receives events for the device. self.updateParamsets() return True else: return False except Exception as err: LOG.error("HMGeneric.putParamset: Exception: %s", err) return False class HMChannel(HMGeneric): def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # These properties only exist for device-channels self._PARENT = device_description.get('PARENT') self._AES_ACTIVE = device_description.get('AES_ACTIVE') self._DIRECTION = device_description.get('DIRECTION') self._INDEX = device_description.get('INDEX') self._LINK_SOURCE_ROLES = device_description.get('LINK_SOURCE_ROLES') self._LINK_TARGET_ROLES = device_description.get('LINK_TARGET_ROLES') self._PARENT_TYPE = device_description.get('PARENT_TYPE') # We set the name to the parents address initially self._name = device_description.get('ADDRESS') # Optional properties of device-channels self._GROUP = device_description.get('GROUP') self._TEAM = device_description.get('TEAM') self._TEAM_TAG = device_description.get('TEAM_TAG') self._TEAM_CHANNELS = device_description.get('TEAM_CHANNELS') # Not in specification, but often present self._CHANNEL = device_description.get('CHANNEL') if resolveparamsets: self.updateParamsets() def getCachedOrUpdatedValue(self, key): """ Gets the device's value with the given key. If the key is not found in the cache, the value is queried from the host. """ try: return self._VALUES[key] except KeyError: return self.getValue(key) @property def PARENT(self): return self._PARENT @property def UNREACH(self): """ Returns true if children is not reachable """ return bool(self._VALUES.get(PARAM_UNREACH, False)) def setEventCallback(self, callback): """ Set additional event callbacks for the channel. Signature for callback-functions: foo(address, interface_id, key, value). """ if hasattr(callback, '__call__'): self._eventcallbacks.append(callback) def setValue(self, key, value): """ Some devices allow to directly set values to perform a specific task. """ LOG.debug("HMGeneric.setValue: address = '%s', key = '%s' value = '%s'", self._ADDRESS, key, value) try: self._proxy.setValue(self._ADDRESS, key, value) return True except Exception as err: LOG.error("HMGeneric.setValue: %s on %s Exception: %s", key, self._ADDRESS, err) return False def getValue(self, key): """ Some devices allow to directly get values for specific parameters. """ LOG.debug("HMGeneric.getValue: address = '%s', key = '%s'", self._ADDRESS, key) try: returnvalue = self._proxy.getValue(self._ADDRESS, key) self._VALUES[key] = returnvalue return returnvalue except Exception as err: LOG.info("HMGeneric.getValue: %s on %s Exception: %s", key, self._ADDRESS, err) return False class HMDevice(HMGeneric): def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self._hmchannels = {} # Data point information # "NODE_NAME": channel # for channel is possible: # - c / getVaule from channel (dynamic) # - 0...n / getValue from channel (fix) self._SENSORNODE = {} self._BINARYNODE = {} self._ATTRIBUTENODE = {} self._WRITENODE = {} self._EVENTNODE = {} self._ACTIONNODE = {} # These properties only exist for interfaces themselves self._CHILDREN = device_description.get('CHILDREN') self._RF_ADDRESS = device_description.get('RF_ADDRESS') # We set the name to the address initially self._name = device_description.get('ADDRESS') # Optional properties might not always be present if 'CHANNELS' in device_description: self._CHANNELS = device_description['CHANNELS'] else: self._CHANNELS = [] self._PHYSICAL_ADDRESS = device_description.get('PHYSICAL_ADDRESS') self._INTERFACE = device_description.get('INTERFACE') self._ROAMING = device_description.get('ROAMING') self._RX_MODE = device_description.get('RX_MODE') self._FIRMWARE = device_description.get('FIRMWARE') self._AVAILABLE_FIRMWARE = device_description.get('AVAILABLE_FIRMWARE') self._UPDATABLE = device_description.get('UPDATABLE') self._PARENT_TYPE = None def getCachedOrUpdatedValue(self, key, channel=None): """ Gets the channel's value with the given key. If the key is not found in the cache, the value is queried from the host. If 'channel' is given, the respective channel's value is returned. """ if channel: return self._hmchannels[channel].getCachedOrUpdatedValue(key) try: return self._VALUES[key] except KeyError: value = self._VALUES[key] = self.getValue(key) return value @property def UNREACH(self): """ Returns true if the device or any children is not reachable """ if self._VALUES.get(PARAM_UNREACH, False): return True else: for device in self._hmchannels.values(): if device.UNREACH: return True return False @property def CHANNELS(self): return self._hmchannels @property def SENSORNODE(self): return self._SENSORNODE @property def BINARYNODE(self): return self._BINARYNODE @property def ATTRIBUTENODE(self): return self._ATTRIBUTENODE @property def WRITENODE(self): return self._WRITENODE @property def EVENTNODE(self): return self._EVENTNODE @property def ACTIONNODE(self): return self._ACTIONNODE def getAttributeData(self, name, channel=None): """ Returns a attribut """ return self._getNodeData(name, self._ATTRIBUTENODE, channel) def getBinaryData(self, name, channel=None): """ Returns a binary node """ return self._getNodeData(name, self._BINARYNODE, channel) def getSensorData(self, name, channel=None): """ Returns a sensor node """ return self._getNodeData(name, self._SENSORNODE, channel) def getWriteData(self, name, channel=None): """ Returns a sensor node """ return self._getNodeData(name, self._WRITENODE, channel) def _getNodeData(self, name, metadata, channel=None): """ Returns a data point from data""" nodeChannel = None if name in metadata: nodeChannelList = metadata[name] if len(nodeChannelList) > 1: nodeChannel = channel if channel is not None else nodeChannelList[0] elif len(nodeChannelList) == 1: nodeChannel = nodeChannelList[0] else: LOG.warning("HMDevice._getNodeData: %s not found in %s, empty nodeChannelList" % (name, metadata)) return None if nodeChannel is not None and nodeChannel in self.CHANNELS: return self._hmchannels[nodeChannel].getValue(name) LOG.error("HMDevice._getNodeData: %s not found in %s" % (name, metadata)) return None def writeNodeData(self, name, data, channel=None): return self._setNodeData(name, self.WRITENODE, data, channel) def actionNodeData(self, name, data, channel=None): return self._setNodeData(name, self.ACTIONNODE, data, channel) def _setNodeData(self, name, metadata, data, channel=None): """ Returns a data point from data""" nodeChannel = None if name in metadata: nodeChannelList = metadata[name] if len(nodeChannelList) > 1: nodeChannel = channel if channel is not None else nodeChannelList[0] elif len(nodeChannelList) == 1: nodeChannel = nodeChannelList[0] if nodeChannel is not None and nodeChannel in self.CHANNELS: return self._hmchannels[nodeChannel].setValue(name, data) LOG.error("HMDevice.setNodeData: %s not found with value %s on %i" % (name, data, nodeChannel)) return False def get_rssi(self, channel=0): """ This is a stub method which is implemented by the helpers HelperRssiPeer/HelperRssiDevice in order to provide a suitable implementation for the device. """ #pylint: disable=unused-argument return 0 @property def ELEMENT(self): """ Returns count of elements for same functionality. Overwrite this value only if you have a special device such as Sw2 etc. """ return [1] def setEventCallback(self, callback, bequeath=True, channel=0): """ Set additional event callbacks for the device. Set the callback for specific channels or use the device itself and let it bequeath the callback to all of its children. Signature for callback-functions: foo(address, interface_id, key, value) """ if hasattr(callback, '__call__'): if channel == 0: self._eventcallbacks.append(callback) elif not bequeath and channel > 0 and channel in self._hmchannels: self._hmchannels[channel]._eventcallbacks.append(callback) if bequeath: for channel, device in self._hmchannels.items(): device._eventcallbacks.append(callback) def setValue(self, key, value, channel=1): """ Some devices allow to directly set values to perform a specific task. """ if channel in self.CHANNELS: return self.CHANNELS[channel].setValue(key, value) LOG.error("HMDevice.setValue: channel not found %i!" % channel) def getValue(self, key, channel=1): """ Some devices allow to directly get values for specific parameters. """ if channel in self.CHANNELS: return self.CHANNELS[channel].getValue(key) LOG.error("HMDevice.getValue: channel not found %i!" % channel) danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/helper.py000066400000000000000000000266701455774063600257100ustar00rootroot00000000000000import logging from pyhomematic.devicetypes.generic import HMDevice LOG = logging.getLogger(__name__) class HelperSabotage(HMDevice): """This helper adds sabotage detection.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"ERROR": self.ELEMENT}) def sabotage(self, channel=None): """Returns True if the devicecase has been opened.""" return bool(self.getAttributeData("ERROR", channel)) class HelperSabotageIP(HMDevice): """This helper adds sabotage detection.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"SABOTAGE": [0]}) # pylint: disable=unused-argument def sabotage(self, channel=None): """Returns True if the devicecase has been opened.""" return bool(self.getAttributeData("SABOTAGE", 0)) class HelperLowBat(HMDevice): """This Helper adds easy access to read the LOWBAT state""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"LOWBAT": [0]}) def low_batt(self, channel=None): """ Returns if the battery is low. """ return self.getAttributeData("LOWBAT", channel) class HelperLowBatIP(HMDevice): """This Helper adds easy access to read the LOWBAT state""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"LOW_BAT": [0]}) # pylint: disable=unused-argument def low_batt(self, channel=None): """ Returns if the battery is low. """ return self.getAttributeData("LOW_BAT", 0) class HelperOperatingVoltageIP(HMDevice): """This Helper adds easy access to read the OPERATING_VOLTAGE state""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"OPERATING_VOLTAGE": [0]}) # pylint: disable=unused-argument def operation_voltage(self, channel=None): """ Returns the operating voltage. """ return float(self.getAttributeData("OPERATING_VOLTAGE", 0)) class HelperWorking(HMDevice): """This helper provides access to the WORKING state of some devices.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ATTRIBUTENODE.update({"WORKING": self.ELEMENT}) def is_working(self, channel=None): """Return True of False if working or not""" return self.getAttributeData("WORKING", channel) class HelperBatteryState(HMDevice): """View the current state of the devices battery if available.""" def battery_state(self): """ Returns the current battery state. """ return float(self.getAttributeData("BATTERY_STATE")) class HelperValveState(HMDevice): """View the valve state of thermostats and valve controllers.""" def valve_state(self): """ Returns the current valve state. """ return int(self.getAttributeData("VALVE_STATE")) class HelperBinaryState(HMDevice): """Return the state of binary sensors.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"STATE": self.ELEMENT}) def get_state(self, channel=None): """ Returns current state of handle """ return bool(self.getBinaryData("STATE", channel)) class HelperSensorState(HMDevice): """Return the state of binary sensors.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"STATE": self.ELEMENT}) def get_state(self, channel=None): """ Returns current state of handle """ return self.getSensorData("STATE", channel) class HelperActorState(HMDevice): """Return the binary state of an actor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"STATE": self.ELEMENT}) def get_state(self, channel=None): """ Returns if state is 'on' or 'off'. """ return bool(self.getWriteData("STATE", channel)) def set_state(self, onoff, channel=None): """Turn state on/off""" try: onoff = bool(onoff) except Exception as err: LOG.debug("HelperActorState.set_state: Exception %s" % (err,)) return False self.writeNodeData("STATE", onoff, channel) class HelperActorLevel(HMDevice): """ Generic level functions """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"LEVEL": self.ELEMENT}) def get_level(self, channel=None): """Return current level. Return value is float() from 0.0 to 1.0.""" return self.getWriteData("LEVEL", channel) def set_level(self, position, channel=None): """Seek a specific value by specifying a float() from 0.0 to 1.0.""" try: position = float(position) except Exception as err: LOG.debug("HelperLevel.set_level: Exception %s" % (err,)) return False self.writeNodeData("LEVEL", position, channel) class HelperInhibit(HMDevice): """ Generic inhibit functions Inhibit causes an actor to be in locked state, refusing to accept commands except from CCU or API This is only supported for HomeMatic components NOT for HomeMatic IP. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"INHIBIT": self.ELEMENT}) def get_inhibit(self, channel=None): """Return current inhibit status. Return value is 'on' or 'off'.""" return self.getWriteData("INHIBIT", channel) def set_inhibit(self, inhibit, channel=None): """Turn inhibit 'on' or 'off'.""" try: inhibit = bool(inhibit) except Exception as err: LOG.debug("HelperInhibit.set_inhibit: Exception %s" % (err,)) return False self.writeNodeData("INHIBIT", inhibit, channel) class HelperActorBlindTilt(HMDevice): """ Generic shutter level functions """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.WRITENODE.update({"LEVEL_2": self.ELEMENT, "LEVEL": self.ELEMENT}) def get_cover_tilt_position(self, channel=None): """Return current level. Return value is float() from 0.0 to 1.0.""" return self.getWriteData("LEVEL_2", channel) def set_cover_tilt_position(self, position, channel=None): """Seek a specific value by specifying a float() from 0.0 to 1.0.""" try: position = float(position) except Exception as err: LOG.debug("HelperActorBlindTilt.set_level_2: Exception %s" % (err,)) return False level = self.getWriteData("LEVEL", channel) self.writeNodeData("LEVEL_2", position, channel) # set level after level_2 to have level_2 updated self.writeNodeData("LEVEL", level, channel) class HelperActionOnTime(HMDevice): def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.ACTIONNODE.update({"ON_TIME": self.ELEMENT}) def set_ontime(self, ontime): """Set duration th switch stays on when toggled. """ try: ontime = float(ontime) except Exception as err: LOG.debug("SwitchPowermeter.set_ontime: Exception %s" % (err,)) return False self.actionNodeData("ON_TIME", ontime) class HelperActionPress(HMDevice): """Helper for simulate press button.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ACTIONNODE.update({"PRESS_SHORT": self.ELEMENT, "PRESS_LONG": self.ELEMENT}) def press_long(self, channel=None): """Simulat a button press long.""" self.actionNodeData("PRESS_LONG", 1, channel) def press_short(self, channel=None): """Simulat a button press short.""" self.actionNodeData("PRESS_SHORT", 1, channel) class HelperEventPress(HMDevice): """Remote handle buttons.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS": self.ELEMENT}) class HelperEventRemote(HMDevice): """Remote handle buttons.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS_SHORT": self.ELEMENT, "PRESS_LONG": self.ELEMENT, "PRESS_CONT": self.ELEMENT, "PRESS_LONG_RELEASE": self.ELEMENT}) class HelperWired(HMDevice): """Remove the RSSI-related attributes""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ATTRIBUTENODE.pop("RSSI_PEER", None) self.ATTRIBUTENODE.pop("RSSI_DEVICE", None) class HelperRssiDevice(HMDevice): """Used for devices which report their RSSI value through RSSI_DEVICE""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ATTRIBUTENODE["RSSI_DEVICE"] = [0] def get_rssi(self, channel=0): return self.getAttributeData("RSSI_DEVICE", channel) class HelperRssiPeer(HMDevice): """Used for devices which report their RSSI value through RSSI_PEER""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ATTRIBUTENODE["RSSI_PEER"] = [0] def get_rssi(self, channel=0): return self.getAttributeData("RSSI_PEER", channel) class HelperDeviceTemperature(HMDevice): """Used for devices that report their actual device temperature values (such as the HmIP Wired devices)""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ATTRIBUTENODE["ACTUAL_TEMPERATURE"] = [0] def get_device_temperature(self, channel=0): return self.getAttributeData("ACTUAL_TEMPERATURE", channel) danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/json/000077500000000000000000000000001455774063600250155ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/json/device_descriptions.json000066400000000000000000007172411455774063600317510ustar00rootroot00000000000000[ { "ADDRESS": "BidCoS-RF", "CHILDREN": [ "BidCoS-RF:0", "BidCoS-RF:1", "BidCoS-RF:2" ], "FIRMWARE": "2.31.25", "FLAGS": 9, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 1, "TYPE": "HM-RCV-50", "UPDATABLE": 0, "VERSION": 6 }, { "ADDRESS": "BidCoS-RF:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "BidCoS-RF", "PARENT_TYPE": "HM-RCV-50", "TYPE": "MAINTENANCE", "VERSION": 6 }, { "ADDRESS": "BidCoS-RF:1", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "BidCoS-RF", "PARENT_TYPE": "HM-RCV-50", "TYPE": "VIRTUAL_KEY", "VERSION": 6 }, { "ADDRESS": "BidCoS-RF:2", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 2, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "BidCoS-RF", "PARENT_TYPE": "HM-RCV-50", "TYPE": "VIRTUAL_KEY", "VERSION": 6 }, { "ADDRESS": "VCU0000001", "CHILDREN": [ "VCU0000001:0", "VCU0000001:1" ], "FIRMWARE": "1.5", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 1, "TYPE": "HM-LC-Bl1-FM", "UPDATABLE": 0, "VERSION": 1 }, { "ADDRESS": "VCU0000001:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000001", "PARENT_TYPE": "HM-LC-Bl1-FM", "TYPE": "MAINTENANCE", "VERSION": 1 }, { "ADDRESS": "VCU0000001:1", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WEATHER_CS", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000001", "PARENT_TYPE": "HM-LC-Bl1-FM", "TYPE": "BLIND", "VERSION": 1 }, { "ADDRESS": "VCU0000002", "CHILDREN": [ "VCU0000002:0", "VCU0000002:1" ], "FIRMWARE": "2.2", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 12, "TYPE": "HM-Sec-SC-2", "UPDATABLE": 0, "VERSION": 16 }, { "ADDRESS": "VCU0000002:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000002", "PARENT_TYPE": "HM-Sec-SC-2", "TYPE": "MAINTENANCE", "VERSION": 16 }, { "ADDRESS": "VCU0000002:1", "AES_ACTIVE": 1, "DIRECTION": 1, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000002", "PARENT_TYPE": "HM-Sec-SC-2", "TYPE": "SHUTTER_CONTACT", "VERSION": 16 }, { "ADDRESS": "VCU0000003", "CHILDREN": [ "VCU0000003:0", "VCU0000003:1", "VCU0000003:2", "VCU0000003:3", "VCU0000003:4", "VCU0000003:5", "VCU0000003:6" ], "FIRMWARE": "1.4", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234657, "ROAMING": 0, "RX_MODE": 14, "TYPE": "HM-CC-RT-DN", "UPDATABLE": 1, "VERSION": 29 }, { "ADDRESS": "VCU0000003:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "MAINTENANCE", "VERSION": 29 }, { "ADDRESS": "VCU0000003:1", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "WEATHER_T WEATHER_TH", "PARAMSETS": [ "LINK", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "WEATHER_RECEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000003:2", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 2, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "THERMALCONTROL_TC", "PARAMSETS": [ "LINK", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "CLIMATECONTROL_RECEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000003:3", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 3, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "WCS_TIPTRONIC_SENSOR WINDOW_SWITCH_RECEIVER WINDOW_SWITCH_RECEIVER_V2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "WINDOW_SWITCH_RECEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000003:4", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 4, "LINK_SOURCE_ROLES": "CLIMATECONTROL_RT", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "CLIMATECONTROL_RT_TRANSCEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000003:5", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 5, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "CLIMATECONTROL_RT", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "CLIMATECONTROL_RT_RECEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000003:6", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 6, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "REMOTECONTROL_RECEIVER", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000003", "PARENT_TYPE": "HM-CC-RT-DN", "TYPE": "REMOTECONTROL_RECEIVER", "VERSION": 29 }, { "ADDRESS": "VCU0000004", "CHILDREN": [ "VCU0000004:0", "VCU0000004:1", "VCU0000004:2", "VCU0000004:3", "VCU0000004:6", "VCU0000004:7" ], "FIRMWARE": "1.3", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 6, "TYPE": "HM-TC-IT-WM-W-EU", "UPDATABLE": 1, "VERSION": 22 }, { "ADDRESS": "VCU0000004:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "MAINTENANCE", "VERSION": 22 }, { "ADDRESS": "VCU0000004:1", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "WEATHER_TH", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "WEATHER_TRANSMIT", "VERSION": 22 }, { "ADDRESS": "VCU0000004:2", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 2, "LINK_SOURCE_ROLES": "THERMALCONTROL_TC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "THERMALCONTROL_TRANSMIT", "VERSION": 22 }, { "ADDRESS": "VCU0000004:3", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 3, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "WINDOW_SWITCH_RECEIVER WINDOW_SWITCH_RECEIVER_V2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "WINDOW_SWITCH_RECEIVER", "VERSION": 22 }, { "ADDRESS": "VCU0000004:6", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 6, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "REMOTECONTROL_RECEIVER", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "REMOTECONTROL_RECEIVER", "VERSION": 22 }, { "ADDRESS": "VCU0000004:7", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 7, "LINK_SOURCE_ROLES": "SWITCH", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000004", "PARENT_TYPE": "HM-TC-IT-WM-W-EU", "TYPE": "SWITCH_TRANSMIT", "VERSION": 22 }, { "ADDRESS": "VCU0000005", "CHILDREN": [ "VCU0000005:0", "VCU0000005:1" ], "FIRMWARE": "2.8", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 1, "TYPE": "HM-LC-Sw1-FM", "UPDATABLE": 0, "VERSION": 26 }, { "ADDRESS": "VCU0000005:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000005", "PARENT_TYPE": "HM-LC-Sw1-FM", "TYPE": "MAINTENANCE", "VERSION": 26 }, { "ADDRESS": "VCU0000005:1", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000005", "PARENT_TYPE": "HM-LC-Sw1-FM", "TYPE": "SWITCH", "VERSION": 26 }, { "ADDRESS": "VCU0000006", "CHILDREN": [ "VCU0000006:0", "VCU0000006:1" ], "FIRMWARE": "2.8", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 1, "TYPE": "HM-LC-Sw1-DR", "UPDATABLE": 1, "VERSION": 8 }, { "ADDRESS": "VCU0000006:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000006", "PARENT_TYPE": "HM-LC-Sw1-DR", "TYPE": "MAINTENANCE", "VERSION": 8 }, { "ADDRESS": "VCU0000006:1", "AES_ACTIVE": 0, "DIRECTION": 2, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000006", "PARENT_TYPE": "HM-LC-Sw1-DR", "TYPE": "SWITCH", "VERSION": 8 }, { "ADDRESS": "VCU0000007", "AVAILABLE_FIRMWARE": "1.2", "CHILDREN": [ "VCU0000007:0", "VCU0000007:1", "VCU0000007:2", "VCU0000007:3" ], "FIRMWARE": "1.2", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 28, "TYPE": "HM-Sen-MDIR-WM55", "UPDATABLE": 1, "VERSION": 5 }, { "ADDRESS": "VCU0000007:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000007", "PARENT_TYPE": "HM-Sen-MDIR-WM55", "TYPE": "MAINTENANCE", "VERSION": 5 }, { "ADDRESS": "VCU0000007:1", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "GROUP": "VCU0000007:2", "INDEX": 1, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000007", "PARENT_TYPE": "HM-Sen-MDIR-WM55", "TYPE": "KEY", "VERSION": 5 }, { "ADDRESS": "VCU0000007:2", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "GROUP": "VCU0000007:1", "INDEX": 2, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000007", "PARENT_TYPE": "HM-Sen-MDIR-WM55", "TYPE": "KEY", "VERSION": 5 }, { "ADDRESS": "VCU0000007:3", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 3, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000007", "PARENT_TYPE": "HM-Sen-MDIR-WM55", "TYPE": "MOTION_DETECTOR", "VERSION": 5 }, { "ADDRESS": "VCU0000008", "CHILDREN": [ "VCU0000008:0", "VCU0000008:1" ], "FIRMWARE": "1.0", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 12, "TYPE": "HM-ES-TX-WM", "UPDATABLE": 1, "VERSION": 1 }, { "ADDRESS": "VCU0000008:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000008", "PARENT_TYPE": "HM-ES-TX-WM", "TYPE": "MAINTENANCE", "VERSION": 1 }, { "ADDRESS": "VCU0000008:1", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000008", "PARENT_TYPE": "HM-ES-TX-WM", "TYPE": "POWERMETER_IGL", "VERSION": 1 }, { "ADDRESS": "VCU0000009", "CHILDREN": [ "VCU0000009:0", "VCU0000009:1" ], "FIRMWARE": "1.0", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234657, "ROAMING": 0, "RX_MODE": 28, "TYPE": "HM-Sen-DB-PCB", "UPDATABLE": 1, "VERSION": 5 }, { "ADDRESS": "VCU0000009:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000009", "PARENT_TYPE": "HM-Sen-DB-PCB", "TYPE": "MAINTENANCE", "VERSION": 5 }, { "ADDRESS": "VCU0000009:1", "AES_ACTIVE": 0, "DIRECTION": 1, "FLAGS": 1, "INDEX": 1, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000009", "PARENT_TYPE": "HM-Sen-DB-PCB", "TYPE": "KEY", "VERSION": 5 }, { "ADDRESS": "VCU0000010", "CHILDREN": [ "VCU0000010:0", "VCU0000010:1", "VCU0000010:2", "VCU0000010:3", "VCU0000010:4" ], "FIRMWARE": "1.1", "FLAGS": 1, "INTERFACE": "VCU0000000", "PARAMSETS": [ "MASTER" ], "PARENT": "", "RF_ADDRESS": 1234567, "ROAMING": 0, "RX_MODE": 28, "TYPE": "HM-RC-Sec4-3", "UPDATABLE": 1, "VERSION": 4 }, { "ADDRESS": "VCU0000010:0", "AES_ACTIVE": 0, "DIRECTION": 0, "FLAGS": 3, "INDEX": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000010", "PARENT_TYPE": "HM-RC-Sec4-3", "TYPE": "MAINTENANCE", "VERSION": 4 }, { "ADDRESS": "VCU0000010:1", "AES_ACTIVE": 1, "DIRECTION": 1, "FLAGS": 1, "GROUP": "VCU0000010:2", "INDEX": 1, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000010", "PARENT_TYPE": "HM-RC-Sec4-3", "TYPE": "KEY", "VERSION": 4 }, { "ADDRESS": "VCU0000010:2", "AES_ACTIVE": 1, "DIRECTION": 1, "FLAGS": 1, "GROUP": "VCU0000010:1", "INDEX": 2, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000010", "PARENT_TYPE": "HM-RC-Sec4-3", "TYPE": "KEY", "VERSION": 4 }, { "ADDRESS": "VCU0000010:3", "AES_ACTIVE": 1, "DIRECTION": 1, "FLAGS": 1, "INDEX": 3, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000010", "PARENT_TYPE": "HM-RC-Sec4-3", "TYPE": "KEY", "VERSION": 4 }, { "ADDRESS": "VCU0000010:4", "AES_ACTIVE": 1, "DIRECTION": 1, "FLAGS": 1, "INDEX": 4, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "PARENT": "VCU0000010", "PARENT_TYPE": "HM-RC-Sec4-3", "TYPE": "KEY", "VERSION": 4 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 26, "CHILDREN": [ "VCU0000011:0", "VCU0000011:1" ], "UPDATABLE": 0, "ADDRESS": "VCU0000011", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.4", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-Sw1-Pl-2" }, { "FLAGS": 3, "VERSION": 26, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000011:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-Sw1-Pl-2", "PARENT": "VCU0000011", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 26, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000011:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-Sw1-Pl-2", "PARENT": "VCU0000011", "TYPE": "SWITCH", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 16, "CHILDREN": [ "VCU0000012:0", "VCU0000012:1", "VCU0000012:2", "VCU0000012:3", "VCU0000012:4", "VCU0000012:5", "VCU0000012:6" ], "UPDATABLE": 1, "ADDRESS": "VCU0000012", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.5", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-ES-PMSw1-Pl" }, { "FLAGS": 3, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000012:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "SWITCH", "DIRECTION": 2 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:2", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "POWERMETER", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:3", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 3, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "CONDITION_POWER", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:4", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 4, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "CONDITION_CURRENT", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:5", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 5, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "CONDITION_VOLTAGE", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 16, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000012:6", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 6, "PARENT_TYPE": "HM-ES-PMSw1-Pl", "PARENT": "VCU0000012", "TYPE": "CONDITION_FREQUENCY", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 9, "CHILDREN": [ "VCU0000013:0", "VCU0000013:1", "VCU0000013:2", "VCU0000013:3", "VCU0000013:4" ], "UPDATABLE": 0, "ADDRESS": "VCU0000013", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.5", "RX_MODE": 4, "PARENT": "", "TYPE": "HM-PBI-4-FM" }, { "FLAGS": 3, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000013:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-PBI-4-FM", "PARENT": "VCU0000013", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000013:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-PBI-4-FM", "PARENT": "VCU0000013", "TYPE": "KEY", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000013:2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-PBI-4-FM", "PARENT": "VCU0000013", "TYPE": "KEY", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000013:3", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 3, "PARENT_TYPE": "HM-PBI-4-FM", "PARENT": "VCU0000013", "TYPE": "KEY", "DIRECTION": 1 }, { "FLAGS": 1, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000013:4", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 4, "PARENT_TYPE": "HM-PBI-4-FM", "PARENT": "VCU0000013", "TYPE": "KEY", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 8, "CHILDREN": [ "VCU0000014:0", "VCU0000014:1" ], "UPDATABLE": 1, "ADDRESS": "VCU0000014", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.5", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-Sw1-Pl-DN-R1" }, { "FLAGS": 3, "VERSION": 8, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000014:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-Sw1-Pl-DN-R1", "PARENT": "VCU0000014", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 8, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000014:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-Sw1-Pl-DN-R1", "PARENT": "VCU0000014", "TYPE": "SWITCH", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 5, "CHILDREN": [ "VCU0000015:0", "VCU0000015:1" ], "UPDATABLE": 0, "ADDRESS": "VCU0000015", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.3", "RX_MODE": 12, "PARENT": "", "TYPE": "HM-WDS10-TH-O" }, { "FLAGS": 3, "VERSION": 5, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000015:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-WDS10-TH-O", "PARENT": "VCU0000015", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 5, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "WEATHER_TH", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000015:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-WDS10-TH-O", "PARENT": "VCU0000015", "TYPE": "WEATHER", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 13, "CHILDREN": [ "VCU0000016:0", "VCU0000016:1", "VCU0000016:2", "VCU0000016:3" ], "UPDATABLE": 1, "ADDRESS": "VCU0000016", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.9", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-Dim1TPBU-FM" }, { "FLAGS": 3, "VERSION": 13, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000016:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-Dim1TPBU-FM", "PARENT": "VCU0000016", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 13, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000016:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-Dim1TPBU-FM", "PARENT": "VCU0000016", "TYPE": "DIMMER", "DIRECTION": 2 }, { "FLAGS": 1, "VERSION": 13, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000016:2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-LC-Dim1TPBU-FM", "PARENT": "VCU0000016", "TYPE": "VIRTUAL_DIMMER", "DIRECTION": 2 }, { "FLAGS": 1, "VERSION": 13, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000016:3", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 3, "PARENT_TYPE": "HM-LC-Dim1TPBU-FM", "PARENT": "VCU0000016", "TYPE": "VIRTUAL_DIMMER", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 9, "CHILDREN": [ "VCU0000017:0", "VCU0000017:1" ], "UPDATABLE": 1, "ADDRESS": "VCU0000017", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.8", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-Sw1PBU-FM" }, { "FLAGS": 3, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000017:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-Sw1PBU-FM", "PARENT": "VCU0000017", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 9, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000017:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-Sw1PBU-FM", "PARENT": "VCU0000017", "TYPE": "SWITCH", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 3, "CHILDREN": [ "VCU0000018:0", "VCU0000018:1" ], "UPDATABLE": 1, "ADDRESS": "VCU0000018", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.0", "RX_MODE": 28, "PARENT": "", "TYPE": "HM-Sec-SCo" }, { "FLAGS": 3, "VERSION": 3, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000018:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-Sec-SCo", "PARENT": "VCU0000018", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 3, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000018:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-Sec-SCo", "PARENT": "VCU0000018", "TYPE": "SHUTTER_CONTACT", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 21, "CHILDREN": [ "VCU0000019:0", "VCU0000019:1" ], "UPDATABLE": 0, "ADDRESS": "VCU0000019", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "2.6", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-Dim1T-FM" }, { "FLAGS": 3, "VERSION": 21, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000019:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-Dim1T-FM", "PARENT": "VCU0000019", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 21, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000019:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-Dim1T-FM", "PARENT": "VCU0000019", "TYPE": "DIMMER", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 41, "CHILDREN": [ "VCU0000020:0", "VCU0000020:1", "VCU0000020:2", "VCU0000020:3" ], "UPDATABLE": 1, "ADDRESS": "VCU0000020", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.0", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-LC-RGBW-WM" }, { "FLAGS": 3, "VERSION": 41, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000020:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-LC-RGBW-WM", "PARENT": "VCU0000020", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 41, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000020:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-LC-RGBW-WM", "PARENT": "VCU0000020", "TYPE": "DIMMER", "DIRECTION": 2 }, { "FLAGS": 1, "VERSION": 41, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000020:2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-LC-RGBW-WM", "PARENT": "VCU0000020", "TYPE": "RGBW_COLOR", "DIRECTION": 2 }, { "FLAGS": 1, "VERSION": 41, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "ADDRESS": "VCU0000020:3", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 3, "PARENT_TYPE": "HM-LC-RGBW-WM", "PARENT": "VCU0000020", "TYPE": "RGBW_AUTOMATIC", "DIRECTION": 2 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 8, "CHILDREN": [ "VCU0000021:0", "VCU0000021:1", "VCU0000021:2" ], "UPDATABLE": 0, "ADDRESS": "VCU0000021", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.4", "RX_MODE": 28, "PARENT": "", "TYPE": "HM-PB-2-WM55" }, { "FLAGS": 3, "VERSION": 8, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000021:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-PB-2-WM55", "PARENT": "VCU0000021", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "GROUP": "VCU0000021:2", "FLAGS": 1, "VERSION": 8, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000021:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-PB-2-WM55", "PARENT": "VCU0000021", "TYPE": "KEY", "DIRECTION": 1 }, { "GROUP": "VCU0000021:1", "FLAGS": 1, "VERSION": 8, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000021:2", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-PB-2-WM55", "PARENT": "VCU0000021", "TYPE": "KEY", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 5, "CHILDREN": [ "VCU0000022:0", "VCU0000022:1" ], "UPDATABLE": 0, "ADDRESS": "VCU0000022", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.0", "RX_MODE": 2, "PARENT": "", "TYPE": "HM-Sec-SD-2" }, { "FLAGS": 3, "VERSION": 5, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000022:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-Sec-SD-2", "PARENT": "VCU0000022", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 5, "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000022:1", "TEAM": "", "PARAMSETS": [ "MASTER", "VALUES" ], "TEAM_TAG": "smoke_detector", "INDEX": 1, "PARENT_TYPE": "HM-Sec-SD-2", "PARENT": "VCU0000022", "TYPE": "SMOKE_DETECTOR", "DIRECTION": 1 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 17, "CHILDREN": [ "VCU0000023:0", "VCU0000023:1", "VCU0000023:2", "VCU0000023:3", "VCU0000023:4", "VCU0000023:5", "VCU0000023:6", "VCU0000023:7", "VCU0000023:8", "VCU0000023:9", "VCU0000023:10" ], "UPDATABLE": 1, "ADDRESS": "VCU0000023", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "1.0", "RX_MODE": 4, "PARENT": "", "TYPE": "HM-Dis-WM55" }, { "FLAGS": 3, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:1", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 1, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:2", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 2, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:3", "PARAMSETS": [ "MASTER" ], "INDEX": 3, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:4", "PARAMSETS": [ "MASTER" ], "INDEX": 4, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:5", "PARAMSETS": [ "MASTER" ], "INDEX": 5, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:6", "PARAMSETS": [ "MASTER" ], "INDEX": 6, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:7", "PARAMSETS": [ "MASTER" ], "INDEX": 7, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:8", "PARAMSETS": [ "MASTER" ], "INDEX": 8, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:9", "PARAMSETS": [ "MASTER" ], "INDEX": 9, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 17, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000023:10", "PARAMSETS": [ "MASTER" ], "INDEX": 10, "PARENT_TYPE": "HM-Dis-WM55", "PARENT": "VCU0000023", "TYPE": "KEY", "DIRECTION": 0 }, { "RF_ADDRESS": 1234567, "FLAGS": 1, "VERSION": 3, "CHILDREN": [ "VCU0000024:0", "VCU0000024:1" ], "UPDATABLE": 0, "ADDRESS": "VCU0000024", "ROAMING": 0, "PARAMSETS": [ "MASTER" ], "INTERFACE": "VCU0000000", "FIRMWARE": "?", "RX_MODE": 1, "PARENT": "", "TYPE": "HM-Sec-SD-2-Team" }, { "FLAGS": 3, "VERSION": 3, "AES_ACTIVE": 0, "LINK_SOURCE_ROLES": "", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000024:0", "PARAMSETS": [ "MASTER", "VALUES" ], "INDEX": 0, "PARENT_TYPE": "HM-Sec-SD-2-Team", "PARENT": "VCU0000024", "TYPE": "MAINTENANCE", "DIRECTION": 0 }, { "FLAGS": 1, "VERSION": 3, "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "TEAM_TAG": "smoke_detector", "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000024:1", "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "TEAM_CHANNELS": [], "INDEX": 1, "PARENT_TYPE": "HM-Sec-SD-2-Team", "PARENT": "VCU0000024", "TYPE": "SMOKE_DETECTOR_TEAM_V2", "DIRECTION": 1 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "1.6.2", "SUBTYPE": "FSM", "INDEX": 0, "GROUP": "", "RX_MODE": 0, "CHILDREN": [ "VCU0000025:0", "VCU0000025:1", "VCU0000025:2", "VCU0000025:3", "VCU0000025:4", "VCU0000025:5", "VCU0000025:6", "VCU0000025:7" ], "PARENT_TYPE": "", "PARENT": "", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "1.6.2", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "HmIP-FSM16", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "TEAM": "", "ADDRESS": "VCU0000025", "RF_ADDRESS": 1234567 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 0, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:0", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 1, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:1", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 2, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "LINK", "SERVICE" ], "DIRECTION": 2, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:2", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 3, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "LINK", "SERVICE" ], "DIRECTION": 2, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:3", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 4, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "LINK", "SERVICE" ], "DIRECTION": 2, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:4", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 5, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "ENERGIE_METER_TRANSMITTER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:5", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 6, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "TYPE": "COND_SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "LINK", "SERVICE" ], "DIRECTION": 1, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:6", "RF_ADDRESS": 0 }, { "VERSION": 2, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 7, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-FSM16", "PARENT": "VCU0000025", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SWITCH_WEEK_PROFILE", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000025:7", "RF_ADDRESS": 0 }, { "VERSION": 1, "UPDATABLE": true, "FIRMWARE": "1.0.11", "SUBTYPE": "SD", "INDEX": 0, "GROUP": "", "RX_MODE": 3, "CHILDREN": [ "VCU0000026:0", "VCU0000026:1" ], "PARENT_TYPE": "", "PARENT": "", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "0.0.0", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "HmIP-SWSD", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "TEAM": "", "ADDRESS": "VCU0000026", "RF_ADDRESS": 1234567 }, { "VERSION": 1, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 0, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-SWSD", "PARENT": "VCU0000026", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000026:0", "RF_ADDRESS": 0 }, { "VERSION": 1, "UPDATABLE": true, "FIRMWARE": "", "SUBTYPE": "", "INDEX": 1, "GROUP": "", "RX_MODE": 0, "CHILDREN": [], "PARENT_TYPE": "HmIP-SWSD", "PARENT": "VCU0000026", "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "TEAM_TAG": "", "LINK_SOURCE_ROLES": "", "TYPE": "SMOKE_DETECTOR", "AES_ACTIVE": 1, "ROAMING": 0, "PARAMSETS": [ "MASTER", "VALUES", "SERVICE" ], "DIRECTION": 0, "TEAM_CHANNELS": [], "FLAGS": 1, "LINK_TARGET_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "TEAM": "", "ADDRESS": "VCU0000026:1", "RF_ADDRESS": 0 }, { "ROAMING": 0, "PARENT": "", "CHILDREN": [ "VCU0000027:0", "VCU0000027:1", "VCU0000027:2", "VCU0000027:3", "VCU0000027:4", "VCU0000027:5", "VCU0000027:6", "VCU0000027:7" ], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027", "AVAILABLE_FIRMWARE": "0.0.0", "RX_MODE": 3, "AES_ACTIVE": 1, "FIRMWARE": "1.6.0", "PARENT_TYPE": "", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "MASTER", "SERVICE" ], "SUBTYPE": "STHD", "TYPE": "HmIP-STHD", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "INDEX": 0, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027:0", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "MAINTENANCE", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "FIRMWARE_UPDATE_STATE": "", "INDEX": 0, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027:1", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER" ], "SUBTYPE": "", "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "DIRECTION": 1, "FIRMWARE_UPDATE_STATE": "", "INDEX": 1, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "CLIMATE_CONTROL_TRV_WTH", "ADDRESS": "VCU0000027:2", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "HEATING_CLIMATECONTROL_RECEIVER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "FIRMWARE_UPDATE_STATE": "", "INDEX": 2, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027:3", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "HEATING_CLIMATECONTROL_CL_TRANSMITTER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_CL", "DIRECTION": 1, "FIRMWARE_UPDATE_STATE": "", "INDEX": 3, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "WINDOW_SWITCH", "ADDRESS": "VCU0000027:4", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "HEATING_SHUTTER_CONTACT_RECEIVER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "FIRMWARE_UPDATE_STATE": "", "INDEX": 4, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027:5", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "HEATING_CLIMATECONTROL_SWITCH_TRANSMITTER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "SWITCH", "DIRECTION": 1, "FIRMWARE_UPDATE_STATE": "", "INDEX": 5, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "REMOTE_CONTROL", "ADDRESS": "VCU0000027:6", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "HEATING_KEY_RECEIVER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "FIRMWARE_UPDATE_STATE": "", "INDEX": 6, "TEAM_TAG": "" }, { "ROAMING": 0, "PARENT": "VCU0000027", "CHILDREN": [], "LINK_TARGET_ROLES": "", "ADDRESS": "VCU0000027:7", "AVAILABLE_FIRMWARE": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "PARENT_TYPE": "HmIP-STHD", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSMITTER", "VERSION": 1, "RF_ADDRESS": 1234567, "GROUP": "", "TEAM": "", "INTERFACE": "VCU0000000", "TEAM_CHANNELS": [], "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_FLOOR", "DIRECTION": 1, "FIRMWARE_UPDATE_STATE": "", "INDEX": 7, "TEAM_TAG": "" }, { "UPDATABLE": 0, "RF_ADDRESS": 1234567, "PARAMSETS": [ "MASTER" ], "PARENT": "", "INTERFACE": "VCU0000000", "TYPE": "HM-LC-Sw2-FM", "FLAGS": 1, "CHILDREN": [ "VCU0000028:0", "VCU0000028:1", "VCU0000028:2" ], "VERSION": 26, "FIRMWARE": "2.8", "RX_MODE": 1, "ROAMING": 0, "ADDRESS": "VCU0000028" }, { "TYPE": "MAINTENANCE", "DIRECTION": 0, "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000028", "FLAGS": 3, "LINK_TARGET_ROLES": "", "VERSION": 26, "AES_ACTIVE": 0, "INDEX": 0, "PARENT_TYPE": "HM-LC-Sw2-FM", "ADDRESS": "VCU0000028:0", "LINK_SOURCE_ROLES": "" }, { "TYPE": "SWITCH", "DIRECTION": 2, "PARAMSETS": [ "MASTER", "VALUES", "LINK" ], "PARENT": "VCU0000028", "FLAGS": 1, "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "VERSION": 26, "AES_ACTIVE": 0, "INDEX": 1, "PARENT_TYPE": "HM-LC-Sw2-FM", "ADDRESS": "VCU0000028:1", "LINK_SOURCE_ROLES": "" }, { "TYPE": "SWITCH", "DIRECTION": 2, "PARAMSETS": [ "MASTER", "VALUES", "LINK" ], "PARENT": "VCU0000028", "FLAGS": 1, "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "VERSION": 26, "AES_ACTIVE": 0, "INDEX": 2, "PARENT_TYPE": "HM-LC-Sw2-FM", "ADDRESS": "VCU0000028:2", "LINK_SOURCE_ROLES": "" }, { "UPDATABLE": 1, "RF_ADDRESS": 1234567, "PARAMSETS": [ "MASTER" ], "PARENT": "", "INTERFACE": "VCU0000000", "TYPE": "HM-LC-Bl1PBU-FM", "FLAGS": 1, "AVAILABLE_FIRMWARE": "2.11", "CHILDREN": [ "VCU0000029:0", "VCU0000029:1" ], "VERSION": 8, "FIRMWARE": "2.8", "RX_MODE": 1, "ROAMING": 0, "ADDRESS": "VCU0000029" }, { "TYPE": "MAINTENANCE", "DIRECTION": 0, "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000029", "FLAGS": 3, "LINK_TARGET_ROLES": "", "VERSION": 8, "AES_ACTIVE": 0, "INDEX": 0, "PARENT_TYPE": "HM-LC-Bl1PBU-FM", "ADDRESS": "VCU0000029:0", "LINK_SOURCE_ROLES": "" }, { "TYPE": "BLIND", "DIRECTION": 2, "PARAMSETS": [ "MASTER", "VALUES", "LINK" ], "PARENT": "VCU0000029", "FLAGS": 1, "LINK_TARGET_ROLES": "SWITCH WEATHER_CS", "VERSION": 8, "AES_ACTIVE": 0, "INDEX": 1, "PARENT_TYPE": "HM-LC-Bl1PBU-FM", "ADDRESS": "VCU0000029:1", "LINK_SOURCE_ROLES": "" }, { "UPDATABLE": 1, "RF_ADDRESS": 1234567, "PARAMSETS": [ "MASTER" ], "PARENT": "", "INTERFACE": "VCU0000000", "TYPE": "HM-LC-Sw1-Ba-PCB", "FLAGS": 1, "CHILDREN": [ "VCU0000030:0", "VCU0000030:1" ], "VERSION": 12, "FIRMWARE": "1.7", "RX_MODE": 2, "ROAMING": 0, "ADDRESS": "VCU0000030" }, { "TYPE": "MAINTENANCE", "DIRECTION": 0, "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000030", "FLAGS": 3, "LINK_TARGET_ROLES": "", "VERSION": 12, "AES_ACTIVE": 0, "INDEX": 0, "PARENT_TYPE": "HM-LC-Sw1-Ba-PCB", "ADDRESS": "VCU0000030:0", "LINK_SOURCE_ROLES": "" }, { "TYPE": "SWITCH", "DIRECTION": 2, "PARAMSETS": [ "MASTER", "VALUES", "LINK" ], "PARENT": "VCU0000030", "FLAGS": 1, "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "VERSION": 12, "AES_ACTIVE": 0, "INDEX": 1, "PARENT_TYPE": "HM-LC-Sw1-Ba-PCB", "ADDRESS": "VCU0000030:1", "LINK_SOURCE_ROLES": "" }, { "UPDATABLE": 1, "RF_ADDRESS": 1234567, "PARAMSETS": [ "MASTER" ], "PARENT": "", "INTERFACE": "VCU0000000", "TYPE": "HM-LC-Ja1PBU-FM", "FLAGS": 1, "CHILDREN": [ "VCU0000031:0", "VCU0000031:1" ], "VERSION": 3, "FIRMWARE": "2.10", "RX_MODE": 1, "ROAMING": 0, "ADDRESS": "VCU0000031" }, { "TYPE": "MAINTENANCE", "DIRECTION": 0, "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT": "VCU0000031", "FLAGS": 3, "LINK_TARGET_ROLES": "", "VERSION": 3, "AES_ACTIVE": 0, "INDEX": 0, "PARENT_TYPE": "HM-LC-Ja1PBU-FM", "ADDRESS": "VCU0000031:0", "LINK_SOURCE_ROLES": "" }, { "TYPE": "JALOUSIE", "DIRECTION": 2, "PARAMSETS": [ "MASTER", "VALUES", "LINK" ], "PARENT": "VCU0000031", "FLAGS": 1, "LINK_TARGET_ROLES": "SWITCH WEATHER_CS", "VERSION": 3, "AES_ACTIVE": 0, "INDEX": 1, "PARENT_TYPE": "HM-LC-Ja1PBU-FM", "ADDRESS": "VCU0000031:1", "LINK_SOURCE_ROLES": "" }, { "CHILDREN": [ "VCU0000032:0", "VCU0000032:1", "VCU0000032:2", "VCU0000032:3", "VCU0000032:4", "VCU0000032:5", "VCU0000032:6", "VCU0000032:7" ], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "ROAMING": 0, "SUBTYPE": "BDT", "ADDRESS": "VCU0000032", "FIRMWARE": "1.4.8", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "0.0.0", "PARENT_TYPE": "", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HmIP-BDT", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:0", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:1", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 1, "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "KEY_TRANSCEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:2", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 2, "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "KEY_TRANSCEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:3", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 3, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "DIMMER_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:4", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 4, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "DIMMER_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:5", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 5, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "DIMMER_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:6", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 6, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "DIMMER_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000032", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000032:7", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 7, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-BDT", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "DIMMER_WEEK_PROFILE", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [ "VCU0000033:0", "VCU0000033:1", "VCU0000033:2", "VCU0000033:3", "VCU0000033:4", "VCU0000033:5" ], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "READY_FOR_UPDATE", "ROAMING": 0, "SUBTYPE": "PS", "ADDRESS": "VCU0000033", "FIRMWARE": "2.2.0", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "2.6.2", "PARENT_TYPE": "", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HMIP-PS", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:0", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:1", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 1, "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "KEY_TRANSCEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:2", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 2, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:3", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 3, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:4", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 4, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000033", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000033:5", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 5, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PS", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [ "VCU0000034:0", "VCU0000034:1", "VCU0000034:2", "VCU0000034:3", "VCU0000034:4", "VCU0000034:5", "VCU0000034:6", "VCU0000034:7" ], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "ROAMING": 0, "SUBTYPE": "WTH-2", "ADDRESS": "VCU0000034", "FIRMWARE": "1.4.4", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "0.0.0", "PARENT_TYPE": "", "TEAM_TAG": "", "RX_MODE": 3, "TEAM_CHANNELS": [], "TYPE": "HmIP-WTH-2", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:0", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:1", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 1, "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CLIMATE_CONTROL_TRV_WTH", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:2", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 2, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_CLIMATECONTROL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:3", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 3, "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_CL", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_CLIMATECONTROL_CL_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "WINDOW_SWITCH", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:4", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 4, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_SHUTTER_CONTACT_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:5", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 5, "LINK_SOURCE_ROLES": "SWITCH", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_CLIMATECONTROL_SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "REMOTE_CONTROL", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:6", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 6, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HEATING_KEY_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000034", "VERSION": 2, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000034:7", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 7, "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_FLOOR", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HmIP-WTH-2", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "CLIMATECONTROL_FLOOR_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [ "VCU0000035:0", "VCU0000035:1", "VCU0000035:2", "VCU0000035:3", "VCU0000035:4", "VCU0000035:5", "VCU0000035:6", "VCU0000035:7" ], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "READY_FOR_UPDATE", "ROAMING": 0, "SUBTYPE": "PSM", "ADDRESS": "VCU0000035", "FIRMWARE": "2.2.2", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "2.6.2", "PARENT_TYPE": "", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "HMIP-PSM", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:0", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 0, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "MAINTENANCE", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:1", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 1, "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "KEY_TRANSCEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:2", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 2, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:3", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 3, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:4", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 4, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 2, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "CONDITIONAL_SWITCH LEVEL SWITCH REMOTE_CONTROL", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:5", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 5, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "SWITCH_VIRTUAL_RECEIVER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 0, "PARAMSETS": [ "SERVICE", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:6", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 6, "LINK_SOURCE_ROLES": "", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "ENERGIE_METER_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [], "INTERFACE": "VCU0000000", "DIRECTION": 1, "PARAMSETS": [ "SERVICE", "LINK", "VALUES", "MASTER" ], "LINK_TARGET_ROLES": "", "PARENT": "VCU0000035", "VERSION": 3, "TEAM": "", "GROUP": "", "FIRMWARE_UPDATE_STATE": "", "ROAMING": 0, "SUBTYPE": "", "ADDRESS": "VCU0000035:7", "FIRMWARE": "", "UPDATABLE": true, "INDEX": 7, "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "RF_ADDRESS": 1234567, "AVAILABLE_FIRMWARE": "", "PARENT_TYPE": "HMIP-PSM", "TEAM_TAG": "", "RX_MODE": 0, "TEAM_CHANNELS": [], "TYPE": "COND_SWITCH_TRANSMITTER", "AES_ACTIVE": 1, "FLAGS": 1 }, { "CHILDREN": [ "VCU0000036:0", "VCU0000036:1", "VCU0000036:3", "VCU0000036:4" ], "FIRMWARE": "1.5", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-RT-TRX-CyG", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 2, "CHANNELS": [ 0, 1, 3, 4 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 511, "ADDRESS": "VCU0000036", "ID": 1, "FAMILY": 4, "PHYSICAL_ADDRESS": 161452 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000036", "FLAGS": 3, "ADDRESS": "VCU0000036:0", "ID": 1, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "THERMALCONTROL_VD", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 3, "LINK_TARGET_ROLES": "THERMALCONTROL_VD", "TYPE": "CLIMATECONTROL_TRANSCEIVER", "CHANNEL": 1, "PARENT": "VCU0000036", "FLAGS": 1, "ADDRESS": "VCU0000036:1", "ID": 1, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "THERMALCONTROL_TC", "TYPE": "CLIMATECONTROL_RECEIVER", "CHANNEL": 3, "PARENT": "VCU0000036", "FLAGS": 1, "ADDRESS": "VCU0000036:3", "ID": 1, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "WINDOW_SWITCH_RECEIVER", "TYPE": "WINDOW_SWITCH_RECEIVER", "CHANNEL": 4, "PARENT": "VCU0000036", "FLAGS": 1, "ADDRESS": "VCU0000036:4", "ID": 1, "FAMILY": 4, "VERSION": 1, "INDEX": 4 }, { "CHILDREN": [ "VCU0000037:0", "VCU0000037:1", "VCU0000037:2" ], "FIRMWARE": "1.2", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-PB-2-WM", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 8, "CHANNELS": [ 0, 1, 2 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 1295, "ADDRESS": "VCU0000037", "ID": 2, "FAMILY": 4, "PHYSICAL_ADDRESS": 154052 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-PB-2-WM", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000037", "FLAGS": 3, "ADDRESS": "VCU0000037:0", "ID": 2, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-PB-2-WM", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "KEY", "CHANNEL": 1, "PARENT": "VCU0000037", "FLAGS": 1, "ADDRESS": "VCU0000037:1", "ID": 2, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-PB-2-WM", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "KEY", "CHANNEL": 2, "PARENT": "VCU0000037", "FLAGS": 1, "ADDRESS": "VCU0000037:2", "ID": 2, "FAMILY": 4, "VERSION": 1, "INDEX": 2 }, { "CHILDREN": [ "VCU0000038:0", "VCU0000038:1", "VCU0000038:4" ], "FIRMWARE": "1.2", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-TC-C-WM-2", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 2, "CHANNELS": [ 0, 1, 4 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 768, "ADDRESS": "VCU0000038", "ID": 3, "FAMILY": 4, "PHYSICAL_ADDRESS": 174207 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-TC-C-WM-2", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000038", "FLAGS": 3, "ADDRESS": "VCU0000038:0", "ID": 3, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "THERMALCONTROL_TC", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-TC-C-WM-2", "AES_ACTIVE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TYPE": "CLIMATECONTROL_TRANSCEIVER", "CHANNEL": 1, "PARENT": "VCU0000038", "FLAGS": 1, "ADDRESS": "VCU0000038:1", "ID": 3, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-TC-C-WM-2", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "WINDOW_SWITCH_RECEIVER_2", "TYPE": "WINDOW_SWITCH_RECEIVER", "CHANNEL": 4, "PARENT": "VCU0000038", "FLAGS": 1, "ADDRESS": "VCU0000038:4", "ID": 3, "FAMILY": 4, "VERSION": 1, "INDEX": 4 }, { "CHILDREN": [ "VCU0000039:0", "VCU0000039:1", "VCU0000039:3" ], "FIRMWARE": "1.0", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-SC-Rd-WM-2", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 8, "CHANNELS": [ 0, 1, 3 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 1024, "ADDRESS": "VCU0000039", "ID": 5, "FAMILY": 4, "PHYSICAL_ADDRESS": 1578812 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-SC-Rd-WM-2", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000039", "FLAGS": 3, "ADDRESS": "VCU0000039:0", "ID": 5, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "WINDOW_SWITCH_RECEIVER", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-SC-Rd-WM-2", "AES_ACTIVE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TYPE": "SHUTTER_CONTACT", "CHANNEL": 1, "PARENT": "VCU0000039", "FLAGS": 1, "ADDRESS": "VCU0000039:1", "ID": 5, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "WINDOW_SWITCH_RECEIVER_2", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-SC-Rd-WM-2", "AES_ACTIVE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TYPE": "SHUTTER_CONTACT", "CHANNEL": 3, "PARENT": "VCU0000039", "FLAGS": 1, "ADDRESS": "VCU0000039:3", "ID": 5, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "CHILDREN": [ "VCU0000040:0", "VCU0000040:1", "VCU0000040:3", "VCU0000040:4" ], "FIRMWARE": "1.0", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-RT-TRX-CyG-3", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 2, "CHANNELS": [ 0, 1, 3, 4 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 416, "ADDRESS": "VCU0000040", "ID": 6, "FAMILY": 4, "PHYSICAL_ADDRESS": 1429685 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000040", "FLAGS": 3, "ADDRESS": "VCU0000040:0", "ID": 6, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "THERMALCONTROL_VD", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 3, "LINK_TARGET_ROLES": "THERMALCONTROL_VD", "TYPE": "CLIMATECONTROL_TRANSCEIVER", "CHANNEL": 1, "PARENT": "VCU0000040", "FLAGS": 1, "ADDRESS": "VCU0000040:1", "ID": 6, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "THERMALCONTROL_TC", "TYPE": "CLIMATECONTROL_RECEIVER", "CHANNEL": 3, "PARENT": "VCU0000040", "FLAGS": 1, "ADDRESS": "VCU0000040:3", "ID": 6, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "WINDOW_SWITCH_RECEIVER", "TYPE": "WINDOW_SWITCH_RECEIVER", "CHANNEL": 4, "PARENT": "VCU0000040", "FLAGS": 1, "ADDRESS": "VCU0000040:4", "ID": 6, "FAMILY": 4, "VERSION": 1, "INDEX": 4 }, { "CHILDREN": [ "VCU0000041:0", "VCU0000041:1", "VCU0000041:3" ], "FIRMWARE": "1.3", "PARAMSETS": [ "MASTER" ], "FLAGS": 1, "TYPE": "BC-SC-Rd-WM", "RF_ADDRESS": 1234567, "VERSION": 1, "RX_MODE": 8, "CHANNELS": [ 0, 1, 3 ], "ROAMING": 0, "PARENT": "", "INTERFACE": "VCU0000000", "TYPE_ID": 1039, "ADDRESS": "VCU0000041", "ID": 7, "FAMILY": 4, "PHYSICAL_ADDRESS": 157922 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-SC-Rd-WM", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000041", "FLAGS": 3, "ADDRESS": "VCU0000041:0", "ID": 7, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "WINDOW_SWITCH_RECEIVER", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-SC-Rd-WM", "AES_ACTIVE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TYPE": "SHUTTER_CONTACT", "CHANNEL": 1, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:1", "ID": 7, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "WINDOW_SWITCH_RECEIVER_2", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-SC-Rd-WM", "AES_ACTIVE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TYPE": "SHUTTER_CONTACT", "CHANNEL": 3, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:3", "ID": 7, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000041", "FLAGS": 3, "ADDRESS": "VCU0000041:0", "ID": 8, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "THERMALCONTROL_VD", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 3, "LINK_TARGET_ROLES": "THERMALCONTROL_VD", "TYPE": "CLIMATECONTROL_TRANSCEIVER", "CHANNEL": 1, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:1", "ID": 8, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "THERMALCONTROL_TC", "TYPE": "CLIMATECONTROL_RECEIVER", "CHANNEL": 3, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:3", "ID": 8, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TYPE": "MAINTENANCE", "CHANNEL": 0, "PARENT": "VCU0000041", "FLAGS": 3, "ADDRESS": "VCU0000041:0", "ID": 11, "FAMILY": 4, "VERSION": 1, "INDEX": 0 }, { "LINK_SOURCE_ROLES": "THERMALCONTROL_VD", "PARAMSETS": [ "MASTER", "VALUES" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 3, "LINK_TARGET_ROLES": "THERMALCONTROL_VD", "TYPE": "CLIMATECONTROL_TRANSCEIVER", "CHANNEL": 1, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:1", "ID": 11, "FAMILY": 4, "VERSION": 1, "INDEX": 1 }, { "LINK_SOURCE_ROLES": "", "PARAMSETS": [ "MASTER" ], "PARENT_TYPE": "BC-RT-TRX-CyG-3", "AES_ACTIVE": 0, "DIRECTION": 2, "LINK_TARGET_ROLES": "THERMALCONTROL_TC", "TYPE": "CLIMATECONTROL_RECEIVER", "CHANNEL": 3, "PARENT": "VCU0000041", "FLAGS": 1, "ADDRESS": "VCU0000041:3", "ID": 11, "FAMILY": 4, "VERSION": 1, "INDEX": 3 }, { "FIRMWARE": "1.5", "CHILDREN": [ "VCU0000042:0", "VCU0000042:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 12, "TYPE": "HM-Sen-MDIR-O", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 8, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000042", "ROAMING": 0 }, { "PARENT": "VCU0000042", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-Sen-MDIR-O", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000042:0", "FLAGS": 3, "VERSION": 8, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000042", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-Sen-MDIR-O", "AES_ACTIVE": 1, "TYPE": "MOTION_DETECTOR", "ADDRESS": "VCU0000042:1", "FLAGS": 1, "VERSION": 8, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "FIRMWARE": "1.5", "CHILDREN": [ "VCU0000043:0", "VCU0000043:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "ZEL STG RM FEP 230V", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000043", "ROAMING": 0 }, { "PARENT": "VCU0000043", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "ZEL STG RM FEP 230V", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000043:0", "FLAGS": 3, "VERSION": 1, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000043", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "ZEL STG RM FEP 230V", "AES_ACTIVE": 0, "TYPE": "BLIND", "ADDRESS": "VCU0000043:1", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WEATHER_CS", "INDEX": 1 }, { "FIRMWARE": "1.1", "CHILDREN": [ "VCU0000044:0", "VCU0000044:1", "VCU0000044:2", "VCU0000044:3", "VCU0000044:4", "VCU0000044:5", "VCU0000044:6", "VCU0000044:7", "VCU0000044:8", "VCU0000044:9", "VCU0000044:10", "VCU0000044:11", "VCU0000044:12", "VCU0000044:13", "VCU0000044:14", "VCU0000044:15", "VCU0000044:16" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-OU-LED16", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000044", "ROAMING": 0 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000044:0", "FLAGS": 3, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:1", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:2", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:3", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:4", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:5", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:6", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:7", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 7 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:8", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 8 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:9", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 9 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:10", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 10 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:11", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 11 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:12", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 12 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:13", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 13 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:14", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 14 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:15", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 15 }, { "PARENT": "VCU0000044", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-LED16", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000044:16", "FLAGS": 1, "VERSION": 11, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 16 }, { "FIRMWARE": "2.1", "CHILDREN": [ "VCU0000045:0", "VCU0000045:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 12, "TYPE": "HM-Sec-RHS", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 14, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000045", "ROAMING": 0 }, { "PARENT": "VCU0000045", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-Sec-RHS", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000045:0", "FLAGS": 3, "VERSION": 14, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000045", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-Sec-RHS", "AES_ACTIVE": 1, "TYPE": "ROTARY_HANDLE_SENSOR", "ADDRESS": "VCU0000045:1", "FLAGS": 1, "VERSION": 14, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "FIRMWARE": "1.12", "CHILDREN": [ "VCU0000046:0", "VCU0000046:1", "VCU0000046:2", "VCU0000046:3", "VCU0000046:4" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-LC-Sw4-PCB", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000046", "ROAMING": 0 }, { "PARENT": "VCU0000046", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Sw4-PCB", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000046:0", "FLAGS": 3, "VERSION": 1, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000046", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000046:1", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000046", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000046:2", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 2 }, { "PARENT": "VCU0000046", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000046:3", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 3 }, { "PARENT": "VCU0000046", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000046:4", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 4 }, { "FIRMWARE": "1.1", "CHILDREN": [ "VCU0000047:0", "VCU0000047:1", "VCU0000047:2", "VCU0000047:3", "VCU0000047:4" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 28, "TYPE": "HM-RC-Key4-2", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000047", "ROAMING": 0 }, { "PARENT": "VCU0000047", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-RC-Key4-2", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000047:0", "FLAGS": 3, "VERSION": 4, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000047", "GROUP": "VCU0000047:2", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Key4-2", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000047:1", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000047", "GROUP": "VCU0000047:1", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Key4-2", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000047:2", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000047", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Key4-2", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000047:3", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000047", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Key4-2", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000047:4", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "FIRMWARE": "1.3", "CHILDREN": [ "VCU0000048:0", "VCU0000048:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 12, "TYPE": "HM-WDS40-TH-I-2", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 0, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000048", "ROAMING": 0 }, { "PARENT": "VCU0000048", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS40-TH-I-2", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000048:0", "FLAGS": 3, "VERSION": 0, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000048", "LINK_SOURCE_ROLES": "WEATHER_TH", "DIRECTION": 1, "PARENT_TYPE": "HM-WDS40-TH-I-2", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000048:1", "FLAGS": 1, "VERSION": 0, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "FIRMWARE": "2.4", "CHILDREN": [ "VCU0000049:0", "VCU0000049:1", "VCU0000049:2", "VCU0000049:3", "VCU0000049:4" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-LC-Sw4-DR", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 26, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000049", "ROAMING": 0 }, { "PARENT": "VCU0000049", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Sw4-DR", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000049:0", "FLAGS": 3, "VERSION": 26, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000049", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-DR", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000049:1", "FLAGS": 1, "VERSION": 26, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000049", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-DR", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000049:2", "FLAGS": 1, "VERSION": 26, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 2 }, { "PARENT": "VCU0000049", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-DR", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000049:3", "FLAGS": 1, "VERSION": 26, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 3 }, { "PARENT": "VCU0000049", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-DR", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000049:4", "FLAGS": 1, "VERSION": 26, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 4 }, { "FIRMWARE": "1.2", "CHILDREN": [ "VCU0000050:0", "VCU0000050:1", "VCU0000050:2", "VCU0000050:3", "VCU0000050:4", "VCU0000050:5", "VCU0000050:6" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 28, "TYPE": "HM-PB-6-WM55", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000050", "ROAMING": 0 }, { "PARENT": "VCU0000050", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000050:0", "FLAGS": 3, "VERSION": 7, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:2", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:1", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:1", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:2", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:4", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:3", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:3", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:4", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:6", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:5", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000050", "GROUP": "VCU0000050:5", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-PB-6-WM55", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000050:6", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "FIRMWARE": "1.1", "CHILDREN": [ "VCU0000051:0", "VCU0000051:1", "VCU0000051:2", "VCU0000051:3", "VCU0000051:4", "VCU0000051:5" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 12, "TYPE": "HM-WDS30-OT2-SM", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000051", "ROAMING": 0 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000051:0", "FLAGS": 3, "VERSION": 5, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000051:1", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000051:2", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000051:3", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000051:4", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000051", "LINK_SOURCE_ROLES": "WEATHER_T", "DIRECTION": 1, "PARENT_TYPE": "HM-WDS30-OT2-SM", "AES_ACTIVE": 0, "TYPE": "WEATHER", "ADDRESS": "VCU0000051:5", "FLAGS": 1, "VERSION": 5, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "FIRMWARE": "1.0", "CHILDREN": [ "VCU0000052:0", "VCU0000052:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-OU-CM-PCB", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000052", "ROAMING": 0 }, { "PARENT": "VCU0000052", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-OU-CM-PCB", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000052:0", "FLAGS": 3, "VERSION": 4, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000052", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-OU-CM-PCB", "AES_ACTIVE": 0, "TYPE": "SIGNAL_CHIME", "ADDRESS": "VCU0000052:1", "FLAGS": 1, "VERSION": 4, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WEATHER_CS", "INDEX": 1 }, { "FIRMWARE": "1.1", "CHILDREN": [ "VCU0000053:0", "VCU0000053:1", "VCU0000053:2", "VCU0000053:3", "VCU0000053:4" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 2, "TYPE": "HM-LC-Sw4-Ba-PCB", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 3, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000053", "ROAMING": 0 }, { "PARENT": "VCU0000053", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Sw4-Ba-PCB", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000053:0", "FLAGS": 3, "VERSION": 3, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000053", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-Ba-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000053:1", "FLAGS": 1, "VERSION": 3, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000053", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-Ba-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000053:2", "FLAGS": 1, "VERSION": 3, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 2 }, { "PARENT": "VCU0000053", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-Ba-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000053:3", "FLAGS": 1, "VERSION": 3, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 3 }, { "PARENT": "VCU0000053", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw4-Ba-PCB", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000053:4", "FLAGS": 1, "VERSION": 3, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 4 }, { "FIRMWARE": "1.0", "CHILDREN": [ "VCU0000054:0", "VCU0000054:1", "VCU0000054:2", "VCU0000054:3", "VCU0000054:4", "VCU0000054:5", "VCU0000054:6", "VCU0000054:7", "VCU0000054:8" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 28, "TYPE": "HM-MOD-EM-8", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000054", "ROAMING": 0 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000054:0", "FLAGS": 3, "VERSION": 18, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000054:1", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000054:2", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000054:3", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000054:4", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000054:5", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000054:6", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000054:7", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 7 }, { "PARENT": "VCU0000054", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-MOD-EM-8", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000054:8", "FLAGS": 1, "VERSION": 18, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 8 }, { "FIRMWARE": "1.0", "CHILDREN": [ "VCU0000055:0", "VCU0000055:1", "VCU0000055:2", "VCU0000055:3", "VCU0000055:4", "VCU0000055:5", "VCU0000055:6", "VCU0000055:7", "VCU0000055:8", "VCU0000055:9", "VCU0000055:10", "VCU0000055:11", "VCU0000055:12", "VCU0000055:13", "VCU0000055:14", "VCU0000055:15", "VCU0000055:16", "VCU0000055:17", "VCU0000055:18", "VCU0000055:19", "VCU0000055:20" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 28, "TYPE": "HM-RC-Dis-H-x-EU", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000055", "ROAMING": 0 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000055:0", "FLAGS": 3, "VERSION": 7, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:1", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:2", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:3", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:4", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:5", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:6", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:7", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 7 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:8", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 8 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:9", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 9 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:10", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 10 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:11", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 11 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:12", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 12 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:13", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 13 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:14", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 14 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:15", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 15 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:16", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 16 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:17", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 17 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:18", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 18 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:19", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 19 }, { "PARENT": "VCU0000055", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-Dis-H-x-EU", "AES_ACTIVE": 0, "TYPE": "KEY", "ADDRESS": "VCU0000055:20", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 20 }, { "FIRMWARE": "2.5", "CHILDREN": [ "VCU0000056:0", "VCU0000056:1", "VCU0000056:2", "VCU0000056:3", "VCU0000056:4", "VCU0000056:5", "VCU0000056:6" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-ES-PMSw1-DR", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000056", "ROAMING": 0 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000056:0", "FLAGS": 3, "VERSION": 16, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000056:1", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "POWERMETER", "ADDRESS": "VCU0000056:2", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "CONDITION_POWER", "ADDRESS": "VCU0000056:3", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "CONDITION_CURRENT", "ADDRESS": "VCU0000056:4", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "CONDITION_VOLTAGE", "ADDRESS": "VCU0000056:5", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000056", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-DR", "AES_ACTIVE": 0, "TYPE": "CONDITION_FREQUENCY", "ADDRESS": "VCU0000056:6", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "FIRMWARE": "2.6", "CHILDREN": [ "VCU0000057:0", "VCU0000057:1", "VCU0000057:2", "VCU0000057:3", "VCU0000057:4", "VCU0000057:5", "VCU0000057:6" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-ES-PMSw1-SM", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000057", "ROAMING": 0 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000057:0", "FLAGS": 3, "VERSION": 16, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000057:1", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "POWERMETER", "ADDRESS": "VCU0000057:2", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "CONDITION_POWER", "ADDRESS": "VCU0000057:3", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "CONDITION_CURRENT", "ADDRESS": "VCU0000057:4", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "CONDITION_VOLTAGE", "ADDRESS": "VCU0000057:5", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 5 }, { "PARENT": "VCU0000057", "LINK_SOURCE_ROLES": "KEYMATIC SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-ES-PMSw1-SM", "AES_ACTIVE": 0, "TYPE": "CONDITION_FREQUENCY", "ADDRESS": "VCU0000057:6", "FLAGS": 1, "VERSION": 16, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 6 }, { "FIRMWARE": "2.5", "CHILDREN": [ "VCU0000058:0", "VCU0000058:1" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-LC-Sw1-Pl-CT-R1", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 8, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000058", "ROAMING": 0 }, { "PARENT": "VCU0000058", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Sw1-Pl-CT-R1", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000058:0", "FLAGS": 3, "VERSION": 8, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000058", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw1-Pl-CT-R1", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000058:1", "FLAGS": 1, "VERSION": 8, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "FIRMWARE": "1.2", "CHILDREN": [ "VCU0000059:0", "VCU0000059:1", "VCU0000059:2", "VCU0000059:3" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 12, "TYPE": "HM-SCI-3-FM", "UPDATABLE": 0, "PARENT": "", "FLAGS": 1, "VERSION": 10, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000059", "ROAMING": 0 }, { "PARENT": "VCU0000059", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-SCI-3-FM", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000059:0", "FLAGS": 3, "VERSION": 10, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000059", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-SCI-3-FM", "AES_ACTIVE": 1, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000059:1", "FLAGS": 1, "VERSION": 10, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000059", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-SCI-3-FM", "AES_ACTIVE": 1, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000059:2", "FLAGS": 1, "VERSION": 10, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000059", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINDOW_SWITCH_RECEIVER WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-SCI-3-FM", "AES_ACTIVE": 1, "TYPE": "SHUTTER_CONTACT", "ADDRESS": "VCU0000059:3", "FLAGS": 1, "VERSION": 10, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "FIRMWARE": "2.9", "CHILDREN": [ "VCU0000060:0", "VCU0000060:1", "VCU0000060:2" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-LC-Sw2PBU-FM", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000060", "ROAMING": 0 }, { "PARENT": "VCU0000060", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Sw2PBU-FM", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000060:0", "FLAGS": 3, "VERSION": 1, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000060", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw2PBU-FM", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000060:1", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000060", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Sw2PBU-FM", "AES_ACTIVE": 0, "TYPE": "SWITCH", "ADDRESS": "VCU0000060:2", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 2 }, { "FIRMWARE": "1.0", "CHILDREN": [ "VCU0000061:0", "VCU0000061:1", "VCU0000061:2", "VCU0000061:3" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 1, "TYPE": "HM-LC-Dim1T-DR", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000061", "ROAMING": 0 }, { "PARENT": "VCU0000061", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-LC-Dim1T-DR", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000061:0", "FLAGS": 3, "VERSION": 1, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000061", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Dim1T-DR", "AES_ACTIVE": 0, "TYPE": "DIMMER", "ADDRESS": "VCU0000061:1", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 1 }, { "PARENT": "VCU0000061", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Dim1T-DR", "AES_ACTIVE": 0, "TYPE": "VIRTUAL_DIMMER", "ADDRESS": "VCU0000061:2", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 2 }, { "PARENT": "VCU0000061", "LINK_SOURCE_ROLES": "", "DIRECTION": 2, "PARENT_TYPE": "HM-LC-Dim1T-DR", "AES_ACTIVE": 0, "TYPE": "VIRTUAL_DIMMER", "ADDRESS": "VCU0000061:3", "FLAGS": 1, "VERSION": 1, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS", "INDEX": 3 }, { "FIRMWARE": "1.1", "CHILDREN": [ "VCU0000062:0", "VCU0000062:1", "VCU0000062:2", "VCU0000062:3", "VCU0000062:4" ], "RF_ADDRESS": 1234567, "INTERFACE": "VCU0000000", "RX_MODE": 28, "TYPE": "HM-RC-4-3", "UPDATABLE": 1, "PARENT": "", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "MASTER" ], "ADDRESS": "VCU0000062", "ROAMING": 0 }, { "PARENT": "VCU0000062", "LINK_SOURCE_ROLES": "", "DIRECTION": 0, "PARENT_TYPE": "HM-RC-4-3", "AES_ACTIVE": 0, "TYPE": "MAINTENANCE", "ADDRESS": "VCU0000062:0", "FLAGS": 3, "VERSION": 7, "PARAMSETS": [ "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 0 }, { "PARENT": "VCU0000062", "GROUP": "VCU0000062:2", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-4-3", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000062:1", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 1 }, { "PARENT": "VCU0000062", "GROUP": "VCU0000062:1", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-4-3", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000062:2", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 2 }, { "PARENT": "VCU0000062", "GROUP": "VCU0000062:4", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-4-3", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000062:3", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 3 }, { "PARENT": "VCU0000062", "GROUP": "VCU0000062:3", "LINK_SOURCE_ROLES": "KEYMATIC REMOTECONTROL_RECEIVER SWITCH WINMATIC", "DIRECTION": 1, "PARENT_TYPE": "HM-RC-4-3", "AES_ACTIVE": 1, "TYPE": "KEY", "ADDRESS": "VCU0000062:4", "FLAGS": 1, "VERSION": 7, "PARAMSETS": [ "LINK", "MASTER", "VALUES" ], "LINK_TARGET_ROLES": "", "INDEX": 4 }, { "AVAILABLE_FIRMWARE": "0.0.0", "AES_ACTIVE": 1, "GROUP": "", "ROAMING": 0, "INTERFACE": "VCU0000000", "FIRMWARE": "1.0.11", "LINK_SOURCE_ROLES": "", "SUBTYPE": "SD", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "DIRECTION": 0, "TYPE": "HmIP-SWSD", "INDEX": 0, "RF_ADDRESS": 4690771, "PARENT": "", "TEAM_TAG": "", "TEAM_CHANNELS": [], "ADDRESS": "VCU0000063", "CHILDREN": [ "7:0", "7:1" ], "TEAM": "", "FLAGS": 1, "UPDATABLE": true, "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "VERSION": 1, "RX_MODE": 3, "PARENT_TYPE": "", "LINK_TARGET_ROLES": "" }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000063", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000063:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000063", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000063:1", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "SMOKE_DETECTOR", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 3, "AES_ACTIVE": 1, "FIRMWARE": "1.8.4", "ADDRESS": "VCU0000064", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "WTH-2", "FLAGS": 1, "CHILDREN": [ "VCU0000064:0", "VCU0000064:1", "VCU0000064:2", "VCU0000064:3", "VCU0000064:4", "VCU0000064:5", "VCU0000064:6", "VCU0000064:7" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HMIP-WTH", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:2", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 2, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_TRV_WTH", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:3", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 3, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_CL_TRANSMITTER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_CL", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:4", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 4, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "WINDOW_SWITCH", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_SHUTTER_CONTACT_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:5", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 5, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_SWITCH_TRANSMITTER", "LINK_SOURCE_ROLES": "SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:6", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 6, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "REMOTE_CONTROL", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_KEY_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000064", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000064:7", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 7, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSMITTER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_FLOOR", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "1.6.2", "ADDRESS": "VCU0000065", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "BSM", "FLAGS": 1, "CHILDREN": [ "VCU0000065:0", "VCU0000065:1", "VCU0000065:2", "VCU0000065:3", "VCU0000065:4", "VCU0000065:5", "VCU0000065:6", "VCU0000065:7", "VCU0000065:8", "VCU0000065:9" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HmIP-BSM", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "KEY_TRANSCEIVER", "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:2", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 2, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "KEY_TRANSCEIVER", "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:3", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 3, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "SWITCH_TRANSMITTER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:4", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 4, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "LEVEL REMOTE_CONTROL SWITCH CONDITIONAL_SWITCH", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:5", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 5, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "LEVEL REMOTE_CONTROL SWITCH CONDITIONAL_SWITCH", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:6", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 6, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "LEVEL REMOTE_CONTROL SWITCH CONDITIONAL_SWITCH", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "SWITCH_VIRTUAL_RECEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:7", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 7, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "ENERGIE_METER_TRANSMITTER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:8", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 8, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "COND_SWITCH_TRANSMITTER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:9", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 9, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "SWITCH_WEEK_PROFILE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000065", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000065:1", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "SMOKE_DETECTOR", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 3, "AES_ACTIVE": 1, "FIRMWARE": "1.0.2", "ADDRESS": "VCU0000066", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "SMO", "FLAGS": 1, "CHILDREN": [ "VCU0000066:0", "VCU0000066:1" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HmIP-SMO", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SMO", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SMO", "TEAM_TAG": "", "TYPE": "MOTIONDETECTOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000066", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000066:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 4, "AES_ACTIVE": 1, "FIRMWARE": "1.2.1", "ADDRESS": "VCU0000067", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "SAM", "FLAGS": 1, "CHILDREN": [ "VCU0000067:0", "VCU0000067:1" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HmIP-SAM", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000067", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000067:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SAM", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000067", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000067:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SAM", "TEAM_TAG": "", "TYPE": "ACCELERATION_TRANSCEIVER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "1.6.2", "ADDRESS": "VCU0000068", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "FAL-C6", "FLAGS": 1, "CHILDREN": [ "VCU0000068:0", "VCU0000068:1", "VCU0000068:2", "VCU0000068:3", "VCU0000068:4", "VCU0000068:5", "VCU0000068:6", "VCU0000068:7", "VCU0000068:8", "VCU0000068:9" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HmIP-FAL230-C6", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_PUMP_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:2", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 2, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:3", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 3, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:4", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 4, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:5", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 5, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:6", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 6, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:7", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 7, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_HEAT_DEMAND_BOILER_TRANSMITTER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:8", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 8, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_HEAT_DEMAND_PUMP_TRANSMITTER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000068", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000068:9", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 9, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_DEHUMIDIFIER_TRANSMITER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "", "RX_MODE": 3, "AES_ACTIVE": 1, "FIRMWARE": "1.0.2", "ADDRESS": "VCU0000069", "PARAMSETS": [ "SERVICE", "MASTER" ], "SUBTYPE": "SMO", "FLAGS": 1, "CHILDREN": [ "VCU0000069:0", "VCU0000069:1" ], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "0.0.0", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "", "TEAM_TAG": "", "TYPE": "HmIP-SMO-A", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SMO-A", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SMO-A", "TEAM_TAG": "", "TYPE": "MOTIONDETECTOR_TRANSCEIVER", "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:1", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 1, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-SWSD", "TEAM_TAG": "", "TYPE": "SMOKE_DETECTOR", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HMIP-WTH", "TEAM_TAG": "", "TYPE": "HEATING_CLIMATECONTROL_TRANSCEIVER", "LINK_SOURCE_ROLES": "CLIMATE_CONTROL_WTH_TRV", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "CLIMATE_CONTROL_FLOOR", "PARENT_TYPE": "HmIP-FAL230-C6", "TEAM_TAG": "", "TYPE": "CLIMATECONTROL_FLOOR_PUMP_TRANSCEIVER", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 2 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:0", "PARAMSETS": [ "VALUES", "SERVICE", "MASTER" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 0, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "MAINTENANCE", "LINK_SOURCE_ROLES": "", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 0 }, { "INTERFACE": "VCU0000000", "PARENT": "VCU0000069", "RX_MODE": 0, "AES_ACTIVE": 1, "FIRMWARE": "", "ADDRESS": "VCU0000069:1", "PARAMSETS": [ "VALUES", "LINK", "MASTER", "SERVICE" ], "SUBTYPE": "", "FLAGS": 1, "CHILDREN": [], "UPDATABLE": true, "INDEX": 1, "RF_ADDRESS": 1234567, "ROAMING": 0, "VERSION": 2, "AVAILABLE_FIRMWARE": "", "TEAM": "", "LINK_TARGET_ROLES": "", "PARENT_TYPE": "HmIP-BSM", "TEAM_TAG": "", "TYPE": "KEY_TRANSCEIVER", "LINK_SOURCE_ROLES": "REMOTE_CONTROL", "FIRMWARE_UPDATE_STATE": "", "GROUP": "", "TEAM_CHANNELS": [], "DIRECTION": 1 }, { "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "0.0.0", "INDEX": 0, "TYPE": "HmIP-STHO-A", "VERSION": 1, "SUBTYPE": "STHO", "ROAMING": 0, "PARENT_TYPE": "", "PARAMSETS": [ "MASTER", "SERVICE" ], "RF_ADDRESS": 1234567, "UPDATABLE": true, "TEAM_TAG": "", "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "", "RX_MODE": 4, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TEAM_CHANNELS": [], "FLAGS": 1, "ADDRESS": "VCU0000070", "GROUP": "", "PARENT": "", "FIRMWARE_UPDATE_STATE": "UP_TO_DATE", "FIRMWARE": "1.0.6", "TEAM": "", "CHILDREN": [ "VCU0000070:0", "VCU0000070:1", "VCU0000070:2", "VCU0000070:3" ] }, { "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "INDEX": 0, "TYPE": "MAINTENANCE", "VERSION": 1, "SUBTYPE": "", "ROAMING": 0, "PARENT_TYPE": "HmIP-STHO-A", "PARAMSETS": [ "VALUES", "MASTER", "SERVICE" ], "RF_ADDRESS": 1234567, "UPDATABLE": true, "TEAM_TAG": "", "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "", "RX_MODE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TEAM_CHANNELS": [], "FLAGS": 1, "ADDRESS": "VCU0000070:0", "GROUP": "", "PARENT": "VCU0000070", "FIRMWARE_UPDATE_STATE": "", "FIRMWARE": "", "TEAM": "", "CHILDREN": [] }, { "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "INDEX": 1, "TYPE": "CLIMATE_TRANSCEIVER", "VERSION": 1, "SUBTYPE": "", "ROAMING": 0, "PARENT_TYPE": "HmIP-STHO-A", "PARAMSETS": [ "VALUES", "MASTER", "SERVICE" ], "RF_ADDRESS": 1234567, "UPDATABLE": true, "TEAM_TAG": "", "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "", "RX_MODE": 0, "DIRECTION": 0, "LINK_TARGET_ROLES": "", "TEAM_CHANNELS": [], "FLAGS": 1, "ADDRESS": "VCU0000070:1", "GROUP": "", "PARENT": "VCU0000070", "FIRMWARE_UPDATE_STATE": "", "FIRMWARE": "", "TEAM": "", "CHILDREN": [] }, { "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "INDEX": 2, "TYPE": "COND_SWITCH_TRANSMITTER", "VERSION": 1, "SUBTYPE": "", "ROAMING": 0, "PARENT_TYPE": "HmIP-STHO-A", "PARAMSETS": [ "VALUES", "MASTER", "LINK", "SERVICE" ], "RF_ADDRESS": 1234567, "UPDATABLE": true, "TEAM_TAG": "", "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "RX_MODE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TEAM_CHANNELS": [], "FLAGS": 1, "ADDRESS": "VCU0000070:2", "GROUP": "", "PARENT": "VCU0000070", "FIRMWARE_UPDATE_STATE": "", "FIRMWARE": "", "TEAM": "", "CHILDREN": [] }, { "INTERFACE": "VCU0000000", "AVAILABLE_FIRMWARE": "", "INDEX": 3, "TYPE": "COND_SWITCH_TRANSMITTER", "VERSION": 1, "SUBTYPE": "", "ROAMING": 0, "PARENT_TYPE": "HmIP-STHO-A", "PARAMSETS": [ "VALUES", "MASTER", "LINK", "SERVICE" ], "RF_ADDRESS": 1234567, "UPDATABLE": true, "TEAM_TAG": "", "AES_ACTIVE": 1, "LINK_SOURCE_ROLES": "CONDITIONAL_SWITCH", "RX_MODE": 0, "DIRECTION": 1, "LINK_TARGET_ROLES": "", "TEAM_CHANNELS": [], "FLAGS": 1, "ADDRESS": "VCU0000070:3", "GROUP": "", "PARENT": "VCU0000070", "FIRMWARE_UPDATE_STATE": "", "FIRMWARE": "", "TEAM": "", "CHILDREN": [] } ]danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/json/device_details.json000066400000000000000000000033461455774063600306620ustar00rootroot00000000000000{ "HM-RCV-50": {}, "HM-LC-Bl1-FM": {}, "HM-Sec-SC-2": {}, "HM-CC-RT-DN": {}, "HM-TC-IT-WM-W-EU": {}, "HM-LC-Sw1-FM": {}, "HM-LC-Sw1-DR": {}, "HM-Sen-MDIR-WM55": {}, "HM-ES-TX-WM": {}, "HM-Sen-DB-PCB": {}, "HM-RC-Sec4-3": {}, "HM-LC-Sw1-Pl-2": {}, "HM-ES-PMSw1-Pl": {}, "HM-PBI-4-FM": {}, "HM-LC-Sw1-Pl-DN-R1": {}, "HM-WDS10-TH-O": {}, "HM-LC-Dim1TPBU-FM": {}, "HM-LC-Sw1PBU-FM": {}, "HM-Sec-SCo": {}, "HM-LC-Dim1T-FM": {}, "HM-PB-2-WM55": {}, "HM-Sec-SD-2": {}, "HM-Dis-WM55": {}, "HmIP-SWSD": {}, "HmIP-STHD": {}, "HM-LC-Sw2-FM": {}, "HM-LC-Bl1PBU-FM": {}, "HM-LC-Sw1-Ba-PCB": {}, "HM-LC-Ja1PBU-FM": {}, "HmIP-BDT": {}, "HMIP-PS": {}, "HmIP-WTH-2": {}, "HMIP-PSM": {}, "BC-RT-TRX-CyG": {}, "BC-PB-2-WM": {}, "BC-TC-C-WM-2": {}, "BC-SC-Rd-WM-2": {}, "BC-RT-TRX-CyG-3": {}, "BC-SC-Rd-WM": {}, "HM-Sen-MDIR-O": {}, "ZEL STG RM FEP 230V": {}, "HM-OU-LED16": {}, "HM-Sec-RHS": {}, "HM-LC-Sw4-PCB": {}, "HM-RC-Key4-2": {}, "HM-WDS40-TH-I-2": {}, "HM-LC-Sw4-DR": {}, "HM-PB-6-WM55": {}, "HM-WDS30-OT2-SM": {}, "HM-OU-CM-PCB": {}, "HM-LC-Sw4-Ba-PCB": {}, "HM-MOD-EM-8": {}, "HM-RC-Dis-H-x-EU": {}, "HM-ES-PMSw1-DR": {}, "HM-ES-PMSw1-SM": {}, "HM-LC-Sw1-Pl-CT-R1": {}, "HM-SCI-3-FM": {}, "HM-LC-Sw2PBU-FM": {}, "HM-LC-Dim1T-DR": {}, "HM-RC-4-3": {}, "HM-Sec-SD-2-Team": {}, "HmIP-FSM16": {"supported": false}, "HM-LC-RGBW-WM": {}, "HMIP-WTH": {}, "HmIP-BSM": {}, "HmIP-SAM": {}, "HmIP-FAL230-C6": {"supported": false}, "HmIP-SMO": {}, "HmIP-SMO-A": {}, "HmIP-STHO": {}, "HmIP-STHO-A": {} } danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/misc.py000066400000000000000000000122651455774063600253570ustar00rootroot00000000000000import logging from pyhomematic.devicetypes.generic import HMDevice from pyhomematic.devicetypes.helper import HelperActionPress, \ HelperEventRemote, HelperEventPress, HelperRssiPeer, HelperLowBatIP, \ HelperLowBat, HelperOperatingVoltageIP LOG = logging.getLogger(__name__) class HMEvent(HMDevice): pass class HMCCU(HMDevice): pass class RemoteVirtual(HMCCU, HelperEventRemote, HelperActionPress): """For virtual remote from ccu/homegear or simple devices with just PRESS_SHORT and PRESS_LONG.""" @property def ELEMENT(self): return list(range(1, 51)) class Remote(HMEvent, HelperEventRemote, HelperActionPress, HelperRssiPeer): """Remote handle buttons.""" @property def ELEMENT(self): if "RC-2" in self.TYPE or "PB-2" in self.TYPE or "WRC2" in self.TYPE or "BRC2" in self.TYPE or "WRCC2" in self.TYPE: return [1, 2] if "HM-Dis-WM55" in self.TYPE or "HM-Dis-EP-WM55" in self.TYPE: return [1, 2] if "HM-RC-Dis-H-x-EU" in self.TYPE: return list(range(1, 21)) if "Sec3" in self.TYPE or "Key3" in self.TYPE: return [1, 2, 3] if "RC-4" in self.TYPE or "PB-4" in self.TYPE: return [1, 2, 3, 4] if "HM-PBI-4-FM" in self.TYPE or "ZEL STG RM FST UP4" in self.TYPE or "263 145" in self.TYPE or "HM-PBI-X" in self.TYPE: return [1, 2, 3, 4] if "Sec4" in self.TYPE or "Key4" in self.TYPE or "KRCA" in self.TYPE or "KRC4" in self.TYPE: return [1, 2, 3, 4] if "PB-6" in self.TYPE or "WRC6" in self.TYPE: return [1, 2, 3, 4, 5, 6] if "RC-8" in self.TYPE or "HM-MOD-EM-8" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8] if "RC-12" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] if "HM-OU-LED16" in self.TYPE: return list(range(1, 16)) if "RC-19" in self.TYPE or "HM-PB-4Dis-WM" in self.TYPE: return list(range(1, 20)) if "HMW-IO-4-FM" in self.TYPE: return [1, 2, 3, 4] if "HmIP-RC8" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8] if "HmIP-MOD-RC8" in self.TYPE: return [1, 2, 3, 4, 5, 6, 7, 8] if "HmIP-WRCD" in self.TYPE or "HmIP-WRCR" in self.TYPE: return [1, 2, 3] return [1] class RemoteWired(HMEvent, HelperEventRemote, HelperActionPress): """Wired Remote handle buttons.""" @property def ELEMENT(self): if "WRC6" in self.TYPE: return [1, 2, 3, 4, 5, 6] if "WRC2" in self.TYPE: return [1, 2] class RemoteBatteryIP(Remote, HelperLowBatIP, HelperOperatingVoltageIP): """Battery operated HomeMaticIP remote device.""" class RemoteBattery(Remote, HelperLowBat): """Battery operated HomeMatic remote device.""" class RemotePress(HMEvent, HelperEventPress, HelperActionPress): """Remote handle buttons.""" @property def ELEMENT(self): return [1, 2, 3] class RemotePressBattery(HMEvent, HelperEventPress, HelperActionPress, HelperLowBat): """Remote handle buttons.""" @property def ELEMENT(self): return [1, 2, 3] DEVICETYPES = { "HM-RCV-50": RemoteVirtual, "HM-RC-2-PBU-FM": Remote, "HM-RC-Dis-H-x-EU": Remote, "HM-RC-4": RemoteBattery, "HM-RC-4-B": RemoteBattery, "HM-RC-4-2": RemoteBattery, "HM-RC-4-3": RemoteBattery, "HM-RC-4-3-D": RemoteBattery, "HB-RC-12-EP-C": RemoteBattery, "HM-RC-8": Remote, "HM-RC-12": Remote, "HM-RC-12-B": Remote, "HM-RC-12-SW": Remote, "HM-RC-19": Remote, "HM-RC-19-B": Remote, "HM-RC-19-SW": Remote, "HM-RC-Key3": Remote, "HM-RC-Key3-B": Remote, "HM-RC-Key4-2": Remote, "HM-RC-Key4-3": Remote, "HM-RC-Sec3": Remote, "HM-RC-Sec3-B": Remote, "HM-RC-Sec4-2": Remote, "HM-RC-Sec4-3": Remote, "HM-RC-P1": Remote, "HM-RC-SB-X": Remote, "HM-RC-X": Remote, "HM-PB-2-FM": Remote, "HM-PB-2-WM": Remote, "BC-PB-2-WM": RemotePressBattery, "HM-PB-4-WM": Remote, "HM-PB-6-WM55": Remote, "HM-PB-2-WM55-2": Remote, "HM-PB-2-WM55": Remote, "HM-PBI-4-FM": Remote, "HM-PBI-X": Remote, "HM-Dis-WM55": Remote, "HM-Dis-EP-WM55": Remote, "HM-MOD-EM-8": Remote, "RC-H": Remote, "BRC-H": Remote, "atent": Remote, "ZEL STG RM WT 2": Remote, "ZEL STG RM HS 4": Remote, "ZEL STG RM FST UP4": Remote, "263 145": Remote, "263 135": Remote, "HM-OU-LED16": Remote, "HM-PB-4Dis-WM": Remote, "HM-PB-4Dis-WM-2": Remote, "HMW-IO-4-FM": Remote, "HMIP-WRC2": RemoteBatteryIP, "HmIP-WRC2": RemoteBatteryIP, "HmIP-WRCC2": RemoteBatteryIP, "HmIP-BRC2": Remote, "HmIP-WRC6": RemoteBatteryIP, "HmIPW-WRC6": RemoteWired, "HmIPW-WRC2": RemoteWired, "HmIP-WRCD": RemoteBatteryIP, "HmIP-WRCR": RemoteBatteryIP, "HmIP-KRCA": RemoteBatteryIP, "HmIP-KRC4": RemoteBatteryIP, "HM-SwI-3-FM": RemotePress, "ZEL STG RM FSS UP3": RemotePress, "263 144": RemotePress, "HM-SwI-X": RemotePress, "HMW-RCV-50": RemoteVirtual, "HmIP-RCV-50": RemoteVirtual, "HmIP-MOD-RC8": RemoteBatteryIP, "HmIP-RC8": RemoteBatteryIP, "HmIP-DBB": RemoteBatteryIP, } danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/sensors.py000066400000000000000000001375631455774063600261310ustar00rootroot00000000000000import logging from pyhomematic.devicetypes.generic import HMDevice from pyhomematic.devicetypes.misc import HMEvent, Remote from pyhomematic.devicetypes.helper import (HelperLowBat, HelperSabotage, HelperLowBatIP, HelperSabotageIP, HelperOperatingVoltageIP, HelperBinaryState, HelperSensorState, HelperWired, HelperEventRemote, HelperRssiPeer, HelperRssiDevice, HelperValveState) LOG = logging.getLogger(__name__) class HMSensor(HMDevice): """This class helps to resolve class inheritance order problems.""" class SensorHmW(HMSensor): """Homematic Wired sensors""" class SensorHmNLB(HMSensor, HelperRssiDevice, HelperRssiPeer): """Homematic sensors always have - strength of the signal received by the device (HelperRssiDevice). Be aware that standard HM devices have a reversed understanding of PEER and DEVICE compared to HMIP devices. - strength of the signal received by the CCU (HelperRssiPeer). Be aware that standard HM devices have a reversed understanding of PEER and DEVICE compared to HMIP devices.""" class SensorHm(HMSensor, HelperRssiDevice, HelperRssiPeer, HelperLowBat): """Homematic sensors always have - strength of the signal received by the device (HelperRssiDevice). Be aware that standard HM devices have a reversed understanding of PEER and DEVICE compared to HMIP devices. - strength of the signal received by the CCU (HelperRssiPeer). Be aware that standard HM devices have a reversed understanding of PEER and DEVICE compared to HMIP devices. - low battery status (HelperLowBat)""" class SensorHmIP(HMSensor, HelperRssiDevice, HelperLowBatIP, HelperOperatingVoltageIP): """Homematic IP sensors always have - strength of the signal received by the CCU (HelperRssiDevice). Be aware that HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - strength of the signal received by the device (HelperRssiPeer). Be aware that standard HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - low battery status (HelperLowBatIP) - voltage of the batteries (HelperOperatingVoltageIP)""" class SensorHmIPW(HMSensor, HelperWired): """Homematic IP Wired sensors""" class SensorHmIPNoVoltage(HMSensor, HelperRssiDevice, HelperLowBatIP): """Some Homematic IP sensors have - strength of the signal received by the CCU (HelperRssiDevice). Be aware that HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - strength of the signal received by the device (HelperRssiPeer). Be aware that standard HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - low battery status (HelperLowBatIP) - but no voltage of batteries""" class SensorHmIPNoLowbat(HMSensor, HelperRssiDevice, HelperOperatingVoltageIP): """Homematic IP sensors always have - strength of the signal received by the CCU (HelperRssiDevice). Be aware that HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - strength of the signal received by the device (HelperRssiPeer). Be aware that standard HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - but no low battery status (HelperLowBatIP) - voltage of the batteries (HelperOperatingVoltageIP)""" class SensorHmIPNoBattery(HMSensor, HelperRssiDevice): """Some Homematic IP sensors have - strength of the signal received by the CCU (HelperRssiDevice). Be aware that HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - strength of the signal received by the device (HelperRssiPeer). Be aware that standard HMIP devices have a reversed understanding of PEER and DEVICE compared to standard HM devices. - but no low battery status (HelperLowBatIP) - but no voltage of batteries""" class ShutterContact(SensorHm, HelperBinaryState, HelperSabotage): """Door / Window contact that emits its open/closed state. This is a binary sensor.""" def is_open(self, channel=None): """ Returns True if the contact is open. """ return self.get_state(channel) def is_closed(self, channel=None): """ Returns True if the contact is closed. """ return not self.get_state(channel) @property def ELEMENT(self): if "HM-SCI-3-FM" in self._TYPE: return [1, 2, 3] return [1] class IPShutterContact(SensorHmIP, HelperBinaryState): """Door / Window contact that emits its open/closed state. This is a binary sensor.""" def is_open(self, channel=None): """ Returns True if the contact is open. """ return self.get_state(channel) def is_closed(self, channel=None): """ Returns True if the contact is closed. """ return not self.get_state(channel) class IPShutterContactSabotage(IPShutterContact, HelperSabotageIP): """Same as IPShutterContact, but with sabotage detection.""" class MaxShutterContact(HelperBinaryState, HelperLowBat): """Door / Window contact that emits its open/closed state. This is a binary sensor.""" class TiltSensor(SensorHm, HelperBinaryState): """Sensor that emits its tilted state. This is a binary sensor.""" def is_tilted(self, channel=None): """ Returns True if the contact is tilted. """ return self.get_state(channel) def is_not_tilted(self, channel=None): """ Returns True if the contact is not tilted. """ return not self.get_state(channel) class RotaryHandleSensor(SensorHm, HelperSensorState, HelperSabotage): """Window handle contact.""" def is_open(self, channel=None): """ Returns True if the handle is set to open. """ return self.get_state(channel) == 2 def is_closed(self, channel=None): """ Returns True if the handle is set to closed. """ return self.get_state(channel) == 0 def is_tilted(self, channel=None): """ Returns True if the handle is set to tilted. """ return self.get_state(channel) == 1 class RotaryHandleSensorIP(SensorHmIP, HelperSensorState, HelperSabotageIP): """Window handle contact.""" def is_open(self, channel=None): """ Returns True if the handle is set to open. """ return self.get_state(channel) == 2 def is_closed(self, channel=None): """ Returns True if the handle is set to closed. """ return self.get_state(channel) == 0 def is_tilted(self, channel=None): """ Returns True if the handle is set to tilted. """ return self.get_state(channel) == 1 class CO2Sensor(SensorHm, HelperSensorState): """CO2 Sensor""" def is_normal(self, channel=None): """ Returns True if CO2 state is normal. """ return self.get_state(channel) == 0 def is_added(self, channel=None): """ Returns True if CO2 state is added. """ return self.get_state(channel) == 1 def is_added_strong(self, channel=None): """ Returns True if CO2 state is added strong. """ return self.get_state(channel) == 2 class CO2SensorIP(SensorHmIPNoBattery): """CO2 Sensor partial support for HmIP-SCTH230 missing relay state and actions """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"CONCENTRATION": [1], "CONCENTRATION_STATUS": [1], "HUMIDITY": [4], "ACTUAL_TEMPERATURE": [4] }) class ParticulateMatterSensorIP(SensorHmIPNoBattery): """Particulate matter sensor""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1], "MASS_CONCENTRATION_PM_1": [1], "MASS_CONCENTRATION_PM_2_5": [1], "MASS_CONCENTRATION_PM_10": [1], "MASS_CONCENTRATION_PM_1_24H_AVERAGE": [1], "MASS_CONCENTRATION_PM_2_5_24H_AVERAGE": [1], "MASS_CONCENTRATION_PM_10_24H_AVERAGE": [1] }) class WaterSensor(SensorHm, HelperSensorState): """Watter detect sensor.""" def is_dry(self, channel=None): """Return True if the state is DRY""" return self.get_state(channel) == 0 def is_wet(self, channel=None): """Return True if the state is WET""" return self.get_state(channel) == 1 def is_water(self, channel=None): """Return True if the state is WATER""" return self.get_state(channel) == 2 class PowermeterGas(SensorHm): """Powermeter for Gas and energy.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"GAS_ENERGY_COUNTER": [1], "GAS_POWER": [1], "ENERGY_COUNTER": [1], "POWER": [1], "IEC_ENERGY_COUNTER": [1,2], "IEC_POWER": [1,2]}) def get_gas_counter(self, channel=None): """Return gas counter.""" return float(self.getSensorData("GAS_ENERGY_COUNTER", channel)) def get_gas_power(self, channel=None): """Return gas power.""" return float(self.getSensorData("GAS_POWER", channel)) def get_energy(self, channel=None): """Return energy counter.""" return float(self.getSensorData("ENERGY_COUNTER", channel)) def get_power(self, channel=None): """Return power counter.""" return float(self.getSensorData("POWER", channel)) def get_iec_energy(self, channel=None): """Return iec energy counter.""" return float(self.getSensorData("IEC_ENERGY_COUNTER", channel)) def get_iec_power(self, channel=None): """Return iec power counter.""" return float(self.getSensorData("IEC_POWER", channel)) class Smoke(SensorHm, HelperBinaryState): """Smoke alarm. This is a binary sensor.""" def is_smoke(self, channel=None): """ Return True if smoke is detected """ return self.get_state(channel) class SmokeV2(SensorHm, HelperBinaryState): """Smoke alarm with Battery. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.ATTRIBUTENODE.update({"ERROR_ALARM_TEST": self.ELEMENT, "ERROR_SMOKE_CHAMBER": self.ELEMENT}) def is_smoke(self, channel=None): """ Return True if smoke is detected """ return self.get_state(channel) class SmokeV2Team(HMSensor, HelperBinaryState): """This is a group of smoke sensors. In such a configuration only the virtual team device will emit a smoke detected event.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.BINARYNODE.update({"STATE": [1]}) self.ATTRIBUTENODE.update({"SENDERADDRESS": [1], "SENDERID": [1]}) def is_smoke(self, channel=None): """ Return True if smoke is detected """ return self.get_state(channel) class IPSmoke(SensorHmIPNoVoltage): """HomeMatic IP Smoke sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"SMOKE_DETECTOR_ALARM_STATUS": self.ELEMENT}) @property def ELEMENT(self): return [1] class GongSensor(SensorHm): """Wireless Gong Sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.EVENTNODE.update({"PRESS_SHORT": self.ELEMENT}) class WiredSensor(SensorHmW, HelperWired): """Wired binary Sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.BINARYNODE.update({"SENSOR": self.ELEMENT}) @property def ELEMENT(self): return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] def get_state(self, channel=None): """ Returns current state of sensor """ return bool(self.getBinaryData("SENSOR", channel)) class FillingLevel(SensorHm): """Filling level sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"FILLING_LEVEL": self.ELEMENT}) def get_level(self, channel=None): """ Return filling level from 0 to 100 % """ return int(self.getSensorData("FILLING_LEVEL", channel)) @property def ELEMENT(self): return [1] class ValveDrive(SensorHm): """Valve drive HM-CC-VD.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"VALVE_STATE": self.ELEMENT}) def get_level(self, channel=None): """ Return valve state from 0% to 99% """ return int(self.getSensorData("VALVE_STATE", channel)) @property def ELEMENT(self): return [1] class Motion(SensorHmNLB): """Motion detection. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION": self.ELEMENT}) self.SENSORNODE.update({"BRIGHTNESS": self.ELEMENT}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark ) to 255 (bright) """ return int(self.getSensorData("BRIGHTNESS", channel)) class SmartwareMotion(HMSensor, HelperRssiDevice): """Motion detection. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"STATE": self.ELEMENT}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("STATE", channel)) @property def ELEMENT(self): return [1] class MotionV2(SensorHm, HelperSabotage): """Motion detection version 2. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION": self.ELEMENT}) self.SENSORNODE.update({"BRIGHTNESS": self.ELEMENT}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark ) to 255 (bright) """ return int(self.getSensorData("BRIGHTNESS", channel)) class MotionIP(SensorHmIP): """Motion detection indoor (rf ip) This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION_DETECTION_ACTIVE": [1], "MOTION": [1]}) self.SENSORNODE.update({"ILLUMINATION": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def is_motion_detection_active(self, channel=None): return bool(self.getBinaryData("MOTION_DETECTION_ACTIVE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [0, 1] class MotionIPContactSabotage(SensorHmIP, HelperSabotageIP): """Motion detection indoor (rf ip) This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION_DETECTION_ACTIVE": [1], "MOTION": [1]}) self.SENSORNODE.update({"ILLUMINATION": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def is_motion_detection_active(self, channel=None): return bool(self.getBinaryData("MOTION_DETECTION_ACTIVE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [0, 1] class MotionIPV2(SensorHmIP): """Motion detection indoor 55 (rf ip) This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION_DETECTION_ACTIVE": [3], "MOTION": [3]}) self.SENSORNODE.update({"ILLUMINATION": [3]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def is_motion_detection_active(self, channel=None): return bool(self.getBinaryData("MOTION_DETECTION_ACTIVE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [0, 1, 2, 3] class MotionIPV2W(SensorHmIPW): """Motion detection indoor 55 (rf ip) This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION_DETECTION_ACTIVE": [3], "MOTION": [3]}) self.SENSORNODE.update({"ILLUMINATION": [3]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def is_motion_detection_active(self, channel=None): return bool(self.getBinaryData("MOTION_DETECTION_ACTIVE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [0, 1, 2, 3] class PresenceIP(SensorHmIP, HelperSabotageIP): """Presence detection with HmIP-SPI. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"PRESENCE_DETECTION_STATE": self.ELEMENT, "PRESENCE_DETECTION_ACTIVE": self.ELEMENT}) self.SENSORNODE.update({"ILLUMINATION": self.ELEMENT, "CURRENT_ILLUMINATION": self.ELEMENT}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("PRESENCE_DETECTION_STATE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [1] class PresenceIPW(SensorHmIPW): """Presence detection with HmIPW-SPI. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"PRESENCE_DETECTION_STATE": self.ELEMENT, "PRESENCE_DETECTION_ACTIVE": self.ELEMENT, "CURRENT_ILLUMINATION_STATUS": self.ELEMENT, "ILLUMINATION_STATUS": self.ELEMENT}) self.SENSORNODE.update({"ILLUMINATION": self.ELEMENT, "CURRENT_ILLUMINATION": self.ELEMENT}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("PRESENCE_DETECTION_STATE", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark) to 163830 (bright) """ return float(self.getSensorData("ILLUMINATION", channel)) @property def ELEMENT(self): return [1] class TiltIP(SensorHmIP): """Tilt detection with HmIP-SAM. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) @property def ELEMENT(self): return [0, 1] class RemoteMotion(SensorHm, Remote): """Motion detection with buttons. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"MOTION": [3]}) self.SENSORNODE.update({"BRIGHTNESS": [3]}) def is_motion(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("MOTION", channel)) def get_brightness(self, channel=None): """ Return brightness from 0 (dark ) to 255 (bright) """ return int(self.getSensorData("BRIGHTNESS", channel)) @property def ELEMENT(self): return [1, 2] class IPRemoteMotionV2(Remote, MotionIPV2): """Motion detection with buttons (hm ip). This is a binary sensor.""" # pylint: disable=useless-super-delegation def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) class IPRemoteMotionV2W(Remote, MotionIPV2W): """Wired motion detection with buttons (hm ip). This is a binary sensor.""" # pylint: disable=useless-super-delegation def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) class LuxSensor(SensorHm): """Sensor for messure LUX.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"LUX": [1]}) def get_lux(self, channel=None): """Return messure lux.""" return float(self.getSensorData("LUX", channel)) class ImpulseSensor(HMEvent): """Inpulse sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.EVENTNODE.update({"SEQUENCE_OK": self.ELEMENT}) class AreaThermostat(SensorHmNLB): """Wall mount thermostat.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": self.ELEMENT, "HUMIDITY": self.ELEMENT}) def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) class IPAreaThermostat(SensorHmIP): """Wall mount thermostat.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) class IPAreaThermostatNoBattery(SensorHmIPNoBattery): """Wall mount thermostat without battery.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) class TemperatureSensor(SensorHm): """Temperature Sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata (HB-UNI-Sen-TEMP-DS18B20 has 8 temperature values) if "HB-UNI-Sen-TEMP-DS18B20" in self._TYPE: self.SENSORNODE.update({"TEMPERATURE": [1, 2, 3, 4, 5, 6, 7, 8]}) else: self.SENSORNODE.update({"TEMPERATURE": self.ELEMENT}) def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) class HBUNISenWEA(TemperatureSensor): """HB-UNI-Sen-WEA""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"AIR_PRESSURE": self.ELEMENT, "HUMIDITY": self.ELEMENT, "LUX": self.ELEMENT, "RAIN_COUNTER": self.ELEMENT, "WIND_SPEED": self.ELEMENT, "WIND_DIRECTION": self.ELEMENT, "WIND_DIRECTION_RANGE": self.ELEMENT, "GUST_SPEED": self.ELEMENT, "UVINDEX": self.ELEMENT, "LIGHTNING_COUNTER": self.ELEMENT, "LIGHNTING_DISTANCE": self.ELEMENT}) class TemperatureDiffSensor(SensorHm): """Temperature difference Sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": [1, 2, 3, 4]}) def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) class WeatherSensor(SensorHm): """Weather sensor. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": self.ELEMENT, "HUMIDITY": self.ELEMENT, "RAIN_COUNTER": self.ELEMENT, "WIND_SPEED": self.ELEMENT, "WIND_DIRECTION": self.ELEMENT, "WIND_DIRECTION_RANGE": self.ELEMENT, "SUNSHINEDURATION": self.ELEMENT, "BRIGHTNESS": self.ELEMENT}) self.BINARYNODE.update({"RAINING": self.ELEMENT}) del self.ATTRIBUTENODE["LOWBAT"] def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_rain_counter(self, channel=None): return float(self.getSensorData("RAIN_COUNTER", channel)) def get_wind_speed(self, channel=None): return float(self.getSensorData("WIND_SPEED", channel)) def get_wind_direction(self, channel=None): return int(self.getSensorData("WIND_DIRECTION", channel)) def get_wind_direction_range(self, channel=None): return int(self.getSensorData("WIND_DIRECTION_RANGE", channel)) def get_sunshineduration(self, channel=None): return int(self.getSensorData("SUNSHINEDURATION", channel)) def get_brightness(self, channel=None): return int(self.getSensorData("BRIGHTNESS", channel)) def is_raining(self, channel=None): """ Return True if motion is detected """ return bool(self.getBinaryData("RAINING", channel)) class IPWeatherSensorPlus(SensorHmIP): """HomeMatic IP Weather sensor Plus. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1], "RAIN_COUNTER": [1], "WIND_SPEED": [1], "SUNSHINEDURATION": [1], "ILLUMINATION": [1]}) self.BINARYNODE.update({"RAINING": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0], "TEMPERATURE_OUT_OF_RANGE": [0]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_rain_counter(self, channel=None): return float(self.getSensorData("RAIN_COUNTER", channel)) def get_wind_speed(self, channel=None): return float(self.getSensorData("WIND_SPEED", channel)) def get_sunshineduration(self, channel=None): return int(self.getSensorData("SUNSHINEDURATION", channel)) def get_brightness(self, channel=None): return int(self.getSensorData("ILLUMINATION", channel)) def is_raining(self, channel=None): return bool(self.getBinaryData("RAINING", channel)) def is_temperature_out_of_range(self, channel=None): return bool(self.getAttributeData("TEMPERATURE_OUT_OF_RANGE", channel)) class IPWeatherSensorBasic(SensorHmIP): """HomeMatic IP Weather sensor Basic.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1], "WIND_SPEED": [1], "SUNSHINEDURATION": [1], "ILLUMINATION": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0], "TEMPERATURE_OUT_OF_RANGE": [0]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_wind_speed(self, channel=None): return float(self.getSensorData("WIND_SPEED", channel)) def get_sunshineduration(self, channel=None): return int(self.getSensorData("SUNSHINEDURATION", channel)) def get_brightness(self, channel=None): return int(self.getSensorData("ILLUMINATION", channel)) def is_temperature_out_of_range(self, channel=None): return bool(self.getAttributeData("TEMPERATURE_OUT_OF_RANGE", channel)) class IPRainSensor(SensorHmIPNoLowbat): """HomeMatic IP Rain sensor HmIP-SRD.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1]}) self.BINARYNODE.update({"RAINING": [1], "HEATER_STATE": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0], "OPERATING_VOLTAGE": [0]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def is_raining(self, channel=None): return bool(self.getBinaryData("RAINING", channel)) class IPPassageSensor(SensorHmIP, HelperRssiPeer, HelperEventRemote): """HomeMatic IP Passage Sensor. #2 = right to left, #3 = left to right This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"PASSAGE_COUNTER_VALUE": self.ELEMENT}) self.BINARYNODE.update({"PASSAGE_COUNTER_OVERFLOW": self.ELEMENT, "LAST_PASSAGE_DIRECTION": [2], "CURRENT_PASSAGE_DIRECTION": [2]}) @property def ELEMENT(self): return [2, 3] class IPWeatherSensor(SensorHmIP): """HomeMatic IP Weather sensor. This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1], "RAIN_COUNTER": [1], "WIND_SPEED": [1], "WIND_DIR": [1], "WIND_DIR_RANGE": [1], "SUNSHINEDURATION": [1], "ILLUMINATION": [1]}) self.BINARYNODE.update({"RAINING": [1]}) self.ATTRIBUTENODE.update({"ERROR_CODE": [0], "TEMPERATURE_OUT_OF_RANGE": [0]}) def get_temperature(self, channel=None): return float(self.getSensorData("ACTUAL_TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_rain_counter(self, channel=None): return float(self.getSensorData("RAIN_COUNTER", channel)) def get_wind_speed(self, channel=None): return float(self.getSensorData("WIND_SPEED", channel)) def get_wind_direction(self, channel=None): return int(self.getSensorData("WIND_DIR", channel)) def get_wind_direction_range(self, channel=None): return int(self.getSensorData("WIND_DIR_RANGE", channel)) def get_sunshineduration(self, channel=None): return int(self.getSensorData("SUNSHINEDURATION", channel)) def get_brightness(self, channel=None): return int(self.getSensorData("ILLUMINATION", channel)) def is_raining(self, channel=None): return bool(self.getBinaryData("RAINING", channel)) def is_temperature_out_of_range(self, channel=None): return bool(self.getAttributeData("TEMPERATURE_OUT_OF_RANGE", channel)) class WeatherStation(SensorHm): """Weather station.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": self.ELEMENT, "HUMIDITY": self.ELEMENT, "AIR_PRESSURE": self.ELEMENT}) def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_air_pressure(self, channel=None): return int(self.getSensorData("AIR_PRESSURE", channel)) class IPBrightnessSensor(SensorHmIP): """IP Sensor for outdoor brightness measure""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"CURRENT_ILLUMINATION": [1], "AVERAGE_ILLUMINATION": [1], "LOWEST_ILLUMINATION": [1], "HIGHEST_ILLUMINATION": [1]}) class UniversalSensor(HMSensor, HelperLowBat, HelperRssiPeer, HelperValveState): """Universal sensor. (https://wiki.fhem.de/wiki/Universalsensor)""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": self.ELEMENT, "HUMIDITY": self.ELEMENT, "AIR_PRESSURE": self.ELEMENT}) if "HB-UNI-Sensor1" in self._TYPE: self.SENSORNODE.update({"OPERATING_VOLTAGE": self.ELEMENT, "LUX": self.ELEMENT, "VALVE_STATE": self.ELEMENT}) else: self.SENSORNODE.update({"BatteryVoltage": [1], "LUMINOSITY": [1]}) def get_temperature(self, channel=None): return float(self.getSensorData("TEMPERATURE", channel)) def get_humidity(self, channel=None): return int(self.getSensorData("HUMIDITY", channel)) def get_air_pressure(self, channel=None): return int(self.getSensorData("AIR_PRESSURE", channel)) def get_luminosity(self, channel=None): if "HB-UNI-Sensor1" in self._TYPE: return float(self.getSensorData("LUX", channel)) else: return float(self.getSensorData("LUMINOSITY", channel)) def get_battery_voltage(self, channel=None): if "HB-UNI-Sensor1" in self._TYPE: return float(self.getSensorData("OPERATING_VOLTAGE", channel)) else: return float(self.getSensorData("BatteryVoltage", channel)) class WaterIP(SensorHmIP): """Water sensor HmIP-SWD This is a binary sensor.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({"ALARMSTATE": self.ELEMENT, "MOISTURE_DETECTED": self.ELEMENT, "WATERLEVEL_DETECTED": self.ELEMENT}) @property def ELEMENT(self): return [1] class IPContact(SensorHmIP, HelperBinaryState, HelperEventRemote): """Multi purpose contact that emits its open/closed state. This is a binary sensor. Supports multiple modes""" def is_open(self, channel=None): """ Returns True if the contact is open. """ return self.get_state(channel) def is_closed(self, channel=None): """ Returns True if the contact is closed. """ return not self.get_state(channel) def is_on(self, channel=None): """ Returns True if switch is on. """ return self.get_state(channel) def is_off(self, channel=None): """ Returns True if switch is off. """ return not self.get_state(channel) @property def ELEMENT(self): if "FCI6" in self._TYPE: return [1, 2, 3, 4, 5, 6] elif "FCI1" in self._TYPE: return [1] return [1] class IPAlarmSensor(SensorHmIP, HelperSabotageIP): """Alarm Sirene that emits its Acoustic and Optical Alarm Status""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.BINARYNODE.update({ "OPTICAL_ALARM_ACTIVE": [3], "ACOUSTIC_ALARM_ACTIVE": [3] }) def is_optical_alarm_active(self, channel=None): return bool(self.getBinaryData("OPTICAL_ALARM_ACTIVE", channel)) def is_acoustic_alarm_active(self, channel=None): return bool(self.getBinaryData("ACOUSTIC_ALARM_ACTIVE", channel)) class ValveBox(SensorHmIP): """Valve Box HmIP-FALMOT-C12""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"LEVEL": self.ELEMENT}) def get_level(self, channel=None): """Return valve state from 0% to 99%""" return float(self.getSensorData("LEVEL", channel)) @property def ELEMENT(self): return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] class ValveBoxW(SensorHmIPW): """Valve Box HmIPW-FALMOT-C12""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"LEVEL": self.ELEMENT}) def get_level(self, channel=None): """Return valve state from 0% to 99%""" return float(self.getSensorData("LEVEL", channel)) @property def ELEMENT(self): return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] class IPLanRouter(HMSensor): """ HmIP Lan Router HmIP-HAP""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) self.SENSORNODE.update({"CARRIER_SENSE_LEVEL": [0], "DUTY_CYCLE_LEVEL": [0]}) self.BINARYNODE.update({"DUTY_CYCLE": [0]}) def get_duty_cycle_level(self, channel=None): return float(self.getSensorData("DUTY_CYCLE_LEVEL", channel)) def get_carrier_sense_level(self, channel=None): return float(self.getSensorData("CARRIER_SENSE_LEVEL", channel)) class TempModuleSTE2(SensorHmIP): """HmIP-STE2-PCB.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": self.ELEMENT, "ACTUAL_TEMPERATURE_STATUS": self.ELEMENT}) @property def ELEMENT(self): return [1, 2, 3] class IPLockDLD(SensorHmIP): """Lock state for HmIP-DLD.""" def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"LOCK_STATE": [1]}) DEVICETYPES = { "HM-Sec-SC": ShutterContact, "HM-Sec-SC-2": ShutterContact, "HM-Sec-SCo": ShutterContact, "ZEL STG RM FFK": ShutterContact, "BC-SC-Rd-WM-2": MaxShutterContact, "BC-SC-Rd-WM": MaxShutterContact, "HM-SCI-3-FM": ShutterContact, "HmIP-SCI": IPShutterContactSabotage, "HMIP-SWDO": IPShutterContactSabotage, "HmIP-SWDO": IPShutterContactSabotage, "HmIP-SWDO-PL": IPShutterContactSabotage, "HmIP-SWDO-I": IPShutterContactSabotage, "HmIP-SWDM": IPShutterContact, "HmIP-SWDM-2": IPShutterContact, "HmIP-SWDM-B2": IPShutterContact, "HmIP-SRH": RotaryHandleSensorIP, "HM-Sec-RHS": RotaryHandleSensor, "ZEL STG RM FDK": RotaryHandleSensor, "HM-Sec-RHS-2": RotaryHandleSensor, "HM-Sec-xx": RotaryHandleSensor, "HM-Sec-WDS": WaterSensor, "HM-Sec-WDS-2": WaterSensor, "HM-ES-TX-WM": PowermeterGas, "HM-Sen-DB-PCB": GongSensor, "HM-Sec-SD": Smoke, "HM-Sec-SD-Generic": Smoke, "HM-Sec-SD-2": SmokeV2, "HM-Sec-SD-2-Generic": SmokeV2, "HM-Sec-SD-2-Team": SmokeV2Team, "HmIP-SWSD": IPSmoke, "HM-Sen-MDIR-WM55": RemoteMotion, "HM-Sen-MDIR-SM": Motion, "HM-Sen-MDIR-O": Motion, "HM-MD": Motion, "HM-Sen-MDIR-O-2": Motion, "HM-Sen-MDIR-O-3": Motion, "HM-Sec-MDIR-3": MotionV2, "HM-Sec-MDIR-2": MotionV2, "HM-Sec-MDIR": MotionV2, "263 162": MotionV2, "HM-Sec-MD": MotionV2, "HmIP-SMI": MotionIPContactSabotage, "HmIP-SMI55": IPRemoteMotionV2, "HmIP-SMI55-2": IPRemoteMotionV2, "HmIPW-SMI55": IPRemoteMotionV2W, "HmIP-SMO": MotionIP, "HmIP-SMO-A": MotionIP, "HmIP-SMO-2": MotionIP, "HmIP-SPI": PresenceIP, "HmIPW-SPI": PresenceIPW, "HM-Sen-LI-O": LuxSensor, "HM-Sen-EP": ImpulseSensor, "HM-Sen-X": ImpulseSensor, "ASH550I": AreaThermostat, "ASH550": AreaThermostat, "HM-WDS10-TH-O": AreaThermostat, "HM-WDS20-TH-O": AreaThermostat, "HM-WDS40-TH-I": AreaThermostat, "HM-WDS40-TH-I-2": AreaThermostat, "263 157": AreaThermostat, "263 158": AreaThermostat, "IS-WDS-TH-OD-S-R3": AreaThermostat, "HM-WDS100-C6-O": WeatherSensor, "HM-WDS100-C6-O-2": WeatherSensor, "KS550": WeatherSensor, "KS888": WeatherSensor, "KS550Tech": WeatherSensor, "KS550LC": WeatherSensor, "HmIP-SWO-PR": IPWeatherSensor, "HmIP-SWO-PL": IPWeatherSensorPlus, "HmIP-SWO-B": IPWeatherSensorBasic, "WS550": WeatherStation, "WS888": WeatherStation, "WS550Tech": WeatherStation, "WS550LCB": WeatherStation, "WS550LCW": WeatherStation, "HM-WDC7000": WeatherStation, "HM-Sec-TiS": TiltSensor, "HM-CC-SCD": CO2Sensor, "263 160": CO2Sensor, "HM-WDS30-OT2-SM": TemperatureDiffSensor, "HM-WDS30-OT2-SM-2": TemperatureDiffSensor, "HM-WDS30-T-O": TemperatureSensor, "S550IA": TemperatureSensor, "HM-Sen-Wa-Od": FillingLevel, "HMW-Sen-SC-12-DR": WiredSensor, "HMW-Sen-SC-12-FM": WiredSensor, "HM-CC-VD": ValveDrive, "ZEL STG RM FSA": ValveDrive, "HmIP-SAM": TiltIP, "HmIP-STHO": IPAreaThermostat, "HmIP-STHO-A": IPAreaThermostat, "HmIP-SPDR": IPPassageSensor, "IT-Old-Remote-1-Channel": SmartwareMotion, "HmIP-SLO": IPBrightnessSensor, "HB-UW-Sen-THPL-O": UniversalSensor, "HB-UW-Sen-THPL-I": UniversalSensor, "HmIP-SWD": WaterIP, "HB-UNI-Sensor1": UniversalSensor, "HmIP-FCI1": IPContact, "HmIP-FCI6": IPContact, "HmIP-DSD-PCB": IPContact, "HB-UNI-Sen-TEMP-DS18B20": TemperatureSensor, "HB-UNI-Sen-WEA": HBUNISenWEA, "HmIP-ASIR-B1": IPAlarmSensor, "HmIP-ASIR-O": IPAlarmSensor, "HmIP-ASIR": IPAlarmSensor, "HmIP-ASIR-2": IPAlarmSensor, "HmIP-FALMOT-C12": ValveBox, "HmIPW-FALMOT-C12": ValveBoxW, "HmIP-SRD": IPRainSensor, "HmIP-HAP": IPLanRouter, "HB-WDS40-THP-O": WeatherStation, "HmIP-STE2-PCB": TempModuleSTE2, "HmIP-SCTH230": CO2SensorIP, "HmIP-DLD": IPLockDLD, "HmIP-SFD": ParticulateMatterSensorIP, } danielperna84-pyhomematic-8aaf60d/pyhomematic/devicetypes/thermostats.py000066400000000000000000000454301455774063600270010ustar00rootroot00000000000000import logging from pyhomematic.devicetypes.generic import HMDevice from pyhomematic.devicetypes.sensors import AreaThermostat, IPAreaThermostat, IPAreaThermostatNoBattery from pyhomematic.devicetypes.helper import HelperValveState, HelperBatteryState, HelperLowBat, HelperLowBatIP, HelperRssiPeer, HelperRssiDevice, HelperWired LOG = logging.getLogger(__name__) class HMThermostat(HMDevice): """ HM-CC-RT-DN, HM-CC-RT-DN-BoM ClimateControl-RadiatorThermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # constante self.AUTO_MODE = 0 self.MANU_MODE = 1 self.PARTY_MODE = 2 self.BOOST_MODE = 3 self.COMFORT_MODE = 4 self.LOWERING_MODE = 5 self.OFF_VALUE = 4.5 def actual_temperature(self): """ Returns the current temperature. """ return self.getSensorData("ACTUAL_TEMPERATURE") def get_set_temperature(self): """ Returns the current target temperature. """ return self.getWriteData("SET_TEMPERATURE") def set_temperature(self, target_temperature): """ Set the target temperature. """ try: target_temperature = float(target_temperature) except Exception as err: LOG.debug("Thermostat.set_temperature: Exception %s" % (err,)) return False self.writeNodeData("SET_TEMPERATURE", target_temperature) def turnoff(self): """ Turn off Thermostat. """ self.writeNodeData("SET_TEMPERATURE", self.OFF_VALUE) @property def MODE(self): """ Return mode. """ return self.getAttributeData("CONTROL_MODE") @MODE.setter def MODE(self, setmode): """ Set mode. """ set_data = True mode = None if setmode == self.AUTO_MODE: mode = 'AUTO_MODE' elif setmode == self.MANU_MODE: mode = 'MANU_MODE' set_data = self.get_set_temperature() elif setmode == self.BOOST_MODE: mode = 'BOOST_MODE' elif setmode == self.COMFORT_MODE: mode = 'COMFORT_MODE' elif setmode == self.LOWERING_MODE: mode = 'LOWERING_MODE' else: LOG.warning("Thermostat.MODE.setter: Invalid mode: %s" % str(setmode)) if mode: self.actionNodeData(mode, set_data) @property def AUTOMODE(self): """ Return auto mode state. """ return self.MODE == self.AUTO_MODE @property def MANUMODE(self): """ Return manual mode state. """ return self.MODE == self.MANU_MODE @property def PARTYMODE(self): """ Return party mode state. """ return self.MODE == self.PARTY_MODE @property def BOOSTMODE(self): """ Return boost state. """ return self.MODE == self.BOOST_MODE @property def COMFORTMODE(self): """ Return comfort state. """ return self.MODE == self.COMFORT_MODE @property def LOWERINGMODE(self): """ Return lowering state. """ return self.MODE == self.LOWERING_MODE class ThermostatGroup(HMThermostat): """ HM-CC-VG-1 Thermostatgroups made up out of multiple supported thermostats """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1]}) self.WRITENODE.update({"SET_TEMPERATURE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "BOOST_MODE": [1], "COMFORT_MODE": [1], "LOWERING_MODE": [1]}) self.ATTRIBUTENODE.update({"VALVE_STATE": [1], "CONTROL_MODE": [1]}) class Thermostat(HMThermostat, HelperBatteryState, HelperValveState, HelperRssiPeer, HelperLowBat): """ HM-CC-RT-DN, HM-CC-RT-DN-BoM ClimateControl-Radiator Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [4]}) self.WRITENODE.update({"SET_TEMPERATURE": [4]}) self.ACTIONNODE.update({"AUTO_MODE": [4], "MANU_MODE": [4], "BOOST_MODE": [4], "COMFORT_MODE": [4], "LOWERING_MODE": [4]}) self.ATTRIBUTENODE.update({"VALVE_STATE": [4], "BATTERY_STATE": [4], "CONTROL_MODE": [4]}) class ThermostatWall(HMThermostat, AreaThermostat, HelperBatteryState, HelperRssiPeer, HelperLowBat): """ HM-TC-IT-WM-W-EU ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [2], "ACTUAL_HUMIDITY": [2]}) self.WRITENODE.update({"SET_TEMPERATURE": [2]}) self.ACTIONNODE.update({"AUTO_MODE": [2], "MANU_MODE": [2], "BOOST_MODE": [2], "COMFORT_MODE": [2], "LOWERING_MODE": [2]}) self.ATTRIBUTENODE.update({"CONTROL_MODE": [2], "BATTERY_STATE": [2]}) class ThermostatWall2(HMThermostat, AreaThermostat): """ HM-CC-TC ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"TEMPERATURE": [1], "HUMIDITY": [1]}) self.WRITENODE.update({"SETPOINT": [2]}) class MAXThermostat(HMThermostat, HelperLowBat, HelperValveState): """ BC-RT-TRX-CyG, BC-RT-TRX-CyG-2, BC-RT-TRX-CyG-3, BC-RT-TRX-CyG-4 ClimateControl-Radiator Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1]}) self.WRITENODE.update({"SET_TEMPERATURE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"CONTROL_MODE": [1], "VALVE_STATE": [1]}) class MAXWallThermostat(HMThermostat, HelperLowBat): """ BC-TC-C-WM-4 ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1]}) self.WRITENODE.update({"SET_TEMPERATURE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"CONTROL_MODE": [1]}) class IPThermostat(HMThermostat, HelperRssiDevice, HelperLowBatIP, HelperValveState): """ HPIM-eTRV ClimateControl-Radiator Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1]}) self.WRITENODE.update({"SET_POINT_TEMPERATURE": [1], "WINDOW_STATE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "CONTROL_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"LOW_BAT": [0], "OPERATING_VOLTAGE": [0], "SET_POINT_MODE": [1], "BOOST_MODE": [1], "VALVE_STATE": [1], "LEVEL": [1]}) def get_set_temperature(self): """ Returns the current target temperature. """ return self.getWriteData("SET_POINT_TEMPERATURE") def set_temperature(self, target_temperature): """ Set the target temperature. """ try: target_temperature = float(target_temperature) except Exception as err: LOG.debug("Thermostat.set_temperature: Exception %s" % (err,)) return False self.writeNodeData("SET_POINT_TEMPERATURE", target_temperature) def get_window_state(self): """ Returns the current window state. """ return self.getWriteData("WINDOW_STATE") def set_window_state(self, target_state): """ Set the target window state. """ try: target_state = int(target_state) except Exception as err: LOG.debug("Thermostat.set_window_state: Exception %s" % (err,)) return False self.writeNodeData("WINDOW_STATE", target_state) @property def MODE(self): """ Return mode. """ if self.getAttributeData("BOOST_MODE"): return self.BOOST_MODE else: return self.getAttributeData("SET_POINT_MODE") @MODE.setter def MODE(self, setmode): """ Set mode. """ if setmode == self.BOOST_MODE: self.actionNodeData('BOOST_MODE', True) elif setmode in [self.AUTO_MODE, self.MANU_MODE]: if self.getAttributeData("BOOST_MODE"): self.actionNodeData('BOOST_MODE', False) self.actionNodeData('CONTROL_MODE', setmode) def turnoff(self): """ Turn off Thermostat. """ self.writeNodeData("SET_POINT_TEMPERATURE", self.OFF_VALUE) self.actionNodeData('CONTROL_MODE', self.MANU_MODE) class IPThermostatWall230V(HMThermostat, IPAreaThermostatNoBattery, HelperRssiDevice): """ HmIP-BWTH, HmIP-BWTH24 ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1]}) self.WRITENODE.update({"SET_POINT_TEMPERATURE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "CONTROL_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"SET_POINT_MODE": [1], "BOOST_MODE": [1], "STATE": [8]}) def get_set_temperature(self): """ Returns the current target temperature. """ return self.getWriteData("SET_POINT_TEMPERATURE") def set_temperature(self, target_temperature): """ Set the target temperature. """ try: target_temperature = float(target_temperature) except Exception as err: LOG.debug("Thermostat.set_temperature: Exception %s" % (err,)) return False self.writeNodeData("SET_POINT_TEMPERATURE", target_temperature) @property def MODE(self): """ Return mode. """ if self.getAttributeData("BOOST_MODE"): return self.BOOST_MODE else: return self.getAttributeData("SET_POINT_MODE") @MODE.setter def MODE(self, setmode): """ Set mode. """ if setmode == self.BOOST_MODE: self.actionNodeData('BOOST_MODE', True) elif setmode in [self.AUTO_MODE, self.MANU_MODE]: if self.getAttributeData("BOOST_MODE"): self.actionNodeData('BOOST_MODE', False) self.actionNodeData('CONTROL_MODE', setmode) def turnoff(self): """ Turn off Thermostat. """ self.writeNodeData("SET_POINT_TEMPERATURE", self.OFF_VALUE) self.actionNodeData('CONTROL_MODE', self.MANU_MODE) class IPThermostatWall2(HMThermostat, IPAreaThermostat, HelperRssiDevice, HelperLowBatIP): """ HmIP-WTH, HmIP-WTH-2, HmIP-STHD, HmIP-STH ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1]}) self.WRITENODE.update({"SET_POINT_TEMPERATURE": [1]}) self.ACTIONNODE.update({"AUTO_MODE": [1], "MANU_MODE": [1], "CONTROL_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"LOW_BAT": [0], "OPERATING_VOLTAGE": [0], "SET_POINT_MODE": [1], "BOOST_MODE": [1]}) def get_set_temperature(self): """ Returns the current target temperature. """ return self.getWriteData("SET_POINT_TEMPERATURE") def set_temperature(self, target_temperature): """ Set the target temperature. """ try: target_temperature = float(target_temperature) except Exception as err: LOG.debug("Thermostat.set_temperature: Exception %s" % (err,)) return False self.writeNodeData("SET_POINT_TEMPERATURE", target_temperature) @property def MODE(self): """ Return mode. """ if self.getAttributeData("BOOST_MODE"): return self.BOOST_MODE else: return self.getAttributeData("SET_POINT_MODE") @MODE.setter def MODE(self, setmode): """ Set mode. """ if setmode == self.BOOST_MODE: self.actionNodeData('BOOST_MODE', True) elif setmode in [self.AUTO_MODE, self.MANU_MODE]: if self.getAttributeData("BOOST_MODE"): self.actionNodeData('BOOST_MODE', False) self.actionNodeData('CONTROL_MODE', setmode) def turnoff(self): """ Turn off Thermostat. """ self.writeNodeData("SET_POINT_TEMPERATURE", self.OFF_VALUE) self.actionNodeData('CONTROL_MODE', self.MANU_MODE) class IPWThermostatWall(HMThermostat, IPAreaThermostatNoBattery, HelperWired): """ HmIPW-STH, HmIPW-STHD, HmIPW-WTH ClimateControl-Wall Thermostat that measures temperature and allows to set a target temperature or use some automatic mode. """ def __init__(self, device_description, proxy, resolveparamsets=False): super().__init__(device_description, proxy, resolveparamsets) # init metadata self.SENSORNODE.update({"ACTUAL_TEMPERATURE": [1], "HUMIDITY": [1]}) self.WRITENODE.update({"SET_POINT_TEMPERATURE": [1]}) self.ACTIONNODE.update({"CONTROL_MODE": [1], "BOOST_MODE": [1]}) self.ATTRIBUTENODE.update({"OPERATING_VOLTAGE": [0], "SET_POINT_MODE": [1], "BOOST_MODE": [1]}) def get_set_temperature(self): """ Returns the current target temperature. """ return self.getWriteData("SET_POINT_TEMPERATURE") def set_temperature(self, target_temperature): """ Set the target temperature. """ try: target_temperature = float(target_temperature) except Exception as err: LOG.debug("Thermostat.set_temperature: Exception %s" % (err,)) return False self.writeNodeData("SET_POINT_TEMPERATURE", target_temperature) @property def MODE(self): """ Return mode. """ return self.getAttributeData("SET_POINT_MODE") @MODE.setter def MODE(self, setmode): """ Set mode. """ if setmode == self.BOOST_MODE: self.actionNodeData('BOOST_MODE', True) elif setmode in [self.AUTO_MODE, self.MANU_MODE]: if self.getAttributeData("BOOST_MODE"): self.actionNodeData('BOOST_MODE', False) self.actionNodeData('CONTROL_MODE', setmode) def turnoff(self): """ Turn off Thermostat. """ self.writeNodeData('SET_POINT_TEMPERATURE', self.OFF_VALUE) self.actionNodeData('CONTROL_MODE', self.MANU_MODE) DEVICETYPES = { "HM-CC-VG-1": ThermostatGroup, "HM-CC-RT-DN": Thermostat, "HM-CC-RT-DN-BoM": Thermostat, "HM-TC-IT-WM-W-EU": ThermostatWall, "HM-CC-TC": ThermostatWall2, "ZEL STG RM FWT": ThermostatWall2, "BC-RT-TRX-CyG": MAXThermostat, "BC-RT-TRX-CyG-2": MAXThermostat, "BC-RT-TRX-CyG-3": MAXThermostat, "BC-RT-TRX-CyG-4": MAXThermostat, "BC-RT-TRX-CyN": MAXThermostat, "BC-TC-C-WM-2": MAXWallThermostat, "BC-TC-C-WM-4": MAXWallThermostat, "HMIP-eTRV": IPThermostat, "HmIP-eTRV": IPThermostat, "HmIP-eTRV-2": IPThermostat, "HmIP-eTRV-2-UK": IPThermostat, "HmIP-eTRV-B": IPThermostat, "HmIP-eTRV-B-UK": IPThermostat, "HmIP-eTRV-B1": IPThermostat, "HmIP-eTRV-C": IPThermostat, "HmIP-eTRV-C-2": IPThermostat, "HmIP-eTRV-E": IPThermostat, "Thermostat AA": IPThermostat, "Thermostat AA GB": IPThermostat, "HmIP-STHD": IPThermostatWall2, "HmIP-STH": IPThermostatWall2, "HmIP-WTH-2": IPThermostatWall2, "HMIP-WTH-2": IPThermostatWall2, "HmIP-WTH-B": IPThermostatWall2, "HMIP-WTH-B": IPThermostatWall2, "HMIP-WTH": IPThermostatWall2, "HmIP-WTH": IPThermostatWall2, "HmIP-BWTH": IPThermostatWall230V, "HmIP-BWTH24": IPThermostatWall230V, "HmIP-HEATING": IPThermostat, "HmIPW-STH": IPWThermostatWall, "HmIPW-STHD": IPWThermostatWall, "HmIPW-WTH": IPWThermostatWall, } danielperna84-pyhomematic-8aaf60d/pyhomematic/exceptions.py000066400000000000000000000003331455774063600242520ustar00rootroot00000000000000class HMException(Exception): """ Base exception for all exceptions pyhomeamtic will raise. """ class HMRpcException(HMException): """ Exception for errors while communicating via XML-RPC. """ danielperna84-pyhomematic-8aaf60d/pyhomematic/vccu.py000066400000000000000000000117701455774063600230400ustar00rootroot00000000000000import os import time import logging import threading from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler import xmlrpc.client import json LOG = logging.getLogger(__name__) LOCAL = "127.0.0.1" LOCALPORT = 2001 DEVICE_DESCRIPTIONS = "devicetypes/json/device_descriptions.json" class LockingServerProxy(xmlrpc.client.ServerProxy): """ ServerProxy implementation with lock when request is executing """ def __init__(self, *args, **kwargs): """ Initialize new proxy for server and get local ip """ self.lock = threading.Lock() xmlrpc.client.ServerProxy.__init__(self, *args, **kwargs) def __request(self, *args, **kwargs): """ Call method on server side """ with self.lock: parent = xmlrpc.client.ServerProxy # pylint: disable=E1101 return parent._ServerProxy__request(self, *args, **kwargs) def __getattr__(self, *args, **kwargs): """ Magic method dispatcher """ return xmlrpc.client._Method(self.__request, *args, **kwargs) # Object holding the methods the XML-RPC server should provide. class RPCFunctions(): def __init__(self): LOG.debug("RPCFunctions.__init__") self.remotes = {} try: script_dir = os.path.dirname(__file__) rel_path = DEVICE_DESCRIPTIONS with open(os.path.join(script_dir, rel_path)) as fptr: self.devices = json.load(fptr) except Exception as err: LOG.debug("RPCFunctions.listDevices: Exception: %s" % err) self.devices = [] def _askDevices(self, interface_id): LOG.debug("RPCFunctions._askDevices: waiting") time.sleep(0.5) knownDevices = self.remotes[interface_id].listDevices(interface_id) LOG.debug("RPCFunctions._askDevices: %s" % knownDevices) t = threading.Thread(name='_pushDevices', target=self._pushDevices, args=(interface_id, )) t.start() def _pushDevices(self, interface_id): LOG.debug("RPCFunctions._pushDevices: waiting") time.sleep(0.5) self.remotes[interface_id].newDevices(interface_id, self.devices) LOG.debug("RPCFunctions._pushDevices: pushed") def listDevices(self, interface_id): LOG.debug("RPCFunctions.listDevices: interface_id = %s" % interface_id) return self.devices def getServiceMessages(self): LOG.debug("RPCFunctions.getServiceMessages") return [['VCU0000001:1', 'ERROR', 7]] def getValue(self, address, value_key): LOG.debug("RPCFunctions.getValue: address=%s, value_key=%s" % (address, value_key)) return True def setValue(self, address, value_key, value): LOG.debug("RPCFunctions.getValue: address=%s, value_key=%s, value=%s" % (address, value_key, value)) return "" def init(self, url, interface_id=None): LOG.debug("RPCFunctions.init: url=%s, interface_id=%s" % (url, interface_id)) if interface_id: try: self.remotes[interface_id] = LockingServerProxy(url) t = threading.Thread(name='_askDevices', target=self._askDevices, args=(interface_id, )) t.start() except Exception as err: LOG.debug("RPCFunctions.init:Exception: %s" % (err)) return "" class RequestHandler(SimpleXMLRPCRequestHandler): """We handle requests to / and /RPC2""" rpc_paths = ('/', '/RPC2',) class ServerThread(threading.Thread): """XML-RPC server thread to handle messages from CCU / Homegear""" def __init__(self, local=LOCAL, localport=LOCALPORT): self._local = local self._localport = localport LOG.debug("ServerThread.__init__") threading.Thread.__init__(self) # Create proxies to interact with CCU / Homegear LOG.debug("__init__: Registering RPC methods") self._rpcfunctions = RPCFunctions() # Setup server to handle requests from CCU / Homegear LOG.debug("ServerThread.__init__: Setting up server") self.server = SimpleXMLRPCServer((self._local, self._localport), requestHandler=RequestHandler, logRequests=False) self._localport = self.server.socket.getsockname()[1] self.server.register_introspection_functions() self.server.register_multicall_functions() LOG.debug("ServerThread.__init__: Registering RPC functions") self.server.register_instance( self._rpcfunctions, allow_dotted_names=True) def run(self): LOG.info("Starting server at http://%s:%i" % (self._local, self._localport)) self.server.serve_forever() def stop(self): """Shut down our XML-RPC server.""" LOG.info("Shutting down server") self.server.shutdown() LOG.debug("ServerThread.stop: Stopping ServerThread") self.server.server_close() LOG.info("Server stopped") danielperna84-pyhomematic-8aaf60d/pylintrc000066400000000000000000000013171455774063600207720ustar00rootroot00000000000000[MASTER] reports=no disable= missing-docstring, global-statement, global-variable-not-assigned, locally-disabled, line-too-long, too-many-instance-attributes, too-many-arguments, too-many-branches, too-many-statements, too-many-return-statements, too-many-nested-blocks, too-many-ancestors, too-many-locals, too-few-public-methods, invalid-name, protected-access, logging-not-lazy, broad-except, dangerous-default-value, locally-disabled, fixme, redefined-variable-type, no-self-use, no-else-return, redefined-outer-name, redefined-argument-from-local, arguments-differ, not-context-manager, inconsistent-return-statements, duplicate-code, too-many-lines, danielperna84-pyhomematic-8aaf60d/setup.cfg000066400000000000000000000000501455774063600210150ustar00rootroot00000000000000[metadata] description-file = README.rstdanielperna84-pyhomematic-8aaf60d/setup.py000066400000000000000000000020631455774063600207140ustar00rootroot00000000000000import os from setuptools import setup, find_packages def readme(): with open('README.rst') as fptr: return fptr.read() PACKAGE_NAME = 'pyhomematic' HERE = os.path.abspath(os.path.dirname(__file__)) VERSION = '0.1.78' PACKAGES = find_packages(exclude=['dist', 'build', 'tests']) REQUIRES = [] setup( name=PACKAGE_NAME, version=VERSION, license='MIT License', url='https://github.com/danielperna84/pyhomematic', download_url='https://github.com/danielperna84/pyhomematic/tarball/'+VERSION, author='Daniel Perna', author_email='danielperna84@gmail.com', description='Homematic interface', packages=PACKAGES, include_package_data=True, zip_safe=False, platforms='any', install_requires=REQUIRES, keywords=['home', 'automation', 'homematic', 'smarthome'], classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python :: 3.5', 'Topic :: Home Automation' ], ) danielperna84-pyhomematic-8aaf60d/tests/000077500000000000000000000000001455774063600203435ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/tests/__init__.py000066400000000000000000000000001455774063600224420ustar00rootroot00000000000000danielperna84-pyhomematic-8aaf60d/tests/test_pyhomematic.py000066400000000000000000000137531455774063600243040ustar00rootroot00000000000000import unittest import os import logging import time import socket import json from pyhomematic import vccu from pyhomematic import HMConnection from pyhomematic import devicetypes from pyhomematic.devicetypes.helper import HelperRssiDevice, HelperRssiPeer logging.basicConfig(level=logging.INFO) LOG = logging.getLogger(__name__) STARTUP_DELAY = 2 DEFAULT_IP = "127.0.0.1" DEFAULT_PORT = 2001 DEFAULT_INTERFACE_CLIENT = "test" DEFAULT_REMOTE = "default" SUPPORTED_DEVICES_JSON = "pyhomematic/devicetypes/json/device_details.json" SCRIPT_DIR = os.path.dirname(__file__) BASE_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir)) with open(os.path.join(BASE_DIR, SUPPORTED_DEVICES_JSON)) as fptr: DEVICES = json.load(fptr) class Test_0_VCCU(unittest.TestCase): def setUp(self): LOG.info("TestVCCU.setUp") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) self.localport = s.getsockname()[1] s.close() self.vccu = vccu.ServerThread(local=DEFAULT_IP, localport=self.localport) self.vccu.start() def tearDown(self): LOG.info("TestVCCU.tearDown") self.vccu.stop() def test_vccu_startup(self): LOG.info("TestVCCU.test_vccu_startup") self.assertTrue(self.vccu.is_alive()) class Test_1_PyhomematicBase(unittest.TestCase): def setUp(self): LOG.debug("TestPyhomematicBase.setUp") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) self.localport = s.getsockname()[1] s.close() self.vccu = vccu.ServerThread(local=DEFAULT_IP, localport=self.localport) self.vccu.start() time.sleep(0.5) def tearDown(self): LOG.debug("TestPyhomematicBase.tearDown") self.vccu.stop() def test_0_pyhomematic_noinit(self): LOG.info("TestPyhomematicBase.test_0_pyhomematic_noinit") client = HMConnection( interface_id=DEFAULT_INTERFACE_CLIENT, autostart=False, remotes={ DEFAULT_REMOTE: { "ip": DEFAULT_IP, "port": self.localport, "connect": False } } ) client.start() time.sleep(STARTUP_DELAY) servicemessages = client.getServiceMessages(DEFAULT_REMOTE) self.assertEqual(len(servicemessages), 1) self.assertEqual(servicemessages[0][0], 'VCU0000001:1') client.stop() def test_1_pyhomematic_init(self): LOG.info("TestPyhomematicBase.test_1_pyhomematic_init") client = HMConnection( interface_id=DEFAULT_INTERFACE_CLIENT, autostart=False, remotes={ DEFAULT_REMOTE: { "ip": DEFAULT_IP, "port": self.localport, "connect": True } } ) client.start() time.sleep(STARTUP_DELAY) servicemessages = client.getServiceMessages(DEFAULT_REMOTE) self.assertEqual(len(servicemessages), 1) self.assertEqual(servicemessages[0][0], 'VCU0000001:1') self.assertIsInstance(client.devices, dict) devices = client.devices.get(DEFAULT_REMOTE) self.assertIsInstance(devices, dict) self.assertGreater(len(devices.keys()), 0) client.stop() class Test_2_PyhomematicDevices(unittest.TestCase): def setUp(self): LOG.debug("TestPyhomematicDevices.setUp") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) self.localport = s.getsockname()[1] s.close() self.vccu = vccu.ServerThread(local=DEFAULT_IP, localport=self.localport) self.vccu.start() time.sleep(0.5) self.client = HMConnection( interface_id=DEFAULT_INTERFACE_CLIENT, autostart=False, remotes={ DEFAULT_REMOTE: { "ip": DEFAULT_IP, "port": self.localport, "connect": True } } ) self.client.start() time.sleep(STARTUP_DELAY) def tearDown(self): LOG.debug("TestPyhomematicDevices.tearDown") self.client.stop() self.vccu.stop() def test_0_pyhomematic_classes(self): LOG.info("TestPyhomematicDevices.test_0_pyhomematic_classes") devices = self.client.devices.get(DEFAULT_REMOTE) for _, deviceobject in devices.items(): deviceclass = devicetypes.SUPPORTED.get(deviceobject.TYPE, None) devicedata = DEVICES.get(deviceobject.TYPE, {}) if deviceclass: self.assertIsInstance(deviceobject, deviceclass) else: if not devicedata.get("supported", True): LOG.info("Unsupported device: %s" % deviceobject.TYPE) else: LOG.warning("Device class missing for: %s" % deviceobject.TYPE) class Test_3_HelperClassHierarchy(unittest.TestCase): """ Some helper classes are mutally exclusive (such as HelperRssiPeer/HelperRssiDevice). Since many device implementations inherit from other implementation classes we need to be extra careful when plugging in such mutally excluse helpers somewhere in the class hierarchy. This test case may be used for checking the currently available device classes for such situations. """ def setUp(self): self.device_classes = set(devicetypes.SUPPORTED.values()) def test_rssi_helper(self): for klass in self.device_classes: both_rssi_helpers_used = issubclass(HelperRssiDevice, klass) and issubclass(HelperRssiPeer, klass) self.assertFalse( both_rssi_helpers_used, "The class %s inherits from both HelperRssiDevice and HelperRssiPeer, which is not supported." % klass ) if __name__ == '__main__': unittest.main() danielperna84-pyhomematic-8aaf60d/tox.ini000066400000000000000000000004371455774063600205200ustar00rootroot00000000000000[tox] envlist = lint, pyhomematic skip_missing_interpreters = True [testenv] [testenv:lint] basepython = python3 ignore_errors = True deps = pylint commands = pylint pyhomematic [testenv:pyhomematic] basepython = python3 ignore_errors = True commands = python3 -m unittest