diff --git a/CODEOWNERS b/CODEOWNERS index d99f11fa727b5..dfc845318220c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -214,6 +214,7 @@ /bundles/org.openhab.binding.tado/ @dfrommi /bundles/org.openhab.binding.tankerkoenig/ @dolic @JueBag /bundles/org.openhab.binding.telegram/ @ZzetT +/bundles/org.openhab.binding.teleinfo/ @Nokyyz /bundles/org.openhab.binding.tellstick/ @jarlebh /bundles/org.openhab.binding.tesla/ @kgoderis /bundles/org.openhab.binding.tibber/ @kjoglum diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index d6fad3c96e7c1..5dce67fda5986 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -1054,6 +1054,11 @@ org.openhab.binding.telegram ${project.version} + + org.openhab.addons.bundles + org.openhab.binding.teleinfo + ${project.version} + org.openhab.addons.bundles org.openhab.binding.tellstick diff --git a/bundles/org.openhab.binding.teleinfo/NOTICE b/bundles/org.openhab.binding.teleinfo/NOTICE new file mode 100644 index 0000000000000..4c20ef446c1e4 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab2-addons diff --git a/bundles/org.openhab.binding.teleinfo/README.md b/bundles/org.openhab.binding.teleinfo/README.md new file mode 100644 index 0000000000000..65387c4049755 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/README.md @@ -0,0 +1,121 @@ +# Teleinfo Binding + +The Teleinfo binding supports an interface to ENEDIS/ERDF [Teleinfo protocol](http://www.linuxembarque.free.fr/electro/compt_energie/specifications_techniques_edf_teleinfo.pdf) for (French) Electricity Meter. This binding works with a Teleinfo modem plugged to the I1 and I2 terminals of your electricity meter. Teleinfo modems can be ordered (see the [list of tested hardware](#tested-hardware) below) or build by yourself (see [this example](http://bernard.lefrancois.free.fr)). + +Teleinfo is a protocol to read many electrical statistics of your electricity meter: instantaneous power consumption, current price period, meter reading... +These values can be used to + +- send your meter reading to your electricity provider with a simple copy/paste, +- improve your rules and minimize electricity costs, +- check if your subscription is relevant for your needs, +- monitor your electricity consumption, + +## Supported Things + +The Teleinfo binding provides support for both single phase and three phase connection, ICC evolution and the following pricing modes: + +- HCHP mode +- Base mode +- Tempo mode +- EJP mode + +| Thing type | Connection | Pricing mode | ICC evolution | +|--------------------------------------------|--------------|--------------|---------------| +| cbemm_base_electricitymeter | single-phase | Base | | +| cbemm_ejp_electricitymeter | single-phase | EJP | | +| cbemm_hc_electricitymeter | single-phase | HCHP | | +| cbemm_tempo_electricitymeter | single-phase | Tempo | | +| cbemm_evolution_icc_base_electricitymeter | single-phase | Base | [x] | +| cbemm_evolution_icc_ejp_electricitymeter | single-phase | EJP | [x] | +| cbemm_evolution_icc_hc_electricitymeter | single-phase | HCHP | [x] | +| cbemm_evolution_icc_tempo_electricitymeter | single-phase | Tempo | [x] | +| cbetm_base_electricitymeter | three-phase | Base | | +| cbetm_ejp_electricitymeter | three-phase | EJP | | +| cbetm_hc_electricitymeter | three-phase | HCHP | | +| cbetm_tempo_electricitymeter | three-phase | Tempo | | + +## Discovery + +Before the binding can be used, a serial controller must be added. This needs to be done manually. Select __Teleinfo Serial Controller__ and enter the serial port. Once the serial controller added, electricity meters will automatically appear when trying to add a new thing, with default label __Teleinfo ADCO #adco__ where __#adco__ is your electricity meter identifier. + +## Thing Configuration + +| Thing type | Parameter | Meaning | Possible values | +|----------------------|--------------|---------------------------------------|------------------| +| `serialcontroller` | `serialport` | Path to the serial controller | /dev/ttyXXXX | +| `*_electricitymeter` | `adco` | Electricity meter identifier | 12 digits number | + +## Channels + +Channel availability depends on the electricity connection (single or three phase) and on the pricing mode (Base, HCHP, EJP or Tempo). + +| Channel | Type | Description | Phase | Mode | +|----------|---------------------------|----------------------------------------------------------|--------|-------| +| isousc | `Number:ElectricCurrent` | Subscribed electric current | All | All | +| ptec | `String` | Current pricing period | All | All | +| imax | `Number:ElectricCurrent` | Maximum consumed electric current | Single | All | +| imax1 | `Number:ElectricCurrent` | Maximum consumed electric current on phase 1 | Three | All | +| imax2 | `Number:ElectricCurrent` | Maximum consumed electric current on phase 2 | Three | All | +| imax3 | `Number:ElectricCurrent` | Maximum consumed electric current on phase 3 | Three | All | +| adps | `Number:ElectricCurrent` | Excess electric current warning | Single | All | +| adir1 | `Number:ElectricCurrent` | Excess electric current on phase 1 warning | Three | All | +| adir2 | `Number:ElectricCurrent` | Excess electric current on phase 2 warning | Three | All | +| adir3 | `Number:ElectricCurrent` | Excess electric current on phase 3 warning | Three | All | +| iinst | `Number:ElectricCurrent` | Instantaneous electric current | Single | All | +| iinst1 | `Number:ElectricCurrent` | Instantaneous electric current on phase 1 | Three | All | +| iinst2 | `Number:ElectricCurrent` | Instantaneous electric current on phase 2 | Three | All | +| iinst3 | `Number:ElectricCurrent` | Instantaneous electric current on phase 3 | Three | All | +| ppot | `String` | Electrical potential presence | Three | All | +| pmax | `Number:Energy` | Maximum consumed electric power on all phases | Three | All | +| papp | `Number` | Instantaneous apparent power (Unit: `VA`) | Three, single (ICC evolution only) | All | +| hhphc | `String` | Pricing schedule group | All | HCHP | +| hchc | `Number:Energy` | Total consumed energy at low rate pricing | All | HCHP | +| hchp | `Number:Energy` | Total consumed energy at high rate pricing | All | HCHP | +| base | `Number:Energy` | Total consumed energy | All | Base | +| ejphn | `Number:Energy` | Total consumed energy at low rate pricing | All | EJP | +| ejphpm | `Number:Energy` | Total consumed energy at high rate pricing | All | EJP | +| bbrhcjb | `Number:Energy` | Total consumed energy at low rate pricing on blue days | All | Tempo | +| bbrhpjb | `Number:Energy` | Total consumed energy at high rate pricing on blue days | All | Tempo | +| bbrhcjw | `Number:Energy` | Total consumed energy at low rate pricing on white days | All | Tempo | +| bbrhpjw | `Number:Energy` | Total consumed energy at high rate pricing on white days | All | Tempo | +| bbrhcjr | `Number:Energy` | Total consumed energy at low rate pricing on red days | All | Tempo | +| bbrhpjr | `Number:Energy` | Total consumed energy at high rate pricing on red days | All | Tempo | +| pejp | `Number:Duration` | Prior notice to EJP start | All | EJP | +| demain | `String` | Following day color | All | Tempo | + +## Full Example + +The following `things` file declare a serial USB controller on `/dev/ttyUSB0` for a Single-phase Electricity meter with HC/HP option - CBEMM Evolution ICC and adco `031528042289` : + +``` +Bridge teleinfo:serialcontroller:teleinfoUSB [ serialport="/dev/ttyUSB0" ]{ + Thing cbemm_evolution_icc_hc_electricitymeter myElectricityMeter [ adco="031528042289"] +} +``` + +`adco` is a 12 digit number writen on the electricity meter (There might be two additional digits on the electricity meter, in this case the two last digits must be omitted to obtain 12 digits). The first 6 digits of `adco` can also be retrieved by pushing 6 times the `selection` button of your electricity meter, and the last 6 digits by pushing the `defilement` button. + +This `items` file links some supported channels to items: + +``` +Number TLInfoEDF_PAPP "PAPP" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:papp"} +Number:ElectricCurrent TLInfoEDF_ISOUSC "ISOUSC" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:isousc"} +String TLInfoEDF_PTEC "PTEC" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:ptec"} +Number:ElectricCurrent TLInfoEDF_IMAX "IMAX" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:imax"} +Number:ElectricCurrent TLInfoEDF_ADPS "ADPS" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:adps"} +Number:ElectricCurrent TLInfoEDF_IINST "IINST" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:iinst"} +Number:Energy TLInfoEDF_HCHC "HCHC" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:hchc"} +Number:Energy TLInfoEDF_HCHP "HCHP" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:hchp"} +String TLInfoEDF_HHPHC "HHPHC" {channel="teleinfo:cbemm_evolution_icc_hc_electricitymeter:teleinfoUSB:myElectricityMeter:hhphc"} +``` + +## Tested hardwares + +The Teleinfo binding has been successfully validated with below hardware configuration: + +| Serial interface | Power Energy Meter model | Mode(s) | +|----------|--------|------------------------------| +| GCE Electronics USB Teleinfo module [(more details)](http://gce-electronics.com/fr/usb/655-module-teleinfo-usb.html) | Actaris A14C5 | - Single-phase HCHP & Base | +| Cartelectronic USB Teleinfo modem [(more details)](https://www.cartelectronic.fr/teleinfo-compteur-enedis/17-teleinfo-1-compteur-usb-rail-din-3760313520028.html) | Sagem S10C4 | Single-phase HCHP | + + diff --git a/bundles/org.openhab.binding.teleinfo/doc/datamodel.mdj b/bundles/org.openhab.binding.teleinfo/doc/datamodel.mdj new file mode 100644 index 0000000000000..7a5c376423248 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/doc/datamodel.mdj @@ -0,0 +1,14122 @@ +{ + "_type": "Project", + "_id": "AAAAAAFF+h6SjaM2Hec=", + "name": "Untitled", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFF+qBWK6M3Z8Y=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "org.openhab.binding.teleinfo" + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtp3ClvmZujPI=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "org.openhab.binding.teleinfo", + "ownedElements": [ + { + "_type": "UMLPackage", + "_id": "AAAAAAFtp3DRDGZySzc=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "cbemm", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtp6oGZGbGOho=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "FrameCbemm", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp6tvPGb7sm8=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "source": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "target": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp7GAXmcW2Jk=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "ISOUSC", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqApZIWptjik=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "IINST", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp64xiGcN6SE=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "IMAX", + "type": "Integer" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp6ozo2bwjAk=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "ADPS", + "type": "Integer" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp7Y8/2eatiY=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "PTEC", + "type": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + } + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp7kxpmehaN4=", + "_parent": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "name": "MOTDETAT", + "type": "String", + "multiplicity": "6" + } + ], + "isAbstract": true + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp7x5m2g+x24=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "FrameCbemmTempoOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp7yl8Ghogg8=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "source": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "target": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqyztVmw0MDQ=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "source": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "target": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp79zlmiDASE=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "FrameCbemmBaseOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp7/M5miubhM=", + "_parent": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "source": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "target": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqB/862ss7ng=", + "_parent": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "source": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "target": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp8D8ImjHu/g=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "FrameCbemmHcOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp8SlLWk4uxA=", + "_parent": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "source": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "target": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqzQICm3S/W4=", + "_parent": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "source": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "target": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp8Nqs2kAoMU=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "FrameCbemmEjpOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp8SyxmlJz48=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "source": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "target": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqzkrzW5/jz4=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "source": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "target": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + } + } + ] + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtp9yD82nBPXM=", + "_parent": { + "$ref": "AAAAAAFtp3DRDGZySzc=" + }, + "name": "evoicc", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtp9wl7WmXmZg=", + "_parent": { + "$ref": "AAAAAAFtp9yD82nBPXM=" + }, + "name": "FrameCbemmEvolutionIcc", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp99auWnRF3g=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "source": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "target": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp99xhGni5qA=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "name": "PAPP", + "type": "int" + } + ], + "isAbstract": true + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtq0Cc0m9JUzE=", + "_parent": { + "$ref": "AAAAAAFtp9yD82nBPXM=" + }, + "name": "FrameCbemmEvolutionIccBaseOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq0GwjW94Dvs=", + "_parent": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "source": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "target": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtq0WZUXCQVmI=", + "_parent": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "source": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "target": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtq0HIFm+JROc=", + "_parent": { + "$ref": "AAAAAAFtp9yD82nBPXM=" + }, + "name": "FrameCbemmEvolutionIccHcOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq0MNK3AJmU0=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "source": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "target": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtq0X9SXDmr4k=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "source": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "target": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtq0IV0W+z8KU=", + "_parent": { + "$ref": "AAAAAAFtp9yD82nBPXM=" + }, + "name": "FrameCbemmEvolutionIccTempoOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq0MgKHAajV0=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "source": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "target": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtq0b3jnFQpvk=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "source": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "target": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtq0KI0W/dBqA=", + "_parent": { + "$ref": "AAAAAAFtp9yD82nBPXM=" + }, + "name": "FrameCbemmEvolutionIccEjpOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq0Mv7HAri14=", + "_parent": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "source": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "target": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtq0dEwnGl0J8=", + "_parent": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "source": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "target": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + } + } + ] + } + ] + } + ] + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtp3K/TWZ3hu8=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "cbetm", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtp+NCw2nqotc=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmLong", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtqA4eXWqZro4=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "source": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "target": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqCKoBGvN9HE=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "ISOUSC", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBDt0WrC2Qs=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "IMAX1", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBEaZmrK9Kg=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "IMAX2", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBFIzWrS/nI=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "IMAX3", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqzzgim81ZX8=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "PTEC", + "type": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + } + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBGx82raZl8=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "PMAX", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBIDemri93Q=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "PAPP", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqCODYGvdh0s=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "MOTDETAT", + "type": "String", + "multiplicity": "6" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp/F7IGoWeqA=", + "_parent": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "name": "PPOT", + "type": "" + } + ], + "isAbstract": true + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp/QlO2odCkA=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmShort", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtp/TBB2pHROU=", + "_parent": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "source": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "target": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqAgM5GpYyfU=", + "_parent": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "name": "ADIR1", + "type": "int", + "multiplicity": "0..1" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqAggUGpfGwY=", + "_parent": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "name": "ADIR2", + "type": "int", + "multiplicity": "0..1" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqAy8l2qF/UU=", + "_parent": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "name": "ADIR3", + "type": "int", + "multiplicity": "0..1" + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtqCBsnGtA03g=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmLongBaseOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtqCDWDmtrbuA=", + "_parent": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "source": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "target": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqCE2/mu83eg=", + "_parent": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "source": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "target": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtqy9s2G0Fuyg=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmLongTempoOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtqy/fp20x8C8=", + "_parent": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "source": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "target": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqy/yMG1CIek=", + "_parent": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "source": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "target": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtqzAvA21UVZ4=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmLongHcOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtqzB7Wm1+3+Q=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "source": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "target": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqzTdxG4nMWw=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "source": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "target": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtqzsTA26hhHc=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetmLongEjpOption", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtqztjIW7M6Is=", + "_parent": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "source": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "target": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + } + }, + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFtqzvwqG8jcDY=", + "_parent": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "source": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "target": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + } + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtzDEIn8ozAoE=", + "_parent": { + "$ref": "AAAAAAFtp3K/TWZ3hu8=" + }, + "name": "FrameCbetm", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtzDPF78qDkU0=", + "_parent": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "source": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "target": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBBJWWqqC6A=", + "_parent": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "name": "IINST1", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBB3XmqyFjQ=", + "_parent": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "name": "IINST2", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqBCafGq6Q9U=", + "_parent": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "name": "IINST3", + "type": "int" + } + ], + "isAbstract": true + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtp3MR3mZ74lY=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "Frame", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp3Uft2azga0=", + "_parent": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "name": "id", + "type": "UUID", + "isUnique": true, + "isID": true + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp3i0AWa8RUk=", + "_parent": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "name": "timestamp", + "type": "LocalDate" + } + ], + "isAbstract": true + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFtqB1bAWrtUJo=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "FrameBaseOption", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtqB4R72sa0FM=", + "_parent": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "name": "BASE", + "type": "int" + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFtqB4qqmsgfRI=", + "_parent": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "name": "Operation1" + } + ] + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFtqh5u/2vlTN0=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "FrameTempoOption", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8Zn9ml9lZc=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHPJR", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8ZBDml2QFc=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHCJR", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8YdImlvrg4=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHPJW", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8YAP2lonbE=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHCJW", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8WQR2lh/Nk=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHPJB", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8VDZGlaj3w=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "BBRHCJB", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp70IkWh5Yo0=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "DEMAIN", + "type": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "multiplicity": "0..1" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtz5oD92a7tUA=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "HHPHC", + "type": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + } + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtz2Vq62XzTKE=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "programmeCircuit1", + "type": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + } + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtz2W+pGYA3Y4=", + "_parent": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "name": "programmeCircuit2", + "type": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + } + } + ] + }, + { + "_type": "UMLClassDiagram", + "_id": "AAAAAAFF+qBtyKM79qY=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "Main", + "defaultDiagram": true, + "ownedViews": [ + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp3MR32Z9keU=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp3MR32Z+hvk=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp3MR4GZ/CCo=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z+hvk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1248, + "top": -112, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp3MR4GaAzRY=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z+hvk=" + }, + "font": "Arial;13;3", + "left": 909, + "top": 39, + "width": 159, + "height": 13, + "text": "Frame" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp3MR4GaBAzM=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z+hvk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1248, + "top": -112, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp3MR4GaCKKI=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z+hvk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1248, + "top": -112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 904, + "top": 32, + "width": 169, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtp3MR4GZ/CCo=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp3MR4GaAzRY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp3MR4GaBAzM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp3MR4GaCKKI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp3MR4GaDHiw=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp3UgCma2gnE=", + "_parent": { + "$ref": "AAAAAAFtp3MR4GaDHiw=" + }, + "model": { + "$ref": "AAAAAAFtp3Uft2azga0=" + }, + "font": "Arial;13;0", + "left": 909, + "top": 62, + "width": 159, + "height": 13, + "text": "+id: UUID {id, unique}", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp3i0Wma/if8=", + "_parent": { + "$ref": "AAAAAAFtp3MR4GaDHiw=" + }, + "model": { + "$ref": "AAAAAAFtp3i0AWa8RUk=" + }, + "font": "Arial;13;0", + "left": 909, + "top": 77, + "width": 159, + "height": 13, + "text": "+timestamp: LocalDate", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 904, + "top": 57, + "width": 169, + "height": 38 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp3MR4maE+HI=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "font": "Arial;13;0", + "left": 904, + "top": 95, + "width": 169, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp3MR4maFAG4=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp3MR4maGLdI=", + "_parent": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "model": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 904, + "top": 32, + "width": 169, + "height": 73, + "nameCompartment": { + "$ref": "AAAAAAFtp3MR32Z+hvk=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp3MR4GaDHiw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp3MR4maE+HI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp3MR4maFAG4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp3MR4maGLdI=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp6oPzmbK3s8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp6oPz2bLO8A=", + "_parent": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp6oPz2bM4ak=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bLO8A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 20, + "top": -588, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp6oPz2bNjpA=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bLO8A=" + }, + "font": "Arial;13;3", + "left": 237, + "top": 183, + "width": 179.35205078125, + "height": 13, + "text": "FrameCbemm" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp6oPz2bO1b8=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bLO8A=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 198, + "width": 179.35205078125, + "height": 13, + "text": "(from cbemm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp6oPz2bPyW4=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bLO8A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 20, + "top": -588, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 232, + "top": 176, + "width": 189.35205078125, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtp6oPz2bM4ak=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp6oPz2bNjpA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp6oPz2bO1b8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp6oPz2bPyW4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp6oPz2bQMRU=", + "_parent": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp7GAsGcZ3MI=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtp7GAXmcW2Jk=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 221, + "width": 179.35205078125, + "height": 13, + "text": "+ISOUSC: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqApZe2pwwWY=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtqApZIWptjik=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 236, + "width": 179.35205078125, + "height": 13, + "text": "+IINST: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp64x1GcQf38=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtp64xiGcN6SE=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 251, + "width": 179.35205078125, + "height": 13, + "text": "+IMAX: Integer", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp6oz9WbzgY8=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtp6ozo2bwjAk=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 266, + "width": 179.35205078125, + "height": 13, + "text": "+ADPS: Integer", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp7Y9Umed4EI=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtp7Y8/2eatiY=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 281, + "width": 179.35205078125, + "height": 13, + "text": "+PTEC: PTEC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp7kx92ekxZM=", + "_parent": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "model": { + "$ref": "AAAAAAFtp7kxpmehaN4=" + }, + "font": "Arial;13;0", + "left": 237, + "top": 296, + "width": 179.35205078125, + "height": 13, + "text": "+MOTDETAT: String[6]", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 232, + "top": 216, + "width": 189.35205078125, + "height": 98 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp6oPz2bRYxs=", + "_parent": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "font": "Arial;13;0", + "left": 232, + "top": 314, + "width": 189.35205078125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp6oP0GbSj58=", + "_parent": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 10, + "top": -294, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp6oP0GbTDwE=", + "_parent": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "model": { + "$ref": "AAAAAAFtp6oGZGbGOho=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 10, + "top": -294, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 232, + "top": 176, + "width": 189.35205078125, + "height": 148, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtp6oPz2bLO8A=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp6oPz2bQMRU=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp6oPz2bRYxs=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp6oP0GbSj58=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp6oP0GbTDwE=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp6tvPWb9KWQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp6tvPGb7sm8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp6tvPWb+Wic=", + "_parent": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "model": { + "$ref": "AAAAAAFtp6tvPGb7sm8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 672, + "top": 191, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp6tvPmb/24w=", + "_parent": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "model": { + "$ref": "AAAAAAFtp6tvPGb7sm8=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 670, + "top": 176, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp6tvPmcAqW4=", + "_parent": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "model": { + "$ref": "AAAAAAFtp6tvPGb7sm8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 675, + "top": 220, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp6tvPWb9KWQ=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "tail": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "lineStyle": 1, + "points": "421:239;927:186", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp6tvPWb+Wic=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp6tvPmb/24w=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp6tvPmcAqW4=" + } + }, + { + "_type": "UMLEnumerationView", + "_id": "AAAAAAFtp7OGKGcfU3w=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp7OGKGcg8gk=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp7OGKWchRUg=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcg8gk=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 965, + "width": 116.34619140625, + "height": 13, + "text": "«enumeration»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7OGKWciur0=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcg8gk=" + }, + "font": "Arial;13;1", + "left": 277, + "top": 980, + "width": 116.34619140625, + "height": 13, + "text": "PTEC" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7OGKWcjR0Y=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcg8gk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": 1920, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7OGKWckbkw=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcg8gk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 544, + "top": 1920, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 272, + "top": 960, + "width": 126.34619140625, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7OGKWchRUg=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp7OGKWciur0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp7OGKWcjR0Y=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7OGKWckbkw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp7OGKWcl3m8=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 272, + "top": 960, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp7OGKWcmOuI=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 272, + "top": 960, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp7OGKmcnVNY=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 272, + "top": 960, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp7OGKmcoxcU=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 272, + "top": 960, + "width": 10, + "height": 10 + }, + { + "_type": "UMLEnumerationLiteralCompartmentView", + "_id": "AAAAAAFtp7OGKmcpuy4=", + "_parent": { + "$ref": "AAAAAAFtp7OGKGcfU3w=" + }, + "model": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "subViews": [ + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7RskmdQywE=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7RsRGdNsz8=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1003, + "width": 116.34619140625, + "height": 13, + "text": "TH..", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7Sk6mdXeU8=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7Skm2dUGDs=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1018, + "width": 116.34619140625, + "height": 13, + "text": "HC..", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7S2q2dezj8=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7S2U2dbePw=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1033, + "width": 116.34619140625, + "height": 13, + "text": "HP..", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7TeJ2dl7hg=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7Tdv2diKmU=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1048, + "width": 116.34619140625, + "height": 13, + "text": "HN..", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7UBTWdsZmc=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7UA8mdpvPs=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1063, + "width": 116.34619140625, + "height": 13, + "text": "PM..", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7Ul+2dztFE=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7Ulk2dwj3A=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1078, + "width": 116.34619140625, + "height": 13, + "text": "HCJB", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7VKwmd6VCo=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7VKaWd3THw=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1093, + "width": 116.34619140625, + "height": 13, + "text": "HCJW", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7VyJ2eB/Pw=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7VxyWd+IAc=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1108, + "width": 116.34619140625, + "height": 13, + "text": "HCJR", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7WToGeIuVI=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7WTQ2eFPQQ=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1123, + "width": 116.34619140625, + "height": 13, + "text": "HPJB", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7XY/2ePcOI=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7XYomeMoz8=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1138, + "width": 116.34619140625, + "height": 13, + "text": "HPJW", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7X68GeWaJk=", + "_parent": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + }, + "model": { + "$ref": "AAAAAAFtp7X6mWeTtl8=" + }, + "font": "Arial;13;0", + "left": 277, + "top": 1153, + "width": 116.34619140625, + "height": 13, + "text": "HPJR", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 272, + "top": 998, + "width": 126.34619140625, + "height": 173 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 272, + "top": 960, + "width": 126.34619140625, + "height": 211, + "nameCompartment": { + "$ref": "AAAAAAFtp7OGKGcg8gk=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtp7OGKWcl3m8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp7OGKWcmOuI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp7OGKmcnVNY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp7OGKmcoxcU=" + }, + "enumerationLiteralCompartment": { + "$ref": "AAAAAAFtp7OGKmcpuy4=" + } + }, + { + "_type": "UMLEnumerationView", + "_id": "AAAAAAFtp7oM4GerRxQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp7oM4Ges20o=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp7oM4GetIlo=", + "_parent": { + "$ref": "AAAAAAFtp7oM4Ges20o=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 965, + "width": 116.34619140625, + "height": 13, + "text": "«enumeration»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7oM4GeuGqE=", + "_parent": { + "$ref": "AAAAAAFtp7oM4Ges20o=" + }, + "font": "Arial;13;1", + "left": 581, + "top": 980, + "width": 116.34619140625, + "height": 13, + "text": "HHPHC" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7oM4GevoSw=", + "_parent": { + "$ref": "AAAAAAFtp7oM4Ges20o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 816, + "top": 736, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7oM4Gew/d0=", + "_parent": { + "$ref": "AAAAAAFtp7oM4Ges20o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 816, + "top": 736, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 576, + "top": 960, + "width": 126.34619140625, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7oM4GetIlo=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp7oM4GeuGqE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp7oM4GevoSw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7oM4Gew/d0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp7oM4Gexjzo=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": 368, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp7oM4Wey/qA=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": 368, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp7oM4Wez0vQ=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": 368, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp7oM4We0Tz4=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 408, + "top": 368, + "width": 10, + "height": 10 + }, + { + "_type": "UMLEnumerationLiteralCompartmentView", + "_id": "AAAAAAFtp7oM4We1CKM=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GerRxQ=" + }, + "model": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "subViews": [ + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7pzk2fapZ4=", + "_parent": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + }, + "model": { + "$ref": "AAAAAAFtp7pzP2fXP3U=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 1003, + "width": 116.34619140625, + "height": 13, + "text": "A", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7qfi2fhKU0=", + "_parent": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + }, + "model": { + "$ref": "AAAAAAFtp7qfK2feMrw=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 1018, + "width": 116.34619140625, + "height": 13, + "text": "C", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7rAO2foj4o=", + "_parent": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + }, + "model": { + "$ref": "AAAAAAFtp7q/6mfl4Gs=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 1033, + "width": 116.34619140625, + "height": 13, + "text": "D", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7rR32fvVKo=", + "_parent": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + }, + "model": { + "$ref": "AAAAAAFtp7rRgGfslyM=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 1048, + "width": 116.34619140625, + "height": 13, + "text": "E", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7rcB2f2kow=", + "_parent": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + }, + "model": { + "$ref": "AAAAAAFtp7rbrGfz5TU=" + }, + "font": "Arial;13;0", + "left": 581, + "top": 1063, + "width": 116.34619140625, + "height": 13, + "text": "Y", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 576, + "top": 998, + "width": 126.34619140625, + "height": 83 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 576, + "top": 960, + "width": 126.34619140625, + "height": 121, + "nameCompartment": { + "$ref": "AAAAAAFtp7oM4Ges20o=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtp7oM4Gexjzo=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp7oM4Wey/qA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp7oM4Wez0vQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp7oM4We0Tz4=" + }, + "enumerationLiteralCompartment": { + "$ref": "AAAAAAFtp7oM4We1CKM=" + } + }, + { + "_type": "UMLEnumerationView", + "_id": "AAAAAAFtp7uFnmf8DpQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp7uFnmf9lwU=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp7uFnmf+KM0=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf9lwU=" + }, + "font": "Arial;13;0", + "left": 429, + "top": 965, + "width": 116.34619140625, + "height": 13, + "text": "«enumeration»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7uFn2f/42k=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf9lwU=" + }, + "font": "Arial;13;1", + "left": 429, + "top": 980, + "width": 116.34619140625, + "height": 13, + "text": "CouleurDemain" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7uFn2gAyCM=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf9lwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 608, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7uFn2gB7oc=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf9lwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 608, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 424, + "top": 960, + "width": 126.34619140625, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7uFnmf+KM0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp7uFn2f/42k=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp7uFn2gAyCM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7uFn2gB7oc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp7uFn2gCKoA=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp7uFn2gDl4o=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp7uFn2gEyxY=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp7uFn2gFcBc=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 56, + "top": 304, + "width": 10, + "height": 10 + }, + { + "_type": "UMLEnumerationLiteralCompartmentView", + "_id": "AAAAAAFtp7uFoGgGOOY=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf8DpQ=" + }, + "model": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "subViews": [ + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7v14GgrM+U=", + "_parent": { + "$ref": "AAAAAAFtp7uFoGgGOOY=" + }, + "model": { + "$ref": "AAAAAAFtp7v1imgovAQ=" + }, + "font": "Arial;13;0", + "left": 429, + "top": 1003, + "width": 116.34619140625, + "height": 13, + "text": "Bleu", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7wNF2gytYE=", + "_parent": { + "$ref": "AAAAAAFtp7uFoGgGOOY=" + }, + "model": { + "$ref": "AAAAAAFtp7wMvmgvV6I=" + }, + "font": "Arial;13;0", + "left": 429, + "top": 1018, + "width": 116.34619140625, + "height": 13, + "text": "Blanc", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtp7wcI2g5tRE=", + "_parent": { + "$ref": "AAAAAAFtp7uFoGgGOOY=" + }, + "model": { + "$ref": "AAAAAAFtp7wbxWg2WOE=" + }, + "font": "Arial;13;0", + "left": 429, + "top": 1033, + "width": 116.34619140625, + "height": 13, + "text": "Rouge", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 424, + "top": 998, + "width": 126.34619140625, + "height": 53 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 424, + "top": 960, + "width": 126.34619140625, + "height": 91, + "nameCompartment": { + "$ref": "AAAAAAFtp7uFnmf9lwU=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtp7uFn2gCKoA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp7uFn2gDl4o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp7uFn2gEyxY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp7uFn2gFcBc=" + }, + "enumerationLiteralCompartment": { + "$ref": "AAAAAAFtp7uFoGgGOOY=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp7x5m2hAoJA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp7x5m2hBJQ0=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp7x5m2hCZko=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hBJQ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "top": 176, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7x5m2hDZqg=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hBJQ0=" + }, + "font": "Arial;13;1", + "left": 141, + "top": 615, + "width": 170.21875, + "height": 13, + "text": "FrameCbemmTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7x5m2hE1g0=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hBJQ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "top": 176, + "width": 202.3505859375, + "height": 13, + "text": "(from cbemm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp7x5m2hFFSc=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hBJQ0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 128, + "top": 176, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 136, + "top": 608, + "width": 180.21875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7x5m2hCZko=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp7x5m2hDZqg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp7x5m2hE1g0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7x5m2hFFSc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp7x5m2hGDJM=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "font": "Arial;13;0", + "left": 136, + "top": 633, + "width": 180.21875, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp7x5nGhH7ww=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "font": "Arial;13;0", + "left": 136, + "top": 643, + "width": 180.21875, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp7x5nGhIVB0=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 64, + "top": 88, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp7x5nGhJyKw=", + "_parent": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "model": { + "$ref": "AAAAAAFtp7x5m2g+x24=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 64, + "top": 88, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 136, + "top": 608, + "width": 180.21875, + "height": 49, + "nameCompartment": { + "$ref": "AAAAAAFtp7x5m2hBJQ0=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp7x5m2hGDJM=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp7x5nGhH7ww=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp7x5nGhIVB0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp7x5nGhJyKw=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp7yl8WhqOXc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7yl8Ghogg8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7yl8WhrqV4=", + "_parent": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "model": { + "$ref": "AAAAAAFtp7yl8Ghogg8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 254, + "top": 455, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7yl8WhsBE8=", + "_parent": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "model": { + "$ref": "AAAAAAFtp7yl8Ghogg8=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 239, + "top": 451, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7yl8WhtXfo=", + "_parent": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "model": { + "$ref": "AAAAAAFtp7yl8Ghogg8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 283, + "top": 462, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp7yl8WhqOXc=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "tail": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "lineStyle": 1, + "points": "232:607;306:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp7yl8WhrqV4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7yl8WhsBE8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7yl8WhtXfo=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp79zmGiF7mo=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp79zmGiG8bU=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp79zmGiH+ig=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiG8bU=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp79zmGiIAJk=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiG8bU=" + }, + "font": "Arial;13;1", + "left": 45, + "top": 439, + "width": 159.64990234375, + "height": 13, + "text": "FrameCbemmBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp79zmGiJ8gY=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiG8bU=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 202.3505859375, + "height": 13, + "text": "(from cbemm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp79zmGiKaJw=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiG8bU=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 40, + "top": 432, + "width": 169.64990234375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtp79zmGiH+ig=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp79zmGiIAJk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp79zmGiJ8gY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp79zmGiKaJw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp79zmGiLLbo=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "font": "Arial;13;0", + "left": 40, + "top": 457, + "width": 169.64990234375, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp79zmGiM1G4=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "font": "Arial;13;0", + "left": 40, + "top": 467, + "width": 169.64990234375, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp79zmGiN5qQ=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp79zmWiOgNE=", + "_parent": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "model": { + "$ref": "AAAAAAFtp79zlmiDASE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 40, + "top": 432, + "width": 169.64990234375, + "height": 49, + "nameCompartment": { + "$ref": "AAAAAAFtp79zmGiG8bU=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp79zmGiLLbo=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp79zmGiM1G4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp79zmGiN5qQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp79zmWiOgNE=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp7/M5miwi6s=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp7/M5miubhM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7/M5mix1CQ=", + "_parent": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "model": { + "$ref": "AAAAAAFtp7/M5miubhM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 189, + "top": 360, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7/M52iy9KY=", + "_parent": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "model": { + "$ref": "AAAAAAFtp7/M5miubhM=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 178, + "top": 349, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp7/M52izZEM=", + "_parent": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "model": { + "$ref": "AAAAAAFtp7/M5miubhM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 210, + "top": 381, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp7/M5miwi6s=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "tail": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "lineStyle": 1, + "points": "148:431;253:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp7/M5mix1CQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp7/M52iy9KY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp7/M52izZEM=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp8Nqs2kClKE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp8Nqs2kD/5M=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp8Nqs2kEjm0=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kD/5M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": 432, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8NqtGkF7po=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kD/5M=" + }, + "font": "Arial;13;1", + "left": 333, + "top": 615, + "width": 148.79541015625, + "height": 13, + "text": "FrameCbemmEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8NqtGkGgIQ=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kD/5M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": 432, + "width": 202.3505859375, + "height": 13, + "text": "(from cbemm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8NqtGkHY+Q=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kD/5M=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -112, + "top": 432, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 328, + "top": 608, + "width": 158.79541015625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtp8Nqs2kEjm0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp8NqtGkF7po=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp8NqtGkGgIQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp8NqtGkHY+Q=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp8NqtGkIJzA=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "font": "Arial;13;0", + "left": 328, + "top": 633, + "width": 158.79541015625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp8NqtGkJ8ro=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "font": "Arial;13;0", + "left": 328, + "top": 643, + "width": 158.79541015625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp8NqtGkKg2k=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": 216, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp8NqtGkL1Mk=", + "_parent": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "model": { + "$ref": "AAAAAAFtp8Nqs2kAoMU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -56, + "top": 216, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 328, + "top": 608, + "width": 158.79541015625, + "height": 49, + "nameCompartment": { + "$ref": "AAAAAAFtp8Nqs2kD/5M=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp8NqtGkIJzA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp8NqtGkJ8ro=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp8NqtGkKg2k=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp8NqtGkL1Mk=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp8SlLmk6qmA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp8SlLWk4uxA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SlLmk74Ts=", + "_parent": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "model": { + "$ref": "AAAAAAFtp8SlLWk4uxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 305, + "top": 362, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SlLmk8uAk=", + "_parent": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "model": { + "$ref": "AAAAAAFtp8SlLWk4uxA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 290, + "top": 361, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SlLmk9sog=", + "_parent": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "model": { + "$ref": "AAAAAAFtp8SlLWk4uxA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 334, + "top": 363, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp8SlLmk6qmA=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "tail": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "lineStyle": 1, + "points": "318:415;322:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp8SlLmk74Ts=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp8SlLmk8uAk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp8SlLmk9sog=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp8SyxmlLU1s=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp8SyxmlJz48=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SyxmlMfPI=", + "_parent": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "model": { + "$ref": "AAAAAAFtp8SyxmlJz48=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 356, + "top": 462, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SyxmlNiYo=", + "_parent": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "model": { + "$ref": "AAAAAAFtp8SyxmlJz48=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 341, + "top": 465, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp8SyxmlOqNc=", + "_parent": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "model": { + "$ref": "AAAAAAFtp8SyxmlJz48=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 385, + "top": 455, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp8SyxmlLU1s=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "tail": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "lineStyle": 1, + "points": "401:607;342:324", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp8SyxmlMfPI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp8SyxmlNiYo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp8SyxmlOqNc=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp9wl7WmZ7F0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp9wl7mmav3Y=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp9wl7mmbQk0=", + "_parent": { + "$ref": "AAAAAAFtp9wl7mmav3Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": 96, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp9wl7mmcwxY=", + "_parent": { + "$ref": "AAAAAAFtp9wl7mmav3Y=" + }, + "font": "Arial;13;3", + "left": 677, + "top": 279, + "width": 168.3017578125, + "height": 13, + "text": "FrameCbemmEvolutionIcc" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp9wl7mmdXME=", + "_parent": { + "$ref": "AAAAAAFtp9wl7mmav3Y=" + }, + "font": "Arial;13;0", + "left": 677, + "top": 294, + "width": 168.3017578125, + "height": 13, + "text": "(from evoicc)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp9wl7mmeym0=", + "_parent": { + "$ref": "AAAAAAFtp9wl7mmav3Y=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": 96, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 672, + "top": 272, + "width": 178.3017578125, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtp9wl7mmbQk0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp9wl7mmcwxY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp9wl7mmdXME=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp9wl7mmeym0=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp9wl7mmffik=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp99x4WnliDs=", + "_parent": { + "$ref": "AAAAAAFtp9wl7mmffik=" + }, + "model": { + "$ref": "AAAAAAFtp99xhGni5qA=" + }, + "font": "Arial;13;0", + "left": 677, + "top": 317, + "width": 168.3017578125, + "height": 13, + "text": "+PAPP: int", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 672, + "top": 312, + "width": 178.3017578125, + "height": 23 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp9wl7mmgfas=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "font": "Arial;13;0", + "left": 672, + "top": 335, + "width": 178.3017578125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp9wl7mmhv3U=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "top": 48, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp9wl72mifHo=", + "_parent": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "model": { + "$ref": "AAAAAAFtp9wl7WmXmZg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 264, + "top": 48, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 672, + "top": 272, + "width": 178.3017578125, + "height": 73, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtp9wl7mmav3Y=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp9wl7mmffik=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp9wl7mmgfas=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp9wl7mmhv3U=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp9wl72mifHo=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp99aumnTtPU=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp99auWnRF3g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp99au2nUvRk=", + "_parent": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "model": { + "$ref": "AAAAAAFtp99auWnRF3g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 543, + "top": 287, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp99au2nV9YU=", + "_parent": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "model": { + "$ref": "AAAAAAFtp99auWnRF3g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 541, + "top": 302, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp99au2nW7OY=", + "_parent": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "model": { + "$ref": "AAAAAAFtp99auWnRF3g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 548, + "top": 258, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp99aumnTtPU=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp6oPzmbK3s8=" + }, + "tail": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "lineStyle": 1, + "points": "671:296;421:262", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp99au2nUvRk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp99au2nV9YU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp99au2nW7OY=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtp/TBB2pJyb0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp/TBB2pHROU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp/TBB2pKexk=", + "_parent": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "model": { + "$ref": "AAAAAAFtp/TBB2pHROU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1459, + "top": 355, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp/TBCGpLhig=", + "_parent": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "model": { + "$ref": "AAAAAAFtp/TBB2pHROU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1449, + "top": 366, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtp/TBCGpMR/o=", + "_parent": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "model": { + "$ref": "AAAAAAFtp/TBB2pHROU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1480, + "top": 334, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtp/TBB2pJyb0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "tail": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "lineStyle": 1, + "points": "1487:367;1454:336", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtp/TBB2pKexk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtp/TBCGpLhig=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp/TBCGpMR/o=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtqA4eXWqbwjI=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqA4eXWqZro4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqA4eXWqcysA=", + "_parent": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "model": { + "$ref": "AAAAAAFtqA4eXWqZro4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1370, + "top": 339, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqA4eXWqdkYk=", + "_parent": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "model": { + "$ref": "AAAAAAFtqA4eXWqZro4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1356, + "top": 333, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqA4eXWqeC1E=", + "_parent": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "model": { + "$ref": "AAAAAAFtqA4eXWqZro4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1397, + "top": 350, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqA4eXWqbwjI=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "tail": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "lineStyle": 1, + "points": "1378:367;1390:336", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqA4eXWqcysA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqA4eXWqdkYk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqA4eXWqeC1E=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqB1bAmrveTk=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqB1bAmrwIbk=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqB1bA2rxVmE=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrwIbk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1280, + "top": -112, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqB1bA2ry0+8=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrwIbk=" + }, + "font": "Arial;13;1", + "left": 69, + "top": 542, + "width": 111.97265625, + "height": 13, + "text": "FrameBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqB1bA2rzf/s=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrwIbk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1280, + "top": -112, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqB1bA2r0raY=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrwIbk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1280, + "top": -112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 64, + "top": 535, + "width": 121.97265625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqB1bA2rxVmE=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqB1bA2ry0+8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqB1bA2rzf/s=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqB1bA2r0raY=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqB1bA2r1rRs=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqB4SSGsdJfA=", + "_parent": { + "$ref": "AAAAAAFtqB1bA2r1rRs=" + }, + "model": { + "$ref": "AAAAAAFtqB4R72sa0FM=" + }, + "font": "Arial;13;0", + "left": 69, + "top": 565, + "width": 111.97265625, + "height": 13, + "text": "+BASE: int", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 64, + "top": 560, + "width": 121.97265625, + "height": 23 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqB1bA2r2R6M=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFtqB4rAGsjPUk=", + "_parent": { + "$ref": "AAAAAAFtqB1bA2r2R6M=" + }, + "model": { + "$ref": "AAAAAAFtqB4qqmsgfRI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -1280, + "top": -112, + "width": 80.57080078125, + "height": 13, + "text": "+Operation1()", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": -640, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqB1bA2r3olQ=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -640, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqB1bA2r4UAc=", + "_parent": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -640, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 64, + "top": 512, + "width": 121.97265625, + "height": 72, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqB1bAmrwIbk=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqB1bA2r1rRs=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqB1bA2r2R6M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqB1bA2r3olQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqB1bA2r4UAc=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqB/862stEs4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqB/862ss7ng=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqB/87GsuhOM=", + "_parent": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "model": { + "$ref": "AAAAAAFtqB/862ss7ng=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 138, + "top": 489, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqB/87GsvOL0=", + "_parent": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "model": { + "$ref": "AAAAAAFtqB/862ss7ng=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 153, + "top": 489, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqB/87GswDFA=", + "_parent": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "model": { + "$ref": "AAAAAAFtqB/862ss7ng=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 109, + "top": 490, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqB/862stEs4=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqB1bAmrveTk=" + }, + "tail": { + "$ref": "AAAAAAFtp79zmGiF7mo=" + }, + "lineStyle": 1, + "points": "124:481;124:512", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqB/87GsuhOM=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqB/87GsvOL0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqB/87GswDFA=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtqCBsnWtCP2g=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqCBsnWtDYns=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqCBsnWtEJgo=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtDYns=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 688, + "top": 64, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCBsnWtF7M8=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtDYns=" + }, + "font": "Arial;13;1", + "left": 1093, + "top": 599, + "width": 184.18359375, + "height": 13, + "text": "FrameCbetmLongBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCBsnWtGWJg=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtDYns=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 688, + "top": 64, + "width": 202.3505859375, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCBsnWtHz9A=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtDYns=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 688, + "top": 64, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1088, + "top": 592, + "width": 194.18359375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqCBsnWtEJgo=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqCBsnWtF7M8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqCBsnWtGWJg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqCBsnWtHz9A=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqCBsnmtIdJ0=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "font": "Arial;13;0", + "left": 1088, + "top": 617, + "width": 194.18359375, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqCBsnmtJzXM=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "font": "Arial;13;0", + "left": 1088, + "top": 627, + "width": 194.18359375, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqCBsnmtKO44=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 344, + "top": 32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqCBsnmtLwug=", + "_parent": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "model": { + "$ref": "AAAAAAFtqCBsnGtA03g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 344, + "top": 32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1088, + "top": 592, + "width": 194.18359375, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtqCBsnWtDYns=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtqCBsnmtIdJ0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqCBsnmtJzXM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqCBsnmtKO44=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqCBsnmtLwug=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtqCDWDmttRmM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqCDWDmtrbuA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCDWDmtuFBU=", + "_parent": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "model": { + "$ref": "AAAAAAFtqCDWDmtrbuA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1228, + "top": 544, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCDWD2tvPMw=", + "_parent": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "model": { + "$ref": "AAAAAAFtqCDWDmtrbuA=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1218, + "top": 533, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCDWD2twL78=", + "_parent": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "model": { + "$ref": "AAAAAAFtqCDWDmtrbuA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1249, + "top": 565, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqCDWDmttRmM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "tail": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "lineStyle": 1, + "points": "1208:591;1271:531", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqCDWDmtuFBU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqCDWD2tvPMw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqCDWD2twL78=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqCD2nWuVlJU=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqCD2nWuWD3A=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqCD2nWuXJWM=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuWD3A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 170, + "top": 137, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCD2nWuYAgM=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuWD3A=" + }, + "font": "Arial;13;1", + "left": 1125, + "top": 694, + "width": 111.97265625, + "height": 13, + "text": "FrameBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCD2nWuZh8E=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuWD3A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 170, + "top": 137, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqCD2nWuaE98=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuWD3A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 170, + "top": 137, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1120, + "top": 687, + "width": 121.97265625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqCD2nWuXJWM=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqCD2nWuYAgM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqCD2nWuZh8E=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqCD2nWuaE98=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqCD2nWubaCk=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqCD2nWucIV4=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWubaCk=" + }, + "model": { + "$ref": "AAAAAAFtqB4R72sa0FM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1125, + "top": 717, + "width": 111.97265625, + "height": 13, + "text": "+BASE: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 1120, + "top": 712, + "width": 121.97265625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqCD2nWudmkY=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFtqCD2nWuexKs=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWudmkY=" + }, + "model": { + "$ref": "AAAAAAFtqB4qqmsgfRI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 170, + "top": 137, + "width": 80.57080078125, + "height": 13, + "text": "+Operation1()", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqCD2nWufMVk=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqCD2nWugLrc=", + "_parent": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 96, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1120, + "top": 664, + "width": 121.97265625, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqCD2nWuWD3A=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqCD2nWubaCk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqCD2nWudmkY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqCD2nWufMVk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqCD2nWugLrc=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqCE2/mu9nfY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqCE2/mu83eg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCE2/mu+dSQ=", + "_parent": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "model": { + "$ref": "AAAAAAFtqCE2/mu83eg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1195, + "top": 644, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCE2/mu/he0=", + "_parent": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "model": { + "$ref": "AAAAAAFtqCE2/mu83eg=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1210, + "top": 644, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqCE2/2vA9ho=", + "_parent": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "model": { + "$ref": "AAAAAAFtqCE2/mu83eg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1166, + "top": 643, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqCE2/mu9nfY=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqCD2nWuVlJU=" + }, + "tail": { + "$ref": "AAAAAAFtqCBsnWtCP2g=" + }, + "lineStyle": 1, + "points": "1183:637;1180.9166666666667:664", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqCE2/mu+dSQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqCE2/mu/he0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqCE2/2vA9ho=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqh5vAGvnG4w=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqh5vAGvoFc0=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqh5vAGvp+a0=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvoFc0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 288, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqh5vAGvqNO4=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvoFc0=" + }, + "font": "Arial;13;1", + "left": 101, + "top": 718, + "width": 237.31982421875, + "height": 13, + "text": "FrameTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqh5vAWvrzq4=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvoFc0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 288, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqh5vAWvs+V4=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvoFc0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -480, + "top": 288, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 96, + "top": 711, + "width": 247.31982421875, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqh5vAGvp+a0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqh5vAGvqNO4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqh5vAWvrzq4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqh5vAWvs+V4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqh5vAWvtEGo=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqysCWmwUaus=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8Zn9ml9lZc=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 741, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHPJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqysR9GwYvnk=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8ZBDml2QFc=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 756, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHCJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqysd02wcXWI=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8YdImlvrg4=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 771, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHPJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqyst+mwg0SQ=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8YAP2lonbE=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 786, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHCJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqytDl2wkEGg=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8WQR2lh/Nk=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 801, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHPJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqytm4mwoivM=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp8VDZGlaj3w=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 816, + "width": 237.31982421875, + "height": 13, + "text": "+BBRHCJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqyt3UWwsh0M=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtp70IkWh5Yo0=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 831, + "width": 237.31982421875, + "height": 13, + "text": "+DEMAIN: CouleurDemain[0..1]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz5oEV2a+GhQ=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtz5oD92a7tUA=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 846, + "width": 237.31982421875, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2VrYmX2mp0=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtz2Vq62XzTKE=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 861, + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit1: ProgrammeCircuit1", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2W/AGYDn5k=", + "_parent": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "model": { + "$ref": "AAAAAAFtz2W+pGYA3Y4=" + }, + "font": "Arial;13;0", + "left": 101, + "top": 876, + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit2: ProgrammeCircuit2", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 96, + "top": 736, + "width": 247.31982421875, + "height": 158 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqh5vAWvuzEQ=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqh5vAWvv4dk=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 144, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqh5vAWvwp4Q=", + "_parent": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -240, + "top": 144, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 96, + "top": 688, + "width": 247.31982421875, + "height": 207, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqh5vAGvoFc0=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqh5vAWvtEGo=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqh5vAWvuzEQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqh5vAWvv4dk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqh5vAWvwp4Q=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqyztVmw1ZXg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqyztVmw0MDQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqyztV2w2Jko=", + "_parent": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "model": { + "$ref": "AAAAAAFtqyztVmw0MDQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 237, + "top": 666, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqyztV2w3SkE=", + "_parent": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "model": { + "$ref": "AAAAAAFtqyztVmw0MDQ=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 252, + "top": 666, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqyztV2w4puY=", + "_parent": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "model": { + "$ref": "AAAAAAFtqyztVmw0MDQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 208, + "top": 665, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqyztVmw1ZXg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqh5vAGvnG4w=" + }, + "tail": { + "$ref": "AAAAAAFtp7x5m2hAoJA=" + }, + "lineStyle": 1, + "points": "224:657;222.66666666666666:688", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqyztV2w2Jko=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqyztV2w3SkE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqyztV2w4puY=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqy4Y4GyhZVE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqy4Y4GyisBA=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqy4Y4GyjtaE=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyisBA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1604, + "top": 427, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy4Y4Gykr34=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyisBA=" + }, + "font": "Arial;13;1", + "left": 1261, + "top": 742, + "width": 184.6025390625, + "height": 13, + "text": "FrameTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy4Y4GylXXg=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyisBA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1604, + "top": 427, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy4Y4GymEsg=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyisBA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1604, + "top": 427, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1256, + "top": 735, + "width": 194.6025390625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqy4Y4GyjtaE=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqy4Y4Gykr34=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqy4Y4GylXXg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqy4Y4GymEsg=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqy4Y4Gyni7g=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4GyoWY4=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8Zn9ml9lZc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 765, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4GypYKs=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8ZBDml2QFc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 780, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4Gyq+Wg=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8YdImlvrg4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 795, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4Gyry9o=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8YAP2lonbE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 810, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4GysKNk=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8WQR2lh/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 825, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4GytUdI=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp8VDZGlaj3w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 840, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqy4Y4Gyuk8Y=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtp70IkWh5Yo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1269, + "top": 855, + "width": 184.6025390625, + "height": 13, + "text": "+DEMAIN: CouleurDemain[0..1]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz5oEWmbBt4g=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtz5oD92a7tUA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 107.2626953125, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2VrZWX5YFY=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtz2Vq62XzTKE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit1: ProgrammeCircuit1", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2W/BGYG+sQ=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "model": { + "$ref": "AAAAAAFtz2W+pGYA3Y4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit2: ProgrammeCircuit2", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 1256, + "top": 760, + "width": 194.6025390625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqy4Y4GyvxDQ=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 920, + "top": 168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqy4Y4Gyw1nY=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 920, + "top": 168, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqy4Y4Gyxp2U=", + "_parent": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 920, + "top": 168, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1256, + "top": 712, + "width": 194.6025390625, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqy4Y4GyisBA=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqy4Y4Gyni7g=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqy4Y4GyvxDQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqy4Y4Gyw1nY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqy4Y4Gyxp2U=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtqy9s2W0H12U=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqy9s2W0I/GU=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqy9s2W0JUD0=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0I/GU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": 112, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy9s2W0K9X4=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0I/GU=" + }, + "font": "Arial;13;1", + "left": 1261, + "top": 655, + "width": 194.75244140625, + "height": 13, + "text": "FrameCbetmLongTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy9s2W0LcGc=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0I/GU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": 112, + "width": 202.3505859375, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqy9s2W0Mxno=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0I/GU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 624, + "top": 112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1256, + "top": 648, + "width": 204.75244140625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqy9s2W0JUD0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqy9s2W0K9X4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqy9s2W0LcGc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqy9s2W0Mxno=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqy9s2W0N3f8=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "font": "Arial;13;0", + "left": 1256, + "top": 673, + "width": 204.75244140625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqy9s2W0OmCk=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "font": "Arial;13;0", + "left": 1256, + "top": 683, + "width": 204.75244140625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqy9s2W0PYtA=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 312, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqy9s2W0Qi5o=", + "_parent": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "model": { + "$ref": "AAAAAAFtqy9s2G0Fuyg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 312, + "top": 56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1256, + "top": 648, + "width": 204.75244140625, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtqy9s2W0I/GU=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtqy9s2W0N3f8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqy9s2W0OmCk=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqy9s2W0PYtA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqy9s2W0Qi5o=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtqy/fp20znxc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqy/fp20x8C8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/fp2000Tg=", + "_parent": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "model": { + "$ref": "AAAAAAFtqy/fp20x8C8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1337, + "top": 599, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/fqG01xlQ=", + "_parent": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "model": { + "$ref": "AAAAAAFtqy/fp20x8C8=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1322, + "top": 600, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/fqG020qc=", + "_parent": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "model": { + "$ref": "AAAAAAFtqy/fp20x8C8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1366, + "top": 596, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqy/fp20znxc=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "tail": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "lineStyle": 1, + "points": "1355:647;1349:561", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqy/fp2000Tg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqy/fqG01xlQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqy/fqG020qc=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqy/yMG1DvOc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqy/yMG1CIek=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/yMG1EWuo=", + "_parent": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "model": { + "$ref": "AAAAAAFtqy/yMG1CIek=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1368, + "top": 696, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/yMG1FMP8=", + "_parent": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "model": { + "$ref": "AAAAAAFtqy/yMG1CIek=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1383, + "top": 696, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqy/yMG1Gxt0=", + "_parent": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "model": { + "$ref": "AAAAAAFtqy/yMG1CIek=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1339, + "top": 695, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqy/yMG1DvOc=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqy4Y4GyhZVE=" + }, + "tail": { + "$ref": "AAAAAAFtqy9s2W0H12U=" + }, + "lineStyle": 1, + "points": "1355:693;1353.8333333333333:712", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqy/yMG1EWuo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqy/yMG1FMP8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqy/yMG1Gxt0=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtqzB7Wm2AlkE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzB7Wm1+3+Q=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzB7Wm2Bp1Q=", + "_parent": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "model": { + "$ref": "AAAAAAFtqzB7Wm1+3+Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1435, + "top": 565, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzB7W22CH7I=", + "_parent": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "model": { + "$ref": "AAAAAAFtqzB7Wm1+3+Q=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1425, + "top": 576, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzB7W22DZ5c=", + "_parent": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "model": { + "$ref": "AAAAAAFtqzB7Wm1+3+Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1456, + "top": 542, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzB7Wm2AlkE=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "tail": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "lineStyle": 1, + "points": "1480:591;1413:530", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqzB7Wm2Bp1Q=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzB7W22CH7I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzB7W22DZ5c=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqzHSE22ZRSA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzHSFG2aq6A=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzHSFG2b2Cc=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2aq6A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -256, + "top": -144, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzHSFG2c1UE=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2aq6A=" + }, + "font": "Arial;13;1", + "left": 269, + "top": 518, + "width": 107.2626953125, + "height": 13, + "text": "FrameHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzHSFG2drbU=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2aq6A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -256, + "top": -144, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzHSFG2eY+k=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2aq6A=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -256, + "top": -144, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 264, + "top": 511, + "width": 117.2626953125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzHSFG2b2Cc=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzHSFG2c1UE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzHSFG2drbU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzHSFG2eY+k=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzHSFG2fWmw=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzOKQW3FMhA=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2fWmw=" + }, + "model": { + "$ref": "AAAAAAFtp8j9/GmLwLk=" + }, + "font": "Arial;13;0", + "left": 269, + "top": 541, + "width": 107.2626953125, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzOYHG3JPbQ=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2fWmw=" + }, + "model": { + "$ref": "AAAAAAFtp8H2a2j51DU=" + }, + "font": "Arial;13;0", + "left": 269, + "top": 556, + "width": 107.2626953125, + "height": 13, + "text": "+HCHP: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzOkzW3N544=", + "_parent": { + "$ref": "AAAAAAFtqzHSFG2fWmw=" + }, + "model": { + "$ref": "AAAAAAFtp8GpK2jy/FI=" + }, + "font": "Arial;13;0", + "left": 269, + "top": 571, + "width": 107.2626953125, + "height": 13, + "text": "+HCHC: int", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 264, + "top": 536, + "width": 117.2626953125, + "height": 53 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzHSFG2gHRY=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -128, + "top": -72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzHSFG2hmcU=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -128, + "top": -72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzHSFG2iliw=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -128, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 264, + "top": 488, + "width": 117.2626953125, + "height": 102, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqzHSFG2aq6A=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqzHSFG2fWmw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzHSFG2gHRY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzHSFG2hmcU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzHSFG2iliw=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqzQICm3TtZo=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzQICm3S/W4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzQICm3UHKU=", + "_parent": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "model": { + "$ref": "AAAAAAFtqzQICm3S/W4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 332, + "top": 468, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzQIC23VRo4=", + "_parent": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "model": { + "$ref": "AAAAAAFtqzQICm3S/W4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 347, + "top": 466, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzQIC23W7xI=", + "_parent": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "model": { + "$ref": "AAAAAAFtqzQICm3S/W4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 303, + "top": 471, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzQICm3TtZo=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqzHSE22ZRSA=" + }, + "tail": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "lineStyle": 1, + "points": "318:465;319.25:488", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqzQICm3UHKU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzQIC23VRo4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzQIC23W7xI=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqzTBIm3+IMg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzTBIm3/f8w=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzTBIm4AEQE=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3/f8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1857, + "top": 325, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzTBIm4B2qI=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3/f8w=" + }, + "font": "Arial;13;1", + "left": 1453, + "top": 686, + "width": 107.2626953125, + "height": 13, + "text": "FrameHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzTBI24Cx04=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3/f8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1857, + "top": 325, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzTBI24D2us=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3/f8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1857, + "top": 325, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1448, + "top": 679, + "width": 117.2626953125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzTBIm4AEQE=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzTBIm4B2qI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzTBI24Cx04=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzTBI24D2us=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzTBI24EiKw=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzTBI24FDAA=", + "_parent": { + "$ref": "AAAAAAFtqzTBI24EiKw=" + }, + "model": { + "$ref": "AAAAAAFtp8j9/GmLwLk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1469, + "top": 709, + "width": 107.2626953125, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzTBI24GYrU=", + "_parent": { + "$ref": "AAAAAAFtqzTBI24EiKw=" + }, + "model": { + "$ref": "AAAAAAFtp8H2a2j51DU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1469, + "top": 724, + "width": 107.2626953125, + "height": 13, + "text": "+HCHP: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzTBI24H94I=", + "_parent": { + "$ref": "AAAAAAFtqzTBI24EiKw=" + }, + "model": { + "$ref": "AAAAAAFtp8GpK2jy/FI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1469, + "top": 739, + "width": 107.2626953125, + "height": 13, + "text": "+HCHC: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 1448, + "top": 704, + "width": 117.2626953125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzTBI24Ir5I=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzTBI24J1hE=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": 96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzTBI24Kq98=", + "_parent": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": 96, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1448, + "top": 656, + "width": 117.2626953125, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqzTBIm3/f8w=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqzTBI24EiKw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzTBI24Ir5I=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzTBI24J1hE=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzTBI24Kq98=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqzTdxG4o0yc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzTdxG4nMWw=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzTdxG4pZOc=", + "_parent": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "model": { + "$ref": "AAAAAAFtqzTdxG4nMWw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1519, + "top": 638, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzTdxG4qC1Y=", + "_parent": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "model": { + "$ref": "AAAAAAFtqzTdxG4nMWw=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1534, + "top": 637, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzTdxG4rvWk=", + "_parent": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "model": { + "$ref": "AAAAAAFtqzTdxG4nMWw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1490, + "top": 641, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzTdxG4o0yc=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqzTBIm3+IMg=" + }, + "tail": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "lineStyle": 1, + "points": "1505:637;1506:656", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqzTdxG4pZOc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzTdxG4qC1Y=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzTdxG4rvWk=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqzY6D25IlJ4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzY6D25J85Q=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzY6D25K1JQ=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25J85Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -64, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzY6D25LB+w=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25J85Q=" + }, + "font": "Arial;13;1", + "left": 349, + "top": 726, + "width": 116.7080078125, + "height": 13, + "text": "FrameEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzY6D25Mb2g=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25J85Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -64, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzY6D25NWZw=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25J85Q=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -64, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 344, + "top": 719, + "width": 126.7080078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzY6D25K1JQ=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzY6D25LB+w=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzY6D25Mb2g=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzY6D25NWZw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzY6D25ODwc=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzjrx250Nt4=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25ODwc=" + }, + "model": { + "$ref": "AAAAAAFtp8cgsGmErVk=" + }, + "font": "Arial;13;0", + "left": 349, + "top": 749, + "width": 116.7080078125, + "height": 13, + "text": "+PEJP: Integer", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzj70W546OY=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25ODwc=" + }, + "model": { + "$ref": "AAAAAAFtp8REiGkx3/0=" + }, + "font": "Arial;13;0", + "left": 349, + "top": 764, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHPM: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzkKG258Fcs=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25ODwc=" + }, + "model": { + "$ref": "AAAAAAFtp8QJJmkqix8=" + }, + "font": "Arial;13;0", + "left": 349, + "top": 779, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHN: int", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 344, + "top": 744, + "width": 126.7080078125, + "height": 53 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzY6D25PFcE=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -72, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzY6EG5QRwA=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -72, + "top": -32, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzY6EG5R5r0=", + "_parent": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -72, + "top": -32, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 344, + "top": 696, + "width": 126.7080078125, + "height": 102, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqzY6D25J85Q=" + }, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqzY6D25ODwc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzY6D25PFcE=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzY6EG5QRwA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzY6EG5R5r0=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqzkrzW6AgUs=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzkrzW5/jz4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzkrzW6BNcY=", + "_parent": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "model": { + "$ref": "AAAAAAFtqzkrzW5/jz4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 420, + "top": 669, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzkrzW6CSLQ=", + "_parent": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "model": { + "$ref": "AAAAAAFtqzkrzW5/jz4=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 435, + "top": 669, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzkrzW6DiIU=", + "_parent": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "model": { + "$ref": "AAAAAAFtqzkrzW5/jz4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 391, + "top": 670, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzkrzW6AgUs=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqzY6D25IlJ4=" + }, + "tail": { + "$ref": "AAAAAAFtp8Nqs2kClKE=" + }, + "lineStyle": 1, + "points": "406:657;406:696", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqzkrzW6BNcY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzkrzW6CSLQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzkrzW6DiIU=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp8D8I2jJ6F4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp8D8I2jKA3o=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp8D8I2jLRoQ=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jKA3o=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8D8I2jM3bI=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jKA3o=" + }, + "font": "Arial;13;1", + "left": 245, + "top": 423, + "width": 145.18994140625, + "height": 13, + "text": "FrameCbemmHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8D8I2jNCF0=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jKA3o=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 202.3505859375, + "height": 13, + "text": "(from cbemm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp8D8I2jOZww=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jKA3o=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 240, + "top": 416, + "width": 155.18994140625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtp8D8I2jLRoQ=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp8D8I2jM3bI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp8D8I2jNCF0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp8D8I2jOZww=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp8D8I2jPL9A=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "font": "Arial;13;0", + "left": 240, + "top": 441, + "width": 155.18994140625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp8D8I2jQ0ag=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "font": "Arial;13;0", + "left": 240, + "top": 451, + "width": 155.18994140625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp8D8I2jRz9E=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp8D8JGjS7Sk=", + "_parent": { + "$ref": "AAAAAAFtp8D8I2jJ6F4=" + }, + "model": { + "$ref": "AAAAAAFtp8D8ImjHu/g=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 240, + "top": 416, + "width": 155.18994140625, + "height": 49, + "nameCompartment": { + "$ref": "AAAAAAFtp8D8I2jKA3o=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp8D8I2jPL9A=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp8D8I2jQ0ag=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp8D8I2jRz9E=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp8D8JGjS7Sk=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtqzsTBG6jaZE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzsTBG6kkiw=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzsTBG6l7p4=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6kkiw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 832, + "top": 16, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzsTBG6mC+o=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6kkiw=" + }, + "font": "Arial;13;1", + "left": 1597, + "top": 655, + "width": 173.3291015625, + "height": 13, + "text": "FrameCbetmLongEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzsTBG6n0PY=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6kkiw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 832, + "top": 16, + "width": 202.3505859375, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzsTBG6oDSg=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6kkiw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 832, + "top": 16, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1592, + "top": 648, + "width": 183.3291015625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzsTBG6l7p4=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzsTBG6mC+o=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzsTBG6n0PY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzsTBG6oDSg=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzsTBG6pTbk=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "font": "Arial;13;0", + "left": 1592, + "top": 673, + "width": 183.3291015625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzsTBG6qAdI=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "font": "Arial;13;0", + "left": 1592, + "top": 683, + "width": 183.3291015625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzsTBW6rHZQ=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzsTBW6sMgk=", + "_parent": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "model": { + "$ref": "AAAAAAFtqzsTA26hhHc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 416, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1592, + "top": 648, + "width": 183.3291015625, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtqzsTBG6kkiw=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtqzsTBG6pTbk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzsTBG6qAdI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzsTBW6rHZQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzsTBW6sMgk=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtqztjIW7O/zs=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqztjIW7M6Is=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqztjIW7P4j0=", + "_parent": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "model": { + "$ref": "AAAAAAFtqztjIW7M6Is=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1521, + "top": 583, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqztjIW7Qo/0=", + "_parent": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "model": { + "$ref": "AAAAAAFtqztjIW7M6Is=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1513, + "top": 596, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqztjIW7RpdU=", + "_parent": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "model": { + "$ref": "AAAAAAFtqztjIW7M6Is=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1536, + "top": 558, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqztjIW7O/zs=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "tail": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "lineStyle": 1, + "points": "1645:647;1413:507", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqztjIW7P4j0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqztjIW7Qo/0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqztjIW7RpdU=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtqzvMwG76lqM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzvMwG77Vk4=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzvMwG78+/s=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG77Vk4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1755, + "top": 136, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzvMwG79uDk=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG77Vk4=" + }, + "font": "Arial;13;1", + "left": 1629, + "top": 758, + "width": 116.7080078125, + "height": 13, + "text": "FrameEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzvMwG7+lm4=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG77Vk4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1755, + "top": 136, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzvMwG7/Ock=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG77Vk4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1755, + "top": 136, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1624, + "top": 751, + "width": 126.7080078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzvMwG78+/s=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzvMwG79uDk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzvMwG7+lm4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzvMwG7/Ock=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzvMwG8AGhE=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzvMwG8BPlY=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG8AGhE=" + }, + "model": { + "$ref": "AAAAAAFtp8cgsGmErVk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1645, + "top": 781, + "width": 116.7080078125, + "height": 13, + "text": "+PEJP: Integer", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzvMwG8CPKs=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG8AGhE=" + }, + "model": { + "$ref": "AAAAAAFtp8REiGkx3/0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1645, + "top": 796, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHPM: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzvMwG8D7rM=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG8AGhE=" + }, + "model": { + "$ref": "AAAAAAFtp8QJJmkqix8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1645, + "top": 811, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHN: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 1624, + "top": 776, + "width": 126.7080078125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzvMwG8EX4M=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzvMwW8FATc=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1208, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzvMwW8G57Y=", + "_parent": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1208, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1624, + "top": 728, + "width": 126.7080078125, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtqzvMwG77Vk4=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtqzvMwG8AGhE=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzvMwG8EX4M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzvMwW8FATc=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzvMwW8G57Y=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtqzvwqG8kjPY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzvwqG8jcDY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzvwqG8lHOc=", + "_parent": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "model": { + "$ref": "AAAAAAFtqzvwqG8jcDY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1698, + "top": 703, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzvwqG8mHlk=", + "_parent": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "model": { + "$ref": "AAAAAAFtqzvwqG8jcDY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1713, + "top": 702, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtqzvwqG8nRc0=", + "_parent": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "model": { + "$ref": "AAAAAAFtqzvwqG8jcDY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1669, + "top": 704, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtqzvwqG8kjPY=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtqzvMwG76lqM=" + }, + "tail": { + "$ref": "AAAAAAFtqzsTBG6jaZE=" + }, + "lineStyle": 1, + "points": "1684:693;1685.0833333333333:728", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtqzvwqG8lHOc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzvwqG8mHlk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzvwqG8nRc0=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq0Gwjm96G4M=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0GwjW94Dvs=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Gwjm97XUI=", + "_parent": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "model": { + "$ref": "AAAAAAFtq0GwjW94Dvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 674, + "top": 358, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Gwjm98OXQ=", + "_parent": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "model": { + "$ref": "AAAAAAFtq0GwjW94Dvs=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 664, + "top": 347, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Gwjm996j8=", + "_parent": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "model": { + "$ref": "AAAAAAFtq0GwjW94Dvs=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 695, + "top": 381, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0Gwjm96G4M=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "tail": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "lineStyle": 1, + "points": "651:407;719:345", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0Gwjm97XUI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0Gwjm98OXQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0Gwjm996j8=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq0MNK3AL75Y=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0MNK3AJmU0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MNK3AMDQg=", + "_parent": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "model": { + "$ref": "AAAAAAFtq0MNK3AJmU0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 832, + "top": 381, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MNK3AN+gY=", + "_parent": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "model": { + "$ref": "AAAAAAFtq0MNK3AJmU0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 822, + "top": 392, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MNK3AOLao=", + "_parent": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "model": { + "$ref": "AAAAAAFtq0MNK3AJmU0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 851, + "top": 358, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0MNK3AL75Y=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "tail": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "lineStyle": 1, + "points": "879:407;805:345", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0MNK3AMDQg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0MNK3AN+gY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0MNK3AOLao=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq0MgKHAcBf8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0MgKHAajV0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MgKHAdLQY=", + "_parent": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "model": { + "$ref": "AAAAAAFtq0MgKHAajV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 699, + "top": 437, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MgKHAe4nQ=", + "_parent": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "model": { + "$ref": "AAAAAAFtq0MgKHAajV0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 685, + "top": 432, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0MgKHAfYAE=", + "_parent": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "model": { + "$ref": "AAAAAAFtq0MgKHAajV0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": 446, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0MgKHAcBf8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "tail": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "lineStyle": 1, + "points": "680:551;748:345", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0MgKHAdLQY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0MgKHAe4nQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0MgKHAfYAE=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq0Mv7XAt5F8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0Mv7HAri14=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Mv7XAu/R0=", + "_parent": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "model": { + "$ref": "AAAAAAFtq0Mv7HAri14=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 824, + "top": 472, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Mv7XAvRjk=", + "_parent": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "model": { + "$ref": "AAAAAAFtq0Mv7HAri14=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 810, + "top": 478, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0Mv7XAw2e0=", + "_parent": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "model": { + "$ref": "AAAAAAFtq0Mv7HAri14=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 851, + "top": 459, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0Mv7XAt5F8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp9wl7WmZ7F0=" + }, + "tail": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "lineStyle": 1, + "points": "898:599;778:345", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0Mv7XAu/R0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0Mv7XAvRjk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0Mv7XAw2e0=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq0Cc029LwW4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0Cc029MkC4=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0Cc029NcfI=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029MkC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -64, + "top": 48, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0Cc029Od7s=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029MkC4=" + }, + "font": "Arial;13;1", + "left": 509, + "top": 415, + "width": 236.93896484375, + "height": 13, + "text": "FrameCbemmEvolutionIccBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0Cc029PXks=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029MkC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -64, + "top": 48, + "width": 202.3505859375, + "height": 13, + "text": "(from evoicc)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0Cc029QGFI=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029MkC4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -64, + "top": 48, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 504, + "top": 408, + "width": 246.93896484375, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0Cc029NcfI=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0Cc029Od7s=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0Cc029PXks=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0Cc029QGFI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0Cc029RkYM=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "font": "Arial;13;0", + "left": 504, + "top": 433, + "width": 246.93896484375, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0Cc1G9SovI=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "font": "Arial;13;0", + "left": 504, + "top": 443, + "width": 246.93896484375, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0Cc1G9TwX4=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": 24, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0Cc1G9Uitk=", + "_parent": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "model": { + "$ref": "AAAAAAFtq0Cc0m9JUzE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": 24, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 504, + "top": 408, + "width": 246.93896484375, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtq0Cc029MkC4=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq0Cc029RkYM=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0Cc1G9SovI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0Cc1G9TwX4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0Cc1G9Uitk=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq0IV0W+1xy0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0IV0W+2k2Q=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0IV0W+3/X4=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+2k2Q=" + }, + "visible": false, + "font": "Arial;13;0", + "top": 32, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0IV0W+4XOA=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+2k2Q=" + }, + "font": "Arial;13;1", + "left": 549, + "top": 559, + "width": 247.5078125, + "height": 13, + "text": "FrameCbemmEvolutionIccTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0IV0W+5qrU=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+2k2Q=" + }, + "visible": false, + "font": "Arial;13;0", + "top": 32, + "width": 202.3505859375, + "height": 13, + "text": "(from evoicc)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0IV0W+6uGw=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+2k2Q=" + }, + "visible": false, + "font": "Arial;13;0", + "top": 32, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 544, + "top": 552, + "width": 257.5078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0IV0W+3/X4=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0IV0W+4XOA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0IV0W+5qrU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0IV0W+6uGw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0IV0W+72BY=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "font": "Arial;13;0", + "left": 544, + "top": 577, + "width": 257.5078125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0IV0W+81K4=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "font": "Arial;13;0", + "left": 544, + "top": 587, + "width": 257.5078125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0IV0W+9pbY=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "visible": false, + "font": "Arial;13;0", + "top": 16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0IV0W++0DQ=", + "_parent": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "model": { + "$ref": "AAAAAAFtq0IV0W+z8KU=" + }, + "visible": false, + "font": "Arial;13;0", + "top": 16, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 544, + "top": 552, + "width": 257.5078125, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtq0IV0W+2k2Q=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq0IV0W+72BY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0IV0W+81K4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0IV0W+9pbY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0IV0W++0DQ=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq0KI0m/fMG8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0KI0m/gtyY=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0KI02/h74w=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/gtyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 160, + "top": 432, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0KI02/im5Y=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/gtyY=" + }, + "font": "Arial;13;1", + "left": 797, + "top": 607, + "width": 226.08447265625, + "height": 13, + "text": "FrameCbemmEvolutionIccEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0KI1G/juAI=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/gtyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 160, + "top": 432, + "width": 202.3505859375, + "height": 13, + "text": "(from evoicc)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0KI1G/k/LQ=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/gtyY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 160, + "top": 432, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 792, + "top": 600, + "width": 236.08447265625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0KI02/h74w=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0KI02/im5Y=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0KI1G/juAI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0KI1G/k/LQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0KI1G/lBfU=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "font": "Arial;13;0", + "left": 792, + "top": 625, + "width": 236.08447265625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0KI1G/ma6k=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "font": "Arial;13;0", + "left": 792, + "top": 635, + "width": 236.08447265625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0KI1G/n4iM=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 80, + "top": 216, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0KI1G/ovgY=", + "_parent": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "model": { + "$ref": "AAAAAAFtq0KI0W/dBqA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 80, + "top": 216, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 792, + "top": 600, + "width": 236.08447265625, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtq0KI0m/gtyY=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq0KI1G/lBfU=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0KI1G/ma6k=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0KI1G/n4iM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0KI1G/ovgY=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq0HIFm+LrpE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0HIF2+My8w=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0HIF2+N6yA=", + "_parent": { + "$ref": "AAAAAAFtq0HIF2+My8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 512, + "top": -144, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0HIF2+OJtg=", + "_parent": { + "$ref": "AAAAAAFtq0HIF2+My8w=" + }, + "font": "Arial;13;1", + "left": 797, + "top": 415, + "width": 222.47900390625, + "height": 13, + "text": "FrameCbemmEvolutionIccHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0HIF2+Pjbo=", + "_parent": { + "$ref": "AAAAAAFtq0HIF2+My8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 512, + "top": -144, + "width": 202.3505859375, + "height": 13, + "text": "(from evoicc)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0HIF2+QBsE=", + "_parent": { + "$ref": "AAAAAAFtq0HIF2+My8w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 512, + "top": -144, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 792, + "top": 408, + "width": 232.47900390625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0HIF2+N6yA=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0HIF2+OJtg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0HIF2+Pjbo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0HIF2+QBsE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0HIF2+RW9E=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "font": "Arial;13;0", + "left": 792, + "top": 433, + "width": 232.47900390625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0HIF2+S5PQ=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "font": "Arial;13;0", + "left": 792, + "top": 443, + "width": 232.47900390625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0HIF2+TTzM=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 256, + "top": -72, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0HIF2+UTcc=", + "_parent": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "model": { + "$ref": "AAAAAAFtq0HIFm+JROc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 256, + "top": -72, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 792, + "top": 408, + "width": 232.47900390625, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtq0HIF2+My8w=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq0HIF2+RW9E=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0HIF2+S5PQ=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0HIF2+TTzM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0HIF2+UTcc=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtq0V7qHBpgZc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0V7qHBqeYY=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0V7qHBrYZU=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBqeYY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -771, + "top": -149, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0V7qHBswLs=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBqeYY=" + }, + "font": "Arial;13;1", + "left": 565, + "top": 502, + "width": 111.97265625, + "height": 13, + "text": "FrameBaseOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0V7qHBtoS8=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBqeYY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -771, + "top": -149, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0V7qHBuo10=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBqeYY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -771, + "top": -149, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 560, + "top": 495, + "width": 121.97265625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0V7qHBrYZU=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0V7qHBswLs=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0V7qHBtoS8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0V7qHBuo10=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0V7qHBvUog=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0V7qHBw+V4=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBvUog=" + }, + "model": { + "$ref": "AAAAAAFtqB4R72sa0FM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 565, + "top": 525, + "width": 111.97265625, + "height": 13, + "text": "+BASE: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 560, + "top": 520, + "width": 121.97265625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0V7qHBxeuI=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFtq0V7qHByRDs=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBxeuI=" + }, + "model": { + "$ref": "AAAAAAFtqB4qqmsgfRI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -771, + "top": -149, + "width": 80.57080078125, + "height": 13, + "text": "+Operation1()", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0V7qHBzwKY=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -96, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0V7qHB07MY=", + "_parent": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "model": { + "$ref": "AAAAAAFtqB1bAWrtUJo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -144, + "top": -96, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 560, + "top": 472, + "width": 121.97265625, + "height": 49, + "stereotypeDisplay": "icon", + "showProperty": false, + "nameCompartment": { + "$ref": "AAAAAAFtq0V7qHBqeYY=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtq0V7qHBvUog=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0V7qHBxeuI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0V7qHBzwKY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0V7qHB07MY=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtq0WZUXCRIJ0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0WZUXCQVmI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0WZUXCSDy0=", + "_parent": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "model": { + "$ref": "AAAAAAFtq0WZUXCQVmI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 636, + "top": 456, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0WZUnCTBik=", + "_parent": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "model": { + "$ref": "AAAAAAFtq0WZUXCQVmI=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 651, + "top": 456, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0WZUnCUH80=", + "_parent": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "model": { + "$ref": "AAAAAAFtq0WZUXCQVmI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 607, + "top": 455, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0WZUXCRIJ0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq0V7qHBpgZc=" + }, + "tail": { + "$ref": "AAAAAAFtq0Cc029LwW4=" + }, + "lineStyle": 1, + "points": "624:453;621.8333333333334:472", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0WZUXCSDy0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0WZUnCTBik=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0WZUnCUH80=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtq0X9SnDnqhg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0X9SXDmr4k=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0X9SnDoK3g=", + "_parent": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "model": { + "$ref": "AAAAAAFtq0X9SXDmr4k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 920, + "top": 455, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0X9SnDpsBc=", + "_parent": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "model": { + "$ref": "AAAAAAFtq0X9SXDmr4k=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 935, + "top": 455, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0X9SnDq4yo=", + "_parent": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "model": { + "$ref": "AAAAAAFtq0X9SXDmr4k=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 891, + "top": 456, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0X9SnDnqhg=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "tail": { + "$ref": "AAAAAAFtq0HIFm+LrpE=" + }, + "lineStyle": 1, + "points": "907:453;906:472", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0X9SnDoK3g=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0X9SnDpsBc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0X9SnDq4yo=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtq0bZjnEf+OE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0bZjnEg0DE=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0bZjnEhqVc=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEg0DE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": 466, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0bZj3Eibsc=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEg0DE=" + }, + "font": "Arial;13;1", + "left": 581, + "top": 662, + "width": 184.6025390625, + "height": 13, + "text": "FrameTempoOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0bZj3EjKEw=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEg0DE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": 466, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0bZj3EkiiI=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEg0DE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 728, + "top": 466, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 576, + "top": 655, + "width": 194.6025390625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0bZjnEhqVc=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0bZj3Eibsc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0bZj3EjKEw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0bZj3EkiiI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0bZj3El8wQ=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3EmZFY=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8Zn9ml9lZc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 685, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3EnMD4=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8ZBDml2QFc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 700, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJR: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3EoY2I=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8YdImlvrg4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 715, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3Ep1mE=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8YAP2lonbE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 730, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJW: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3EqZ/E=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8WQR2lh/Nk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 745, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHPJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3ErfVY=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp8VDZGlaj3w=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 760, + "width": 184.6025390625, + "height": 13, + "text": "+BBRHCJB: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0bZj3Es0Hc=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtp70IkWh5Yo0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 581, + "top": 775, + "width": 184.6025390625, + "height": 13, + "text": "+DEMAIN: CouleurDemain[0..1]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz5oEYmbElhg=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtz5oD92a7tUA=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 107.2626953125, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2Vrb2X8fwI=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtz2Vq62XzTKE=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit1: ProgrammeCircuit1", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtz2W/DWYJhW8=", + "_parent": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "model": { + "$ref": "AAAAAAFtz2W+pGYA3Y4=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 237.31982421875, + "height": 13, + "text": "+programmeCircuit2: ProgrammeCircuit2", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 576, + "top": 680, + "width": 194.6025390625, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0bZj3Et/s4=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 240, + "top": 88, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0bZj3Eu2Lo=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 240, + "top": 88, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0bZj3EvhYQ=", + "_parent": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "model": { + "$ref": "AAAAAAFtqh5u/2vlTN0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 240, + "top": 88, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 576, + "top": 632, + "width": 194.6025390625, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtq0bZjnEg0DE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtq0bZj3El8wQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0bZj3Et/s4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0bZj3Eu2Lo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0bZj3EvhYQ=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtq0b3jnFRL1c=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0b3jnFQpvk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0b3jnFStSw=", + "_parent": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "model": { + "$ref": "AAAAAAFtq0b3jnFQpvk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 686, + "top": 607, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0b3jnFT9bw=", + "_parent": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "model": { + "$ref": "AAAAAAFtq0b3jnFQpvk=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 701, + "top": 607, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0b3jnFU9sc=", + "_parent": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "model": { + "$ref": "AAAAAAFtq0b3jnFQpvk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 657, + "top": 608, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0b3jnFRL1c=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq0bZjnEf+OE=" + }, + "tail": { + "$ref": "AAAAAAFtq0IV0W+1xy0=" + }, + "lineStyle": 1, + "points": "672:597;672:632", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0b3jnFStSw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0b3jnFT9bw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0b3jnFU9sc=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtq0cpZHF8gmw=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0cpZHF9ttE=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0cpZHF+6Ts=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF9ttE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 901, + "top": 209, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0cpZHF/5pc=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF9ttE=" + }, + "font": "Arial;13;1", + "left": 853, + "top": 702, + "width": 116.7080078125, + "height": 13, + "text": "FrameEjpOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0cpZHGAQ1E=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF9ttE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 901, + "top": 209, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0cpZHGBylc=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF9ttE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 901, + "top": 209, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 848, + "top": 695, + "width": 126.7080078125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0cpZHF+6Ts=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0cpZHF/5pc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0cpZHGAQ1E=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0cpZHGBylc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0cpZHGCoQA=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0cpZHGDUJs=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHGCoQA=" + }, + "model": { + "$ref": "AAAAAAFtp8cgsGmErVk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 725, + "width": 116.7080078125, + "height": 13, + "text": "+PEJP: Integer", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0cpZHGEEto=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHGCoQA=" + }, + "model": { + "$ref": "AAAAAAFtp8REiGkx3/0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 740, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHPM: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0cpZHGFHdY=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHGCoQA=" + }, + "model": { + "$ref": "AAAAAAFtp8QJJmkqix8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 755, + "width": 116.7080078125, + "height": 13, + "text": "+EJPHN: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 848, + "top": 720, + "width": 126.7080078125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0cpZHGGLqo=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0cpZHGHcxs=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": -56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0cpZHGIMyg=", + "_parent": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "model": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 432, + "top": -56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 848, + "top": 672, + "width": 126.7080078125, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtq0cpZHF9ttE=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtq0cpZHGCoQA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0cpZHGGLqo=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0cpZHGHcxs=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0cpZHGIMyg=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFtq0dEwnGmIa0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq0dEwnGl0J8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0dEwnGnE4I=", + "_parent": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "model": { + "$ref": "AAAAAAFtq0dEwnGl0J8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 923, + "top": 650, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0dEwnGoKms=", + "_parent": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "model": { + "$ref": "AAAAAAFtq0dEwnGl0J8=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 938, + "top": 649, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq0dEwnGp5gM=", + "_parent": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "model": { + "$ref": "AAAAAAFtq0dEwnGl0J8=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 894, + "top": 653, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq0dEwnGmIa0=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq0cpZHF8gmw=" + }, + "tail": { + "$ref": "AAAAAAFtq0KI0m/fMG8=" + }, + "lineStyle": 1, + "points": "909:645;910:672", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq0dEwnGnE4I=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0dEwnGoKms=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0dEwnGp5gM=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFtq0XeE3C9VVg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq0XeE3C+Yds=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq0XeE3C/ZZQ=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C+Yds=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 905, + "top": 70, + "width": 64.32080078125, + "height": 13, + "text": "«interface»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0XeE3DATY0=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C+Yds=" + }, + "font": "Arial;13;1", + "left": 853, + "top": 502, + "width": 107.2626953125, + "height": 13, + "text": "FrameHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0XeE3DBgek=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C+Yds=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 905, + "top": 70, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq0XeE3DCLO4=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C+Yds=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 905, + "top": 70, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 848, + "top": 495, + "width": 117.2626953125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq0XeE3C/ZZQ=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq0XeE3DATY0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq0XeE3DBgek=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq0XeE3DCLO4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq0XeE3DDa0Y=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0XeE3DEEes=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3DDa0Y=" + }, + "model": { + "$ref": "AAAAAAFtp8j9/GmLwLk=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 525, + "width": 107.2626953125, + "height": 13, + "text": "+HHPHC: HHPHC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0XeE3DFRVI=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3DDa0Y=" + }, + "model": { + "$ref": "AAAAAAFtp8H2a2j51DU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 540, + "width": 107.2626953125, + "height": 13, + "text": "+HCHP: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq0XeE3DGJX0=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3DDa0Y=" + }, + "model": { + "$ref": "AAAAAAFtp8GpK2jy/FI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 853, + "top": 555, + "width": 107.2626953125, + "height": 13, + "text": "+HCHC: int", + "horizontalAlignment": 0 + } + ], + "visible": false, + "font": "Arial;13;0", + "left": 848, + "top": 520, + "width": 117.2626953125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq0XeE3DHZ6U=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 456, + "top": -88, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq0XeE3DIHg8=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 456, + "top": -88, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq0XeE3DJWqI=", + "_parent": { + "$ref": "AAAAAAFtq0XeE3C9VVg=" + }, + "model": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 456, + "top": -88, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 848, + "top": 472, + "width": 117.2626953125, + "height": 49, + "stereotypeDisplay": "icon", + "nameCompartment": { + "$ref": "AAAAAAFtq0XeE3C+Yds=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtq0XeE3DDa0Y=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq0XeE3DHZ6U=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq0XeE3DIHg8=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq0XeE3DJWqI=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp+NCxGnsAN0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp+NCxGnt0d0=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp+NCxGnuoXY=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnt0d0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": 112, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp+NCxGnv8Iw=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnt0d0=" + }, + "font": "Arial;13;3", + "left": 1277, + "top": 375, + "width": 131.35205078125, + "height": 13, + "text": "FrameCbetmLong" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp+NCxWnwL98=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnt0d0=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 390, + "width": 131.35205078125, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp+NCxWnxIXo=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnt0d0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1056, + "top": 112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1272, + "top": 368, + "width": 141.35205078125, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtp+NCxGnuoXY=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp+NCxGnv8Iw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp+NCxWnwL98=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp+NCxWnxIXo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp+NCxWnywuQ=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqCKoYmvQCX0=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqCKoBGvN9HE=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 413, + "width": 131.35205078125, + "height": 13, + "text": "+ISOUSC: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqBDuJWrFfjk=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqBDt0WrC2Qs=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 428, + "width": 131.35205078125, + "height": 13, + "text": "+IMAX1: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqBEavmrN4QE=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqBEaZmrK9Kg=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 443, + "width": 131.35205078125, + "height": 13, + "text": "+IMAX2: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqBFJJGrV5X8=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqBFIzWrS/nI=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 458, + "width": 131.35205078125, + "height": 13, + "text": "+IMAX3: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqzzg5284OGA=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqzzgim81ZX8=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 473, + "width": 131.35205078125, + "height": 13, + "text": "+PTEC: PTEC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqBGySmrdZC8=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqBGx82raZl8=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 488, + "width": 131.35205078125, + "height": 13, + "text": "+PMAX: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqBIDzmrlz8s=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqBIDemri93Q=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 503, + "width": 131.35205078125, + "height": 13, + "text": "+PAPP: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqCODuWvg29M=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtqCODYGvdh0s=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 518, + "width": 131.35205078125, + "height": 13, + "text": "+MOTDETAT: String[6]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtp/F7eGoZPQc=", + "_parent": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "model": { + "$ref": "AAAAAAFtp/F7IGoWeqA=" + }, + "font": "Arial;13;0", + "left": 1277, + "top": 533, + "width": 131.35205078125, + "height": 13, + "text": "+PPOT", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 1272, + "top": 408, + "width": 141.35205078125, + "height": 143 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp+NCxWnzlSI=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "font": "Arial;13;0", + "left": 1272, + "top": 551, + "width": 141.35205078125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp+NCxWn0gNU=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp+NCxWn1gkk=", + "_parent": { + "$ref": "AAAAAAFtp+NCxGnsAN0=" + }, + "model": { + "$ref": "AAAAAAFtp+NCw2nqotc=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 528, + "top": 56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1272, + "top": 368, + "width": 141.35205078125, + "height": 193, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtp+NCxGnt0d0=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp+NCxWnywuQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp+NCxWnzlSI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp+NCxWn0gNU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp+NCxWn1gkk=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq1FQ3nHMwVg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq1FQ33HNx98=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq1FQ33HO3QU=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HNx98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": 224, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1FQ33HPgNo=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HNx98=" + }, + "font": "Arial;13;1", + "left": 1797, + "top": 287, + "width": 63.2353515625, + "height": 13, + "text": "FrameCje" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1FQ33HQyBw=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HNx98=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 302, + "width": 63.2353515625, + "height": 13, + "text": "(from cje)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1FQ33HRGpU=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HNx98=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": 224, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1792, + "top": 280, + "width": 73.2353515625, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1FQ33HO3QU=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq1FQ33HPgNo=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq1FQ33HQyBw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1FQ33HRGpU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq1FQ33HSam0=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1N50nINYwM=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1N5Z3IKpa8=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 325, + "width": 63.2353515625, + "height": 13, + "text": "+JAUNE", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1O7rnIUo7M=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1O7Q3IRd1s=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 340, + "width": 63.2353515625, + "height": 13, + "text": "+ENERG", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1PU2nIbKSQ=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1PUS3IYA8A=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 355, + "width": 63.2353515625, + "height": 13, + "text": "+PERCC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1P3hHIiv1I=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1P2/XIfih4=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 370, + "width": 63.2353515625, + "height": 13, + "text": "+PMAXC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1QSe3IpxsY=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1QSBHIm0NM=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 385, + "width": 63.2353515625, + "height": 13, + "text": "+TDEPA", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1QtJ3IwkPc=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1QsnXItzZA=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 400, + "width": 63.2353515625, + "height": 13, + "text": "+PERCP", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1RUs3I3kqU=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1RUHXI0c2w=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 415, + "width": 63.2353515625, + "height": 13, + "text": "+PMAXP", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1RwTXI+RCg=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1RvpXI7TTM=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 430, + "width": 63.2353515625, + "height": 13, + "text": "+PSOUSC", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1SKlHJFCKY=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1SKPXJCLQU=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 445, + "width": 63.2353515625, + "height": 13, + "text": "+PSOUSP", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1Sm6HJMFBI=", + "_parent": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "model": { + "$ref": "AAAAAAFtq1Smc3JJNpk=" + }, + "font": "Arial;13;0", + "left": 1797, + "top": 460, + "width": 63.2353515625, + "height": 13, + "text": "+FCOU", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 1792, + "top": 320, + "width": 73.2353515625, + "height": 158 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq1FQ33HTe9A=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "font": "Arial;13;0", + "left": 1792, + "top": 478, + "width": 73.2353515625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq1FQ33HUpxw=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 112, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq1FQ33HVoVw=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "model": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": 112, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1792, + "top": 280, + "width": 73.2353515625, + "height": 208, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtq1FQ33HNx98=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq1FQ33HSam0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq1FQ33HTe9A=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq1FQ33HUpxw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq1FQ33HVoVw=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq1HaonH7e/c=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1HaonH5O3g=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1HaonH8y2E=", + "_parent": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "model": { + "$ref": "AAAAAAFtq1HaonH5O3g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1426, + "top": 242, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1Hao3H9kHw=", + "_parent": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "model": { + "$ref": "AAAAAAFtq1HaonH5O3g=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1421, + "top": 256, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1Hao3H+jaw=", + "_parent": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "model": { + "$ref": "AAAAAAFtq1HaonH5O3g=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1437, + "top": 213, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1HaonH7e/c=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "tail": { + "$ref": "AAAAAAFtq1FQ3nHMwVg=" + }, + "lineStyle": 1, + "points": "1791:369;1073:100", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq1HaonH8y2E=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1Hao3H9kHw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1Hao3H+jaw=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq1VYFHJTQuA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq1VYFHJUqmI=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq1VYFHJVcnI=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJUqmI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 96, + "top": 16, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1VYFHJWBzE=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJUqmI=" + }, + "font": "Arial;13;3", + "left": 933, + "top": 159, + "width": 108.01806640625, + "height": 13, + "text": "FrameAdco" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1VYFHJXl0o=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJUqmI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 96, + "top": 16, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1VYFHJY/JU=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJUqmI=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 96, + "top": 16, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 928, + "top": 152, + "width": 118.01806640625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1VYFHJVcnI=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq1VYFHJWBzE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq1VYFHJXl0o=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1VYFHJY/JU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq1VYFHJZHK8=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtq1WWAnJ8BAs=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJZHK8=" + }, + "model": { + "$ref": "AAAAAAFtp3PC5Waq7Gs=" + }, + "font": "Arial;13;0", + "left": 933, + "top": 182, + "width": 108.01806640625, + "height": 13, + "text": "+ADCO: String[12]", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 928, + "top": 177, + "width": 118.01806640625, + "height": 23 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq1VYFXJaP0c=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "font": "Arial;13;0", + "left": 928, + "top": 200, + "width": 118.01806640625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq1VYFXJb5jM=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 48, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq1VYFXJc/Gw=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "model": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 48, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 928, + "top": 152, + "width": 118.01806640625, + "height": 58, + "nameCompartment": { + "$ref": "AAAAAAFtq1VYFHJUqmI=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq1VYFHJZHK8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq1VYFXJaP0c=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq1VYFXJb5jM=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq1VYFXJc/Gw=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq1W6LHKBx0Y=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1W6LHJ/P1U=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1W6LHKCE0E=", + "_parent": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "model": { + "$ref": "AAAAAAFtq1W6LHJ/P1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 972, + "top": 121, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1W6LHKDUbs=", + "_parent": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "model": { + "$ref": "AAAAAAFtq1W6LHJ/P1U=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 957, + "top": 121, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1W6LXKE34Y=", + "_parent": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "model": { + "$ref": "AAAAAAFtq1W6LHJ/P1U=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1001, + "top": 122, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1W6LHKBx0Y=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "tail": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "lineStyle": 1, + "points": "987:151;987:105", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq1W6LHKCE0E=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1W6LHKDUbs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1W6LXKE34Y=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtp/QlPGofspc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtp/QlPGogefE=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtp/QlPGohDe0=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGogefE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1136, + "top": 112, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp/QlPGoiwLc=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGogefE=" + }, + "font": "Arial;13;1", + "left": 1485, + "top": 375, + "width": 113.4072265625, + "height": 13, + "text": "FrameCbetmShort" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp/QlPGojRRs=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGogefE=" + }, + "font": "Arial;13;0", + "left": 1485, + "top": 390, + "width": 113.4072265625, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtp/QlPGok6mE=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGogefE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1136, + "top": 112, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1480, + "top": 368, + "width": 123.4072265625, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtp/QlPGohDe0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtp/QlPGoiwLc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtp/QlPGojRRs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtp/QlPGok6mE=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtp/QlPGolcD0=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqAgNYWpbAkk=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGolcD0=" + }, + "model": { + "$ref": "AAAAAAFtqAgM5GpYyfU=" + }, + "font": "Arial;13;0", + "left": 1485, + "top": 413, + "width": 113.4072265625, + "height": 13, + "text": "+ADIR1: int[0..1]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqAgg3mpi7VQ=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGolcD0=" + }, + "model": { + "$ref": "AAAAAAFtqAggUGpfGwY=" + }, + "font": "Arial;13;0", + "left": 1485, + "top": 428, + "width": 113.4072265625, + "height": 13, + "text": "+ADIR2: int[0..1]", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtqAy88mqIVlI=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGolcD0=" + }, + "model": { + "$ref": "AAAAAAFtqAy8l2qF/UU=" + }, + "font": "Arial;13;0", + "left": 1485, + "top": 443, + "width": 113.4072265625, + "height": 13, + "text": "+ADIR3: int[0..1]", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 1480, + "top": 408, + "width": 123.4072265625, + "height": 53 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtp/QlPGomuAA=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "font": "Arial;13;0", + "left": 1480, + "top": 461, + "width": 123.4072265625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtp/QlPWonc/0=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 568, + "top": 56, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtp/QlPWoozjc=", + "_parent": { + "$ref": "AAAAAAFtp/QlPGofspc=" + }, + "model": { + "$ref": "AAAAAAFtp/QlO2odCkA=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 568, + "top": 56, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1480, + "top": 368, + "width": 123.4072265625, + "height": 103, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtp/QlPGogefE=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtp/QlPGolcD0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtp/QlPGomuAA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtp/QlPWonc/0=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtp/QlPWoozjc=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq1smX3LX0jM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1smX3LVQwU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1smX3LYITw=", + "_parent": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "model": { + "$ref": "AAAAAAFtq1smX3LVQwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1512, + "top": 201, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1smYHLZ/co=", + "_parent": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "model": { + "$ref": "AAAAAAFtq1smX3LVQwU=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1509, + "top": 216, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq1smYHLaeB4=", + "_parent": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "model": { + "$ref": "AAAAAAFtq1smX3LVQwU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1519, + "top": 172, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq1smX3LX0jM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "tail": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "lineStyle": 1, + "points": "1959:299;1073:88", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq1smX3LYITw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1smYHLZ/co=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1smYHLaeB4=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq14WjnLvJ+Y=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq14WjnLwCao=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq14WjnLxOQI=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLwCao=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq14Wj3LyBm4=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLwCao=" + }, + "font": "Arial;13;1", + "left": 2116, + "top": 287, + "width": 72.26171875, + "height": 13, + "text": "FrameIce4q" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq14Wj3LzxNM=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLwCao=" + }, + "font": "Arial;13;0", + "left": 2116, + "top": 302, + "width": 72.26171875, + "height": 13, + "text": "(from ice4q)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq14Wj3L0jWw=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLwCao=" + }, + "visible": false, + "font": "Arial;13;0", + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2111, + "top": 280, + "width": 82.26171875, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtq14WjnLxOQI=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq14Wj3LyBm4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq14Wj3LzxNM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq14Wj3L0jWw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq14Wj3L1SF8=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "font": "Arial;13;0", + "left": 2111, + "top": 320, + "width": 82.26171875, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq14Wj3L2qQY=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "font": "Arial;13;0", + "left": 2111, + "top": 330, + "width": 82.26171875, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq14Wj3L3Xmw=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq14Wj3L4Av8=", + "_parent": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "model": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "visible": false, + "font": "Arial;13;0", + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2111, + "top": 280, + "width": 82.26171875, + "height": 60, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtq14WjnLwCao=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq14Wj3L1SF8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq14Wj3L2qQY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq14Wj3L3Xmw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq14Wj3L4Av8=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq15hIHMY1gM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq15hIHMWsnY=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq15hIHMZpHk=", + "_parent": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "model": { + "$ref": "AAAAAAFtq15hIHMWsnY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1587, + "top": 201, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq15hIXMaapY=", + "_parent": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "model": { + "$ref": "AAAAAAFtq15hIHMWsnY=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1584, + "top": 216, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq15hIXMbjm4=", + "_parent": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "model": { + "$ref": "AAAAAAFtq15hIHMWsnY=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1594, + "top": 172, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq15hIHMY1gM=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "tail": { + "$ref": "AAAAAAFtq14WjnLvJ+Y=" + }, + "lineStyle": 1, + "points": "2110:301;1073:86", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq15hIHMZpHk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq15hIXMaapY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq15hIXMbjm4=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq1l/HnKnp0k=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq1l/HnKoiJg=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq1l/HnKpenM=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKoiJg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -80, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1l/H3KqdyY=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKoiJg=" + }, + "font": "Arial;13;1", + "left": 1965, + "top": 287, + "width": 72.26171875, + "height": 13, + "text": "FrameIce2q" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1l/H3Krc/8=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKoiJg=" + }, + "font": "Arial;13;0", + "left": 1965, + "top": 302, + "width": 72.26171875, + "height": 13, + "text": "(from ice2q)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq1l/H3KsUac=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKoiJg=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -80, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1960, + "top": 280, + "width": 82.26171875, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtq1l/HnKpenM=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq1l/H3KqdyY=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq1l/H3Krc/8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq1l/H3KsUac=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq1l/H3KtCzk=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "font": "Arial;13;0", + "left": 1960, + "top": 320, + "width": 82.26171875, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq1l/IXKuo+k=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "font": "Arial;13;0", + "left": 1960, + "top": 330, + "width": 82.26171875, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq1l/IXKvW1g=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq1l/IXKwp+U=", + "_parent": { + "$ref": "AAAAAAFtq1l/HnKnp0k=" + }, + "model": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1960, + "top": 280, + "width": 82.26171875, + "height": 60, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtq1l/HnKoiJg=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq1l/H3KtCzk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq1l/IXKuo+k=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq1l/IXKvW1g=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq1l/IXKwp+U=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtq2FFxXM3mjQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtq2FFxXM4pko=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtq2FFxXM5lc0=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM4pko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -72, + "top": -74, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq2FFxXM60x8=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM4pko=" + }, + "font": "Arial;13;1", + "left": 2261, + "top": 287, + "width": 90.32080078125, + "height": 13, + "text": "FramePmePmi" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq2FFxXM7X2I=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM4pko=" + }, + "font": "Arial;13;0", + "left": 2261, + "top": 302, + "width": 90.32080078125, + "height": 13, + "text": "(from pmepmi)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtq2FFxXM87B4=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM4pko=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -72, + "top": -74, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 2256, + "top": 280, + "width": 100.32080078125, + "height": 40, + "stereotypeLabel": { + "$ref": "AAAAAAFtq2FFxXM5lc0=" + }, + "nameLabel": { + "$ref": "AAAAAAFtq2FFxXM60x8=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtq2FFxXM7X2I=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq2FFxXM87B4=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtq2FFxnM9+MA=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "font": "Arial;13;0", + "left": 2256, + "top": 320, + "width": 100.32080078125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtq2FFxnM+K1o=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "font": "Arial;13;0", + "left": 2256, + "top": 330, + "width": 100.32080078125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtq2FFx3M/mD4=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -36, + "top": -37, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtq2FFx3NAF1M=", + "_parent": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "model": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -36, + "top": -37, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 2256, + "top": 280, + "width": 100.32080078125, + "height": 60, + "showNamespace": true, + "nameCompartment": { + "$ref": "AAAAAAFtq2FFxXM4pko=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtq2FFxnM9+MA=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtq2FFxnM+K1o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtq2FFx3M/mD4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtq2FFx3NAF1M=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtq2GFZXNgtbU=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtq2GFZHNeUH0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq2GFZXNh95Y=", + "_parent": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "model": { + "$ref": "AAAAAAFtq2GFZHNeUH0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1661, + "top": 200, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq2GFZXNiYDA=", + "_parent": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "model": { + "$ref": "AAAAAAFtq2GFZHNeUH0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1658, + "top": 215, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtq2GFZXNjKJk=", + "_parent": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "model": { + "$ref": "AAAAAAFtq2GFZHNeUH0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1666, + "top": 171, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtq2GFZXNgtbU=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtp3MR32Z9keU=" + }, + "tail": { + "$ref": "AAAAAAFtq2FFxXM3mjQ=" + }, + "lineStyle": 1, + "points": "2255:300;1073:84", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtq2GFZXNh95Y=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtq2GFZXNiYDA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtq2GFZXNjKJk=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtzDEIoso1kac=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtzDEIoso2330=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtzDEIoso3hlM=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso2330=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": -256, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtzDEIoso4TU4=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso2330=" + }, + "font": "Arial;13;3", + "left": 1365, + "top": 255, + "width": 86.6962890625, + "height": 13, + "text": "FrameCbetm" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtzDEIoso5RVE=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso2330=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": -256, + "width": 202.3505859375, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtzDEIoso6iXM=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso2330=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 224, + "top": -256, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1360, + "top": 248, + "width": 96.6962890625, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtzDEIoso3hlM=" + }, + "nameLabel": { + "$ref": "AAAAAAFtzDEIoso4TU4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtzDEIoso5RVE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtzDEIoso6iXM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtzDEIo8o7GkY=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtzDJg3spgw6I=", + "_parent": { + "$ref": "AAAAAAFtzDEIo8o7GkY=" + }, + "model": { + "$ref": "AAAAAAFtqBBJWWqqC6A=" + }, + "font": "Arial;13;0", + "left": 1365, + "top": 278, + "width": 86.6962890625, + "height": 13, + "text": "+IINST1: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtzDKBgcpkDw4=", + "_parent": { + "$ref": "AAAAAAFtzDEIo8o7GkY=" + }, + "model": { + "$ref": "AAAAAAFtqBB3XmqyFjQ=" + }, + "font": "Arial;13;0", + "left": 1365, + "top": 293, + "width": 86.6962890625, + "height": 13, + "text": "+IINST2: int", + "horizontalAlignment": 0 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFtzDKd48po83w=", + "_parent": { + "$ref": "AAAAAAFtzDEIo8o7GkY=" + }, + "model": { + "$ref": "AAAAAAFtqBCafGq6Q9U=" + }, + "font": "Arial;13;0", + "left": 1365, + "top": 308, + "width": 86.6962890625, + "height": 13, + "text": "+IINST3: int", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 1360, + "top": 273, + "width": 96.6962890625, + "height": 53 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtzDEIo8o8itY=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "font": "Arial;13;0", + "left": 1360, + "top": 326, + "width": 96.6962890625, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtzDEIo8o9hNI=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -128, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtzDEIo8o+Fr8=", + "_parent": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "model": { + "$ref": "AAAAAAFtzDEIn8ozAoE=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 112, + "top": -128, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 1360, + "top": 248, + "width": 96.6962890625, + "height": 88, + "nameCompartment": { + "$ref": "AAAAAAFtzDEIoso2330=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtzDEIo8o7GkY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtzDEIo8o8itY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtzDEIo8o9hNI=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtzDEIo8o+Fr8=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFtzDPF78qFxu8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtzDPF78qDkU0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtzDPF8MqG2SA=", + "_parent": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "model": { + "$ref": "AAAAAAFtzDPF78qDkU0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1198, + "top": 245, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtzDPF8MqHd9c=", + "_parent": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "model": { + "$ref": "AAAAAAFtzDPF78qDkU0=" + }, + "visible": null, + "font": "Arial;13;0", + "left": 1194, + "top": 260, + "height": 13, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "edgePosition": 1 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFtzDPF8MqI6MY=", + "_parent": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "model": { + "$ref": "AAAAAAFtzDPF78qDkU0=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 1205, + "top": 216, + "height": 13, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFtzDPF78qFxu8=" + }, + "edgePosition": 1 + } + ], + "font": "Arial;13;0", + "head": { + "$ref": "AAAAAAFtq1VYFHJTQuA=" + }, + "tail": { + "$ref": "AAAAAAFtzDEIoso1kac=" + }, + "lineStyle": 1, + "points": "1359:278;1046:196", + "showVisibility": true, + "nameLabel": { + "$ref": "AAAAAAFtzDPF8MqG2SA=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFtzDPF8MqHd9c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtzDPF8MqI6MY=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFtqzAvA21WNzQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtqzAvA21Xa14=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtqzAvA21YVQk=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21Xa14=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 912, + "top": 16, + "height": 13 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzAvA21ZOpg=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21Xa14=" + }, + "font": "Arial;13;1", + "left": 1421, + "top": 599, + "width": 169.7236328125, + "height": 13, + "text": "FrameCbetmLongHcOption" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzAvBG1adkU=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21Xa14=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 912, + "top": 16, + "width": 202.3505859375, + "height": 13, + "text": "(from cbetm)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtqzAvBG1bxHM=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21Xa14=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 912, + "top": 16, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 1416, + "top": 592, + "width": 179.7236328125, + "height": 25, + "stereotypeLabel": { + "$ref": "AAAAAAFtqzAvA21YVQk=" + }, + "nameLabel": { + "$ref": "AAAAAAFtqzAvA21ZOpg=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtqzAvBG1adkU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtqzAvBG1bxHM=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtqzAvBG1c/lw=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "font": "Arial;13;0", + "left": 1416, + "top": 617, + "width": 179.7236328125, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtqzAvBG1d7zI=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "font": "Arial;13;0", + "left": 1416, + "top": 627, + "width": 179.7236328125, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtqzAvBG1e9h4=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 456, + "top": 8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtqzAvBG1fEsA=", + "_parent": { + "$ref": "AAAAAAFtqzAvA21WNzQ=" + }, + "model": { + "$ref": "AAAAAAFtqzAvA21UVZ4=" + }, + "visible": false, + "font": "Arial;13;0", + "left": 456, + "top": 8, + "width": 10, + "height": 10 + } + ], + "font": "Arial;13;0", + "showShadow": false, + "containerChangeable": true, + "left": 1416, + "top": 592, + "width": 179.7236328125, + "height": 45, + "nameCompartment": { + "$ref": "AAAAAAFtqzAvA21Xa14=" + }, + "attributeCompartment": { + "$ref": "AAAAAAFtqzAvBG1c/lw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtqzAvBG1d7zI=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtqzAvBG1e9h4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtqzAvBG1fEsA=" + } + }, + { + "_type": "UMLEnumerationView", + "_id": "AAAAAAFtz2ZRuGYP/SY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtz2ZRuGYQpPo=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtz2ZRuWYRPso=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYQpPo=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 965, + "width": 120.64990234375, + "height": 13, + "text": "«enumeration»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2ZRuWYSs5o=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYQpPo=" + }, + "font": "Arial;13;1", + "left": 77, + "top": 980, + "width": 120.64990234375, + "height": 13, + "text": "ProgrammeCircuit1" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2ZRuWYTZUs=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYQpPo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": -32, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2ZRuWYUWyg=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYQpPo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -32, + "top": -32, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 72, + "top": 960, + "width": 130.64990234375, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFtz2ZRuWYRPso=" + }, + "nameLabel": { + "$ref": "AAAAAAFtz2ZRuWYSs5o=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtz2ZRuWYTZUs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtz2ZRuWYUWyg=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtz2ZRuWYVYVo=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": -16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtz2ZRuWYWG0U=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": -16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtz2ZRuWYX2ok=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": -16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtz2ZRuWYYAik=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -16, + "top": -16, + "width": 10, + "height": 10 + }, + { + "_type": "UMLEnumerationLiteralCompartmentView", + "_id": "AAAAAAFtz2ZRumYZZv4=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYP/SY=" + }, + "model": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "subViews": [ + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2arvWY+Mrs=", + "_parent": { + "$ref": "AAAAAAFtz2ZRumYZZv4=" + }, + "model": { + "$ref": "AAAAAAFtz2arTmY7Q/w=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1003, + "width": 120.64990234375, + "height": 13, + "text": "A", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2a8gWZFxts=", + "_parent": { + "$ref": "AAAAAAFtz2ZRumYZZv4=" + }, + "model": { + "$ref": "AAAAAAFtz2a7+WZC4RQ=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1018, + "width": 120.64990234375, + "height": 13, + "text": "B", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2bIymZM57Q=", + "_parent": { + "$ref": "AAAAAAFtz2ZRumYZZv4=" + }, + "model": { + "$ref": "AAAAAAFtz2bIXGZJi4o=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1033, + "width": 120.64990234375, + "height": 13, + "text": "C", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 72, + "top": 998, + "width": 130.64990234375, + "height": 53 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 72, + "top": 960, + "width": 130.64990234375, + "height": 91, + "nameCompartment": { + "$ref": "AAAAAAFtz2ZRuGYQpPo=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtz2ZRuWYVYVo=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtz2ZRuWYWG0U=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtz2ZRuWYX2ok=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtz2ZRuWYYAik=" + }, + "enumerationLiteralCompartment": { + "$ref": "AAAAAAFtz2ZRumYZZv4=" + } + }, + { + "_type": "UMLEnumerationView", + "_id": "AAAAAAFtz2cifGZU8Vc=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFtz2cifGZVwGo=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFtz2cifGZWMYU=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZVwGo=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1077, + "width": 120.64990234375, + "height": 13, + "text": "«enumeration»" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2cifGZXPaA=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZVwGo=" + }, + "font": "Arial;13;1", + "left": 77, + "top": 1092, + "width": 120.64990234375, + "height": 13, + "text": "ProgrammeCircuit2" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2cifGZYXaQ=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZVwGo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -80, + "top": -16, + "width": 202.3505859375, + "height": 13, + "text": "(from org.openhab.binding.teleinfo)" + }, + { + "_type": "LabelView", + "_id": "AAAAAAFtz2cifGZZWLI=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZVwGo=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -80, + "top": -16, + "height": 13, + "horizontalAlignment": 1 + } + ], + "font": "Arial;13;0", + "left": 72, + "top": 1072, + "width": 130.64990234375, + "height": 38, + "stereotypeLabel": { + "$ref": "AAAAAAFtz2cifGZWMYU=" + }, + "nameLabel": { + "$ref": "AAAAAAFtz2cifGZXPaA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFtz2cifGZYXaQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFtz2cifGZZWLI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFtz2cifGZaWpI=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFtz2cifGZbkhg=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFtz2cifWZcWHg=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFtz2cifWZdXmI=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "visible": false, + "font": "Arial;13;0", + "left": -40, + "top": -8, + "width": 10, + "height": 10 + }, + { + "_type": "UMLEnumerationLiteralCompartmentView", + "_id": "AAAAAAFtz2cifWZevrA=", + "_parent": { + "$ref": "AAAAAAFtz2cifGZU8Vc=" + }, + "model": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "subViews": [ + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2dwO2aEdHc=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2dvyWaBn9o=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1115, + "width": 120.64990234375, + "height": 13, + "text": "P0", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2eH8WaLyc8=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2eHhGaIg0M=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1130, + "width": 120.64990234375, + "height": 13, + "text": "P1", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2eTQmaS3eA=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2eS1WaPwAQ=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1145, + "width": 120.64990234375, + "height": 13, + "text": "P2", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2ecxGaZOME=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2ecTWaW+3k=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1160, + "width": 120.64990234375, + "height": 13, + "text": "P3", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2eoh2agB5Q=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2eoFmad/7s=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1175, + "width": 120.64990234375, + "height": 13, + "text": "P4", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2e4iman5dE=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2e4FWakjbc=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1190, + "width": 120.64990234375, + "height": 13, + "text": "P5", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2fF2mauxCM=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2fFbWarFKo=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1205, + "width": 120.64990234375, + "height": 13, + "text": "P6", + "horizontalAlignment": 0 + }, + { + "_type": "UMLEnumerationLiteralView", + "_id": "AAAAAAFtz2fUv2a1gBI=", + "_parent": { + "$ref": "AAAAAAFtz2cifWZevrA=" + }, + "model": { + "$ref": "AAAAAAFtz2fUTmayOro=" + }, + "font": "Arial;13;0", + "left": 77, + "top": 1220, + "width": 120.64990234375, + "height": 13, + "text": "P7", + "horizontalAlignment": 0 + } + ], + "font": "Arial;13;0", + "left": 72, + "top": 1110, + "width": 130.64990234375, + "height": 128 + } + ], + "font": "Arial;13;0", + "containerChangeable": true, + "left": 72, + "top": 1072, + "width": 130.64990234375, + "height": 166, + "nameCompartment": { + "$ref": "AAAAAAFtz2cifGZVwGo=" + }, + "suppressAttributes": true, + "suppressOperations": true, + "attributeCompartment": { + "$ref": "AAAAAAFtz2cifGZaWpI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFtz2cifGZbkhg=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFtz2cifWZcWHg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFtz2cifWZdXmI=" + }, + "enumerationLiteralCompartment": { + "$ref": "AAAAAAFtz2cifWZevrA=" + } + } + ] + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFtqzHSE22XIHQ=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "FrameHcOption", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8j9/GmLwLk=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "name": "HHPHC", + "type": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + } + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8H2a2j51DU=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "name": "HCHP", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8GpK2jy/FI=", + "_parent": { + "$ref": "AAAAAAFtqzHSE22XIHQ=" + }, + "name": "HCHC", + "type": "int" + } + ] + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFtqzY6Dm5G9Sc=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "FrameEjpOption", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8cgsGmErVk=", + "_parent": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "name": "PEJP", + "type": "Integer" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8REiGkx3/0=", + "_parent": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "name": "EJPHPM", + "type": "int" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp8QJJmkqix8=", + "_parent": { + "$ref": "AAAAAAFtqzY6Dm5G9Sc=" + }, + "name": "EJPHN", + "type": "int" + } + ] + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFtp7uFnmf6GHc=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "CouleurDemain", + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7v1imgovAQ=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "name": "Bleu" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7wMvmgvV6I=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "name": "Blanc" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7wbxWg2WOE=", + "_parent": { + "$ref": "AAAAAAFtp7uFnmf6GHc=" + }, + "name": "Rouge" + } + ] + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFtp7oM4GepYgc=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "HHPHC", + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7pzP2fXP3U=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "name": "A" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7qfK2feMrw=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "name": "C" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7q/6mfl4Gs=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "name": "D" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7rRgGfslyM=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "name": "E" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7rbrGfz5TU=", + "_parent": { + "$ref": "AAAAAAFtp7oM4GepYgc=" + }, + "name": "Y" + } + ] + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFtp7OGJ2cdMPU=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "PTEC", + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7RsRGdNsz8=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "TH.." + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7Skm2dUGDs=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HC.." + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7S2U2dbePw=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HP.." + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7Tdv2diKmU=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HN.." + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7UA8mdpvPs=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "PM.." + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7Ulk2dwj3A=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HCJB" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7VKaWd3THw=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HCJW" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7VxyWd+IAc=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HCJR" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7WTQ2eFPQQ=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HPJB" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7XYomeMoz8=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HPJW" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtp7X6mWeTtl8=", + "_parent": { + "$ref": "AAAAAAFtp7OGJ2cdMPU=" + }, + "name": "HPJR" + } + ] + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtq1GNSnH09L4=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "cje", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtq1FQ3HHKoZA=", + "_parent": { + "$ref": "AAAAAAFtq1GNSnH09L4=" + }, + "name": "FrameCje", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq1HaonH5O3g=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "source": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "target": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1N5Z3IKpa8=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "JAUNE", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1O7Q3IRd1s=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "ENERG", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1PUS3IYA8A=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PERCC", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1P2/XIfih4=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PMAXC", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1QSBHIm0NM=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "TDEPA", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1QsnXItzZA=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PERCP", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1RUHXI0c2w=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PMAXP", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1RvpXI7TTM=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PSOUSC", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1SKPXJCLQU=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "PSOUSP", + "type": "" + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtq1Smc3JJNpk=", + "_parent": { + "$ref": "AAAAAAFtq1FQ3HHKoZA=" + }, + "name": "FCOU", + "type": "" + } + ] + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFtq1VYFHJRoJM=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "FrameAdco", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq1W6LHJ/P1U=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "source": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "target": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + } + } + ], + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFtp3PC5Waq7Gs=", + "_parent": { + "$ref": "AAAAAAFtq1VYFHJRoJM=" + }, + "name": "ADCO", + "type": "String", + "multiplicity": "12" + } + ], + "isAbstract": true + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtq1mxH3LP8Ps=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "ice2q", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtq1l/HXKlq0o=", + "_parent": { + "$ref": "AAAAAAFtq1mxH3LP8Ps=" + }, + "name": "FrameIce2q", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq1smX3LVQwU=", + "_parent": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "source": { + "$ref": "AAAAAAFtq1l/HXKlq0o=" + }, + "target": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + } + } + ] + } + ] + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtq11fnnLmuR0=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "ice4q", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtq13JPHLqe08=", + "_parent": { + "$ref": "AAAAAAFtq11fnnLmuR0=" + }, + "name": "FrameIce4q", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq15hIHMWsnY=", + "_parent": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "source": { + "$ref": "AAAAAAFtq13JPHLqe08=" + }, + "target": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + } + } + ] + } + ] + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFtq2DtGXMuZ0w=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "pmepmi", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFtq2Eck3MyGC0=", + "_parent": { + "$ref": "AAAAAAFtq2DtGXMuZ0w=" + }, + "name": "FramePmePmi", + "ownedElements": [ + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFtq2GFZHNeUH0=", + "_parent": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "source": { + "$ref": "AAAAAAFtq2Eck3MyGC0=" + }, + "target": { + "$ref": "AAAAAAFtp3MR3mZ74lY=" + } + } + ] + } + ] + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFtz2ZRuGYNVuw=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "ProgrammeCircuit1", + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2arTmY7Q/w=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "name": "A" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2a7+WZC4RQ=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "name": "B" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2bIXGZJi4o=", + "_parent": { + "$ref": "AAAAAAFtz2ZRuGYNVuw=" + }, + "name": "C" + } + ] + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFtz2cie2ZS3vU=", + "_parent": { + "$ref": "AAAAAAFtp3ClvmZujPI=" + }, + "name": "ProgrammeCircuit2", + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2dvyWaBn9o=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P0" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2eHhGaIg0M=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P1" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2eS1WaPwAQ=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P2" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2ecTWaW+3k=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P3" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2eoFmad/7s=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P4" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2e4FWakjbc=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P5" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2fFbWarFKo=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P6" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFtz2fUTmayOro=", + "_parent": { + "$ref": "AAAAAAFtz2cie2ZS3vU=" + }, + "name": "P7" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.teleinfo/pom.xml b/bundles/org.openhab.binding.teleinfo/pom.xml new file mode 100644 index 0000000000000..e072118cdb95c --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/pom.xml @@ -0,0 +1,17 @@ + + + + 4.0.0 + + + org.openhab.addons.bundles + org.openhab.addons.reactor.bundles + 2.5.9-SNAPSHOT + + + org.openhab.binding.teleinfo + + openHAB Add-ons :: Bundles :: Teleinfo Binding + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/feature/feature.xml b/bundles/org.openhab.binding.teleinfo/src/main/feature/feature.xml new file mode 100644 index 0000000000000..d6a4865d16ca7 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/feature/feature.xml @@ -0,0 +1,10 @@ + + + mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features + + + openhab-runtime-base + openhab-transport-serial + mvn:org.openhab.addons.bundles/org.openhab.binding.teleinfo/${project.version} + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoBindingConstants.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoBindingConstants.java new file mode 100644 index 0000000000000..8391ba5c718df --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoBindingConstants.java @@ -0,0 +1,127 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.ThingTypeUID; + +/** + * The {@link TeleinfoBindingConstants} class defines common constants, which are + * used across the whole binding. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoBindingConstants { + + private static final String BINDING_ID = "teleinfo"; + + // List of all Thing Type UIDs + public static final ThingTypeUID THING_TYPE_SERIAL_CONTROLLER = new ThingTypeUID(BINDING_ID, "serialcontroller"); + public static final String THING_SERIAL_CONTROLLER_CHANNEL_INVALID_FRAME_COUNTER = "invalidFrameCounter"; + + // List of commons channel ids + public static final String CHANNEL_LAST_UPDATE = "lastUpdate"; + // List of HC frames channel ids + public static final String CHANNEL_HC_FRAME_HCHC = "hchc"; + public static final String CHANNEL_HC_FRAME_HCHP = "hchp"; + public static final String CHANNEL_HC_FRAME_HHPHC = "hhphc"; + // List of BASE frames channel ids + public static final String CHANNEL_BASE_FRAME_BASE = "base"; + // List of TEMPO frames channel ids + public static final String CHANNEL_TEMPO_FRAME_BBRHPJR = "bbrhpjr"; + public static final String CHANNEL_TEMPO_FRAME_BBRHCJR = "bbrhcjr"; + public static final String CHANNEL_TEMPO_FRAME_BBRHPJW = "bbrhpjw"; + public static final String CHANNEL_TEMPO_FRAME_BBRHCJW = "bbrhcjw"; + public static final String CHANNEL_TEMPO_FRAME_BBRHPJB = "bbrhpjb"; + public static final String CHANNEL_TEMPO_FRAME_BBRHCJB = "bbrhcjb"; + public static final String CHANNEL_TEMPO_FRAME_DEMAIN = "demain"; + public static final String CHANNEL_TEMPO_FRAME_HHPHC = "hhphc"; + public static final String CHANNEL_TEMPO_FRAME_PROGRAMME_CIRCUIT_1 = "programmeCircuit1"; + public static final String CHANNEL_TEMPO_FRAME_PROGRAMME_CIRCUIT_2 = "programmeCircuit2"; + // List of EJP frames channel ids + public static final String CHANNEL_EJP_FRAME_PEJP = "pejp"; + public static final String CHANNEL_EJP_FRAME_EJPHPM = "ejphpm"; + public static final String CHANNEL_EJP_FRAME_EJPHN = "ejphn"; + // List of CBEMM Channel ids + public static final String CHANNEL_CBEMM_ISOUSC = "isousc"; + public static final String CHANNEL_CBEMM_PTEC = "ptec"; + public static final String CHANNEL_CBEMM_IMAX = "imax"; + public static final String CHANNEL_CBEMM_ADPS = "adps"; + public static final String CHANNEL_CBEMM_IINST = "iinst"; + public static final String CHANNEL_CBEMM_MOTDETAT = "motdetat"; + // List of CBEMM EVOLUTION ICC Channel ids + public static final String CHANNEL_CBEMM_EVOLUTION_ICC_PAPP = "papp"; + // List of CBETM Channel ids + public static final String CHANNEL_CBETM_IINST1 = "iinst1"; + public static final String CHANNEL_CBETM_IINST2 = "iinst2"; + public static final String CHANNEL_CBETM_IINST3 = "iinst3"; + public static final String CHANNEL_CBETM_FRAME_TYPE = "frameType"; + public static final String CHANNEL_CBETM_LONG_ISOUSC = "isousc"; + public static final String CHANNEL_CBETM_LONG_IMAX1 = "imax1"; + public static final String CHANNEL_CBETM_LONG_IMAX2 = "imax2"; + public static final String CHANNEL_CBETM_LONG_IMAX3 = "imax3"; + public static final String CHANNEL_CBETM_LONG_PTEC = "ptec"; + public static final String CHANNEL_CBETM_LONG_PMAX = "pmax"; + public static final String CHANNEL_CBETM_LONG_PAPP = "papp"; + public static final String CHANNEL_CBETM_LONG_MOTDETAT = "motdetat"; + public static final String CHANNEL_CBETM_LONG_PPOT = "ppot"; + public static final String CHANNEL_CBETM_SHORT_ADIR1 = "adir1"; + public static final String CHANNEL_CBETM_SHORT_ADIR2 = "adir2"; + public static final String CHANNEL_CBETM_SHORT_ADIR3 = "adir3"; + + public static final String THING_ELECTRICITY_METER_PROPERTY_ADCO = "adco"; + + public static final ThingTypeUID THING_HC_CBEMM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_hc_electricitymeter"); + + public static final ThingTypeUID THING_BASE_CBEMM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_base_electricitymeter"); + + public static final ThingTypeUID THING_EJP_CBEMM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_ejp_electricitymeter"); + + public static final ThingTypeUID THING_TEMPO_CBEMM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_tempo_electricitymeter"); + + public static final ThingTypeUID THING_HC_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_evolution_icc_hc_electricitymeter"); + + public static final ThingTypeUID THING_BASE_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_evolution_icc_base_electricitymeter"); + + public static final ThingTypeUID THING_EJP_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_evolution_icc_ejp_electricitymeter"); + + public static final ThingTypeUID THING_TEMPO_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbemm_evolution_icc_tempo_electricitymeter"); + + public static final ThingTypeUID THING_HC_CBETM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbetm_hc_electricitymeter"); + + public static final ThingTypeUID THING_BASE_CBETM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbetm_base_electricitymeter"); + + public static final ThingTypeUID THING_EJP_CBETM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbetm_ejp_electricitymeter"); + + public static final ThingTypeUID THING_TEMPO_CBETM_ELECTRICITY_METER_TYPE_UID = new ThingTypeUID(BINDING_ID, + "cbetm_tempo_electricitymeter"); + + public static final String ERROR_OFFLINE_SERIAL_NOT_FOUND = "@text/teleinfo.thingstate.serial_notfound"; + public static final String ERROR_OFFLINE_SERIAL_INUSE = "@text/teleinfo.thingstate.serial_inuse"; + public static final String ERROR_OFFLINE_SERIAL_UNSUPPORTED = "@text/teleinfo.thingstate.serial_unsupported"; + public static final String ERROR_OFFLINE_SERIAL_LISTENERS = "@text/teleinfo.thingstate.serial_listeners"; + public static final String ERROR_OFFLINE_CONTROLLER_OFFLINE = "@text/teleinfo.thingstate.controller_offline"; + public static final String ERROR_UNKNOWN_RETRY_IN_PROGRESS = "@text/teleinfo.thingstate.controller_unknown_retry_inprogress"; +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoDiscoveryService.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoDiscoveryService.java new file mode 100644 index 0000000000000..152ad9f89f7e8 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/TeleinfoDiscoveryService.java @@ -0,0 +1,231 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.config.discovery.AbstractDiscoveryService; +import org.eclipse.smarthome.config.discovery.DiscoveryResult; +import org.eclipse.smarthome.config.discovery.DiscoveryResultBuilder; +import org.eclipse.smarthome.config.discovery.DiscoveryService; +import org.eclipse.smarthome.core.thing.ThingTypeUID; +import org.eclipse.smarthome.core.thing.ThingUID; +import org.eclipse.smarthome.core.thing.binding.ThingHandler; +import org.eclipse.smarthome.core.thing.binding.ThingHandlerService; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongTempoOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameAdco; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoControllerHandlerListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link TeleinfoDiscoveryService} class is the service to discover a skeleton for controller handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoDiscoveryService extends AbstractDiscoveryService + implements TeleinfoControllerHandlerListener, ThingHandlerService, DiscoveryService { + + private static final Set SUPPORTED_THING_TYPES = Stream.of(THING_HC_CBEMM_ELECTRICITY_METER_TYPE_UID, + THING_BASE_CBEMM_ELECTRICITY_METER_TYPE_UID, THING_TEMPO_CBEMM_ELECTRICITY_METER_TYPE_UID, + THING_EJP_CBEMM_ELECTRICITY_METER_TYPE_UID, THING_HC_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, + THING_BASE_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, THING_TEMPO_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, + THING_EJP_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, THING_HC_CBETM_ELECTRICITY_METER_TYPE_UID, + THING_BASE_CBETM_ELECTRICITY_METER_TYPE_UID, THING_TEMPO_CBETM_ELECTRICITY_METER_TYPE_UID, + THING_EJP_CBETM_ELECTRICITY_METER_TYPE_UID).collect(Collectors.toSet()); + + private static final int SCAN_DURATION_IN_S = 60; + + private final Logger logger = LoggerFactory.getLogger(TeleinfoDiscoveryService.class); + private @Nullable TeleinfoAbstractControllerHandler controllerHandler; + + public TeleinfoDiscoveryService() { + super(SCAN_DURATION_IN_S); + } + + public TeleinfoDiscoveryService(TeleinfoAbstractControllerHandler controllerHandler) { + super(SCAN_DURATION_IN_S); + this.controllerHandler = controllerHandler; + } + + @Override + public Set getSupportedThingTypes() { + return SUPPORTED_THING_TYPES; + } + + public void activate() { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("Teleinfo discovery: Activate {}", controllerHandlerRef.getThing().getUID()); + } else { + logNullControllerHandler(); + } + } + + @Override + public void deactivate() { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("Teleinfo discovery: Deactivate {}", controllerHandlerRef.getThing().getUID()); + } else { + logNullControllerHandler(); + } + } + + @Override + protected void startScan() { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("Teleinfo discovery: Start {}", controllerHandlerRef.getThing().getUID()); + + // Start the search for new devices + controllerHandlerRef.addListener(this); + } else { + logNullControllerHandler(); + } + } + + @Override + public synchronized void abortScan() { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("Teleinfo discovery: Abort {}", controllerHandlerRef.getThing().getUID()); + controllerHandlerRef.removeListener(this); + super.abortScan(); + } else { + logNullControllerHandler(); + } + } + + @Override + protected synchronized void stopScan() { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("Teleinfo discovery: Stop {}", controllerHandlerRef.getThing().getUID()); + controllerHandlerRef.removeListener(this); + super.stopScan(); + } else { + logNullControllerHandler(); + } + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + detectNewElectricityMeterFromReceivedFrame(frame); + } + + private void detectNewElectricityMeterFromReceivedFrame(final Frame frameSample) { + TeleinfoAbstractControllerHandler controllerHandlerRef = controllerHandler; + if (controllerHandlerRef != null) { + logger.debug("New eletricity meter detection from frame {}", frameSample.getId()); + if (!(frameSample instanceof FrameAdco)) { + throw new IllegalStateException("Teleinfo frame type not supported: " + frameSample.getClass()); + } + final FrameAdco frameAdco = (FrameAdco) frameSample; + + ThingUID thingUID = new ThingUID(getThingTypeUID(frameAdco), frameAdco.getAdco(), + controllerHandlerRef.getThing().getUID().getId()); + + final Map properties = getThingProperties(frameAdco); + final String representationProperty = THING_ELECTRICITY_METER_PROPERTY_ADCO; + DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties) + .withLabel("Teleinfo ADCO " + frameAdco.getAdco()).withThingType(getThingTypeUID(frameAdco)) + .withBridge(controllerHandlerRef.getThing().getUID()) + .withRepresentationProperty(representationProperty).build(); + + thingDiscovered(discoveryResult); + } else { + logNullControllerHandler(); + } + } + + private ThingTypeUID getThingTypeUID(final Frame teleinfoFrame) { + if (teleinfoFrame instanceof FrameCbemmHcOption) { + return THING_HC_CBEMM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmBaseOption) { + return THING_BASE_CBEMM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmEjpOption) { + return THING_EJP_CBEMM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmTempoOption) { + return THING_TEMPO_CBEMM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmEvolutionIccHcOption) { + return THING_HC_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmEvolutionIccBaseOption) { + return THING_BASE_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmEvolutionIccEjpOption) { + return THING_EJP_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbemmEvolutionIccTempoOption) { + return THING_TEMPO_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbetmLongHcOption) { + return THING_HC_CBETM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbetmLongBaseOption) { + return THING_BASE_CBETM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbetmLongEjpOption) { + return THING_EJP_CBETM_ELECTRICITY_METER_TYPE_UID; + } else if (teleinfoFrame instanceof FrameCbetmLongTempoOption) { + return THING_TEMPO_CBETM_ELECTRICITY_METER_TYPE_UID; + } else { + throw new IllegalStateException("Teleinfo frame type not supported: " + teleinfoFrame.getClass()); + } + } + + private Map getThingProperties(final Frame teleinfoFrame) { + Map properties = new HashMap(); + if (teleinfoFrame instanceof FrameAdco) { + final FrameAdco frameAdco = (FrameAdco) teleinfoFrame; + properties.put(THING_ELECTRICITY_METER_PROPERTY_ADCO, frameAdco.getAdco()); + + return properties; + } + + throw new IllegalStateException("Teleinfo frame type not supported: " + teleinfoFrame.getClass()); + } + + @Override + public void setThingHandler(@Nullable ThingHandler handler) { + if (handler instanceof TeleinfoAbstractControllerHandler) { + controllerHandler = (TeleinfoAbstractControllerHandler) handler; + } + } + + @Override + public @Nullable ThingHandler getThingHandler() { + return controllerHandler; + } + + private void logNullControllerHandler() { + logger.warn("Null controller handler"); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/Frame.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/Frame.java new file mode 100644 index 0000000000000..748797493d842 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/Frame.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.UUID; + +/** + * The {@link Frame} class defines common attributes for any Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class Frame implements Serializable { + + private static final long serialVersionUID = -1934715078822532494L; + + private UUID id; + private LocalDate timestamp; // UTC timestamp + + public Frame() { + // default constructor + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDate getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDate timestamp) { + this.timestamp = timestamp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemm.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemm.java new file mode 100644 index 0000000000000..eadb35d2f09d0 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemm.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameAdco; +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; + +/** + * The {@link FrameCbemm} class defines common attributes for CBEMM Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class FrameCbemm extends FrameAdco { + + private static final long serialVersionUID = -8500010131430582841L; + + private int isousc; + private int iinst; // ampères + private Integer adps; // ampères + private Integer imax; // ampères + private Ptec ptec; + private String motdetat; + + public FrameCbemm() { + // default constructor + } + + public int getIsousc() { + return isousc; + } + + public void setIsousc(int isousc) { + this.isousc = isousc; + } + + public int getIinst() { + return iinst; + } + + public void setIinst(int iinst) { + this.iinst = iinst; + } + + public Integer getAdps() { + return adps; + } + + public void setAdps(Integer adps) { + this.adps = adps; + } + + public Integer getImax() { + return imax; + } + + public void setImax(Integer imax) { + this.imax = imax; + } + + public Ptec getPtec() { + return ptec; + } + + public void setPtec(Ptec ptec) { + this.ptec = ptec; + } + + public String getMotdetat() { + return motdetat; + } + + public void setMotdetat(String motdetat) { + this.motdetat = motdetat; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmBaseOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmBaseOption.java new file mode 100644 index 0000000000000..8802c8aaf94d9 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmBaseOption.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameBaseOption; + +/** + * The {@link FrameCbemmBaseOption} class defines a CBEMM Teleinfo frame with Base option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmBaseOption extends FrameCbemm implements FrameBaseOption { + + private static final long serialVersionUID = 5560141193379363335L; + + private int base; + + public FrameCbemmBaseOption() { + // default constructor + } + + @Override + public int getBase() { + return base; + } + + @Override + public void setBase(int base) { + this.base = base; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmEjpOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmEjpOption.java new file mode 100644 index 0000000000000..400f7f58b1029 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmEjpOption.java @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameEjpOption; + +/** + * The {@link FrameCbemmEjpOption} class defines a CBEMM Teleinfo frame with EJP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmEjpOption extends FrameCbemm implements FrameEjpOption { + + private static final long serialVersionUID = -1934715078822532494L; + + private int ejphpm; + private int ejphn; + private Integer pejp; + + public FrameCbemmEjpOption() { + // default constructor + } + + @Override + public int getEjphpm() { + return ejphpm; + } + + @Override + public int getEjphn() { + return ejphn; + } + + @Override + public Integer getPejp() { + return pejp; + } + + @Override + public void setEjphpm(int ejphpm) { + this.ejphpm = ejphpm; + } + + @Override + public void setEjphn(int ejphn) { + this.ejphn = ejphn; + } + + @Override + public void setPejp(Integer pejp) { + this.pejp = pejp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmHcOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmHcOption.java new file mode 100644 index 0000000000000..bb9c9947d9bea --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmHcOption.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameHcOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbemmHcOption} class defines a CBEMM Teleinfo frame with HC/HP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmHcOption extends FrameCbemm implements FrameHcOption { + + private static final long serialVersionUID = -1934715078822532494L; + + private int hchc; + private int hchp; + private Hhphc hhphc; + + public FrameCbemmHcOption() { + // default constructor + } + + @Override + public int getHchc() { + return hchc; + } + + @Override + public void setHchc(int hchc) { + this.hchc = hchc; + } + + @Override + public int getHchp() { + return hchp; + } + + @Override + public void setHchp(int hchp) { + this.hchp = hchp; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmTempoOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmTempoOption.java new file mode 100644 index 0000000000000..34fd2d364da52 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/FrameCbemmTempoOption.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbemmTempoOption} class defines a CBEMM Teleinfo frame with Tempo option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmTempoOption extends FrameCbemm implements FrameTempoOption { + + private static final long serialVersionUID = 6423861816467362730L; + + private int bbrhpjr; + private int bbrhcjr; + private int bbrhpjw; + private int bbrhcjw; + private int bbrhpjb; + private int bbrhcjb; + private CouleurDemain demain; + private Hhphc hhphc; + private ProgrammeCircuit1 programmeCircuit1; + private ProgrammeCircuit2 programmeCircuit2; + + public FrameCbemmTempoOption() { + // default constructor + } + + @Override + public int getBbrhpjr() { + return bbrhpjr; + } + + @Override + public int getBbrhcjr() { + return bbrhcjr; + } + + @Override + public int getBbrhpjw() { + return bbrhpjw; + } + + @Override + public int getBbrhcjw() { + return bbrhcjw; + } + + @Override + public int getBbrhpjb() { + return bbrhpjb; + } + + @Override + public int getBbrhcjb() { + return bbrhcjb; + } + + @Override + public CouleurDemain getDemain() { + return demain; + } + + @Override + public void setBbrhpjr(int bbrhpjr) { + this.bbrhpjr = bbrhpjr; + } + + @Override + public void setBbrhcjr(int bbrhcjr) { + this.bbrhcjr = bbrhcjr; + } + + @Override + public void setBbrhpjw(int bbrhpjw) { + this.bbrhpjw = bbrhpjw; + } + + @Override + public void setBbrhcjw(int bbrhcjw) { + this.bbrhcjw = bbrhcjw; + } + + @Override + public void setBbrhpjb(int bbrhpjb) { + this.bbrhpjb = bbrhpjb; + } + + @Override + public void setBbrhcjb(int bbrhcjb) { + this.bbrhcjb = bbrhcjb; + } + + @Override + public void setDemain(CouleurDemain demain) { + this.demain = demain; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } + + @Override + public ProgrammeCircuit1 getProgrammeCircuit1() { + return programmeCircuit1; + } + + @Override + public void setProgrammeCircuit1(ProgrammeCircuit1 programmeCircuit1) { + this.programmeCircuit1 = programmeCircuit1; + } + + @Override + public ProgrammeCircuit2 getProgrammeCircuit2() { + return programmeCircuit2; + } + + @Override + public void setProgrammeCircuit2(ProgrammeCircuit2 programmeCircuit2) { + this.programmeCircuit2 = programmeCircuit2; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIcc.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIcc.java new file mode 100644 index 0000000000000..f0723df47b69d --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIcc.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc; + +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemm; + +/** + * The {@link FrameCbemmEvolutionIcc} class defines CBEMM Evolution ICC Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class FrameCbemmEvolutionIcc extends FrameCbemm { + + private static final long serialVersionUID = 5532008316299149750L; + + private int papp; // Volt.ampères + + public FrameCbemmEvolutionIcc() { + // default constructor + } + + public int getPapp() { + return papp; + } + + public void setPapp(int papp) { + this.papp = papp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccBaseOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccBaseOption.java new file mode 100644 index 0000000000000..a190d095e8a0b --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccBaseOption.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameBaseOption; + +/** + * The {@link FrameCbemmEvolutionIccBaseOption} class defines a CBEMM Evolution ICC Teleinfo frame with Base option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmEvolutionIccBaseOption extends FrameCbemmEvolutionIcc implements FrameBaseOption { + + private static final long serialVersionUID = 1623781914779495089L; + + private int base; + + public FrameCbemmEvolutionIccBaseOption() { + // default constructor + } + + @Override + public int getBase() { + return base; + } + + @Override + public void setBase(int base) { + this.base = base; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccEjpOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccEjpOption.java new file mode 100644 index 0000000000000..e932887f381b2 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccEjpOption.java @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameEjpOption; + +/** + * The {@link FrameCbemmEvolutionIccEjpOption} class defines a CBEMM Evolution ICC Teleinfo frame with EJP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmEvolutionIccEjpOption extends FrameCbemmEvolutionIcc implements FrameEjpOption { + + private static final long serialVersionUID = -5053572570767309239L; + + private int ejphpm; + private int ejphn; + private Integer pejp; + + public FrameCbemmEvolutionIccEjpOption() { + // default constructor + } + + @Override + public int getEjphpm() { + return ejphpm; + } + + @Override + public int getEjphn() { + return ejphn; + } + + @Override + public Integer getPejp() { + return pejp; + } + + @Override + public void setEjphpm(int ejphpm) { + this.ejphpm = ejphpm; + } + + @Override + public void setEjphn(int ejphn) { + this.ejphn = ejphn; + } + + @Override + public void setPejp(Integer pejp) { + this.pejp = pejp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccHcOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccHcOption.java new file mode 100644 index 0000000000000..1215df6ec2482 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccHcOption.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameHcOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbemmEvolutionIccHcOption} class defines a CBEMM Evolution ICC Teleinfo frame with HC option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmEvolutionIccHcOption extends FrameCbemmEvolutionIcc implements FrameHcOption { + + private static final long serialVersionUID = 3133144820515675037L; + + private int hchc; + private int hchp; + private Hhphc hhphc; + + public FrameCbemmEvolutionIccHcOption() { + // default constructor + } + + @Override + public int getHchc() { + return hchc; + } + + @Override + public void setHchc(int hchc) { + this.hchc = hchc; + } + + @Override + public int getHchp() { + return hchp; + } + + @Override + public void setHchp(int hchp) { + this.hchp = hchp; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccTempoOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccTempoOption.java new file mode 100644 index 0000000000000..7b716eb13e535 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbemm/evoicc/FrameCbemmEvolutionIccTempoOption.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbemmEvolutionIccTempoOption} class defines a CBEMM Evolution ICC Teleinfo frame with Tempo option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbemmEvolutionIccTempoOption extends FrameCbemmEvolutionIcc implements FrameTempoOption { + + private static final long serialVersionUID = -1606685089266015480L; + + private int bbrhpjr; + private int bbrhcjr; + private int bbrhpjw; + private int bbrhcjw; + private int bbrhpjb; + private int bbrhcjb; + private CouleurDemain demain; + private Hhphc hhphc; + private ProgrammeCircuit1 programmeCircuit1; + private ProgrammeCircuit2 programmeCircuit2; + + public FrameCbemmEvolutionIccTempoOption() { + // default constructor + } + + @Override + public int getBbrhpjr() { + return bbrhpjr; + } + + @Override + public int getBbrhcjr() { + return bbrhcjr; + } + + @Override + public int getBbrhpjw() { + return bbrhpjw; + } + + @Override + public int getBbrhcjw() { + return bbrhcjw; + } + + @Override + public int getBbrhpjb() { + return bbrhpjb; + } + + @Override + public int getBbrhcjb() { + return bbrhcjb; + } + + @Override + public CouleurDemain getDemain() { + return demain; + } + + @Override + public void setBbrhpjr(int bbrhpjr) { + this.bbrhpjr = bbrhpjr; + } + + @Override + public void setBbrhcjr(int bbrhcjr) { + this.bbrhcjr = bbrhcjr; + } + + @Override + public void setBbrhpjw(int bbrhpjw) { + this.bbrhpjw = bbrhpjw; + } + + @Override + public void setBbrhcjw(int bbrhcjw) { + this.bbrhcjw = bbrhcjw; + } + + @Override + public void setBbrhpjb(int bbrhpjb) { + this.bbrhpjb = bbrhpjb; + } + + @Override + public void setBbrhcjb(int bbrhcjb) { + this.bbrhcjb = bbrhcjb; + } + + @Override + public void setDemain(CouleurDemain demain) { + this.demain = demain; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } + + @Override + public ProgrammeCircuit1 getProgrammeCircuit1() { + return programmeCircuit1; + } + + @Override + public void setProgrammeCircuit1(ProgrammeCircuit1 programmeCircuit1) { + this.programmeCircuit1 = programmeCircuit1; + } + + @Override + public ProgrammeCircuit2 getProgrammeCircuit2() { + return programmeCircuit2; + } + + @Override + public void setProgrammeCircuit2(ProgrammeCircuit2 programmeCircuit2) { + this.programmeCircuit2 = programmeCircuit2; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetm.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetm.java new file mode 100644 index 0000000000000..ca20891be08b2 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetm.java @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameAdco; + +/** + * The {@link FrameCbetm} class defines common attributes for CBETM Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class FrameCbetm extends FrameAdco { + + private static final long serialVersionUID = 2083723009359732507L; + + private int iinst1; // ampères + private int iinst2; // ampères + private int iinst3; // ampères + + public FrameCbetm() { + // default constructor + } + + public int getIinst1() { + return iinst1; + } + + public void setIinst1(int iinst1) { + this.iinst1 = iinst1; + } + + public int getIinst2() { + return iinst2; + } + + public void setIinst2(int iinst2) { + this.iinst2 = iinst2; + } + + public int getIinst3() { + return iinst3; + } + + public void setIinst3(int iinst3) { + this.iinst3 = iinst3; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLong.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLong.java new file mode 100644 index 0000000000000..15f27e3537f32 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLong.java @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; + +/** + * The {@link FrameCbetmLong} class defines common attributes for CBETM Long Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class FrameCbetmLong extends FrameCbetm { + + private static final long serialVersionUID = -2527584397688316017L; + + private int isousc; + private Integer imax1; // ampères + private Integer imax2; // ampères + private Integer imax3; // ampères + private Ptec ptec; + private int pmax; // W + private int papp; // Volt.ampères + private String motdetat; + private String ppot; + + public FrameCbetmLong() { + // default constructor + } + + public int getIsousc() { + return isousc; + } + + public void setIsousc(int isousc) { + this.isousc = isousc; + } + + public Integer getImax1() { + return imax1; + } + + public void setImax1(Integer imax1) { + this.imax1 = imax1; + } + + public Integer getImax2() { + return imax2; + } + + public void setImax2(Integer imax2) { + this.imax2 = imax2; + } + + public Integer getImax3() { + return imax3; + } + + public void setImax3(Integer imax3) { + this.imax3 = imax3; + } + + public Ptec getPtec() { + return ptec; + } + + public void setPtec(Ptec ptec) { + this.ptec = ptec; + } + + public int getPmax() { + return pmax; + } + + public void setPmax(int pmax) { + this.pmax = pmax; + } + + public int getPapp() { + return papp; + } + + public void setPapp(int papp) { + this.papp = papp; + } + + public String getMotdetat() { + return motdetat; + } + + public void setMotdetat(String motdetat) { + this.motdetat = motdetat; + } + + public String getPpot() { + return ppot; + } + + public void setPpot(String ppot) { + this.ppot = ppot; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongBaseOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongBaseOption.java new file mode 100644 index 0000000000000..c907fc41583f7 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongBaseOption.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameBaseOption; + +/** + * The {@link FrameCbetmLongBaseOption} class defines a CBETM Teleinfo frame with Base option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbetmLongBaseOption extends FrameCbetmLong implements FrameBaseOption { + + private static final long serialVersionUID = 7248276012515193856L; + + private int base; + + public FrameCbetmLongBaseOption() { + // default constructor + } + + @Override + public int getBase() { + return base; + } + + @Override + public void setBase(int base) { + this.base = base; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongEjpOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongEjpOption.java new file mode 100644 index 0000000000000..ec13dc0307b2b --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongEjpOption.java @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameEjpOption; + +/** + * The {@link FrameCbetmLongEjpOption} class defines a CBETM Teleinfo frame with EJP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbetmLongEjpOption extends FrameCbetmLong implements FrameEjpOption { + + private static final long serialVersionUID = 1104569000621483323L; + + private int ejphpm; + private int ejphn; + private Integer pejp; + + public FrameCbetmLongEjpOption() { + // default constructor + } + + @Override + public int getEjphpm() { + return ejphpm; + } + + @Override + public int getEjphn() { + return ejphn; + } + + @Override + public Integer getPejp() { + return pejp; + } + + @Override + public void setEjphpm(int ejphpm) { + this.ejphpm = ejphpm; + } + + @Override + public void setEjphn(int ejphn) { + this.ejphn = ejphn; + } + + @Override + public void setPejp(Integer pejp) { + this.pejp = pejp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongHcOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongHcOption.java new file mode 100644 index 0000000000000..faac765e8061b --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongHcOption.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameHcOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbetmLongHcOption} class defines a CBETM Teleinfo frame with HC/HP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbetmLongHcOption extends FrameCbetmLong implements FrameHcOption { + + private static final long serialVersionUID = -590729310348196198L; + + private int hchc; + private int hchp; + private Hhphc hhphc; + + public FrameCbetmLongHcOption() { + // default constructor + } + + @Override + public int getHchc() { + return hchc; + } + + @Override + public void setHchc(int hchc) { + this.hchc = hchc; + } + + @Override + public int getHchp() { + return hchp; + } + + @Override + public void setHchp(int hchp) { + this.hchp = hchp; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongTempoOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongTempoOption.java new file mode 100644 index 0000000000000..137492e3bebe8 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmLongTempoOption.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; + +/** + * The {@link FrameCbetmLongTempoOption} class defines a CBETM Teleinfo frame with Tempo option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbetmLongTempoOption extends FrameCbetmLong implements FrameTempoOption { + + private static final long serialVersionUID = 333018110121838463L; + + private int bbrhpjr; + private int bbrhcjr; + private int bbrhpjw; + private int bbrhcjw; + private int bbrhpjb; + private int bbrhcjb; + private CouleurDemain demain; + private Hhphc hhphc; + private ProgrammeCircuit1 programmeCircuit1; + private ProgrammeCircuit2 programmeCircuit2; + + public FrameCbetmLongTempoOption() { + // default constructor + } + + @Override + public int getBbrhpjr() { + return bbrhpjr; + } + + @Override + public int getBbrhcjr() { + return bbrhcjr; + } + + @Override + public int getBbrhpjw() { + return bbrhpjw; + } + + @Override + public int getBbrhcjw() { + return bbrhcjw; + } + + @Override + public int getBbrhpjb() { + return bbrhpjb; + } + + @Override + public int getBbrhcjb() { + return bbrhcjb; + } + + @Override + public CouleurDemain getDemain() { + return demain; + } + + @Override + public void setBbrhpjr(int bbrhpjr) { + this.bbrhpjr = bbrhpjr; + } + + @Override + public void setBbrhcjr(int bbrhcjr) { + this.bbrhcjr = bbrhcjr; + } + + @Override + public void setBbrhpjw(int bbrhpjw) { + this.bbrhpjw = bbrhpjw; + } + + @Override + public void setBbrhcjw(int bbrhcjw) { + this.bbrhcjw = bbrhcjw; + } + + @Override + public void setBbrhpjb(int bbrhpjb) { + this.bbrhpjb = bbrhpjb; + } + + @Override + public void setBbrhcjb(int bbrhcjb) { + this.bbrhcjb = bbrhcjb; + } + + @Override + public void setDemain(CouleurDemain demain) { + this.demain = demain; + } + + @Override + public Hhphc getHhphc() { + return hhphc; + } + + @Override + public void setHhphc(Hhphc hhphc) { + this.hhphc = hhphc; + } + + @Override + public ProgrammeCircuit1 getProgrammeCircuit1() { + return programmeCircuit1; + } + + @Override + public void setProgrammeCircuit1(ProgrammeCircuit1 programmeCircuit1) { + this.programmeCircuit1 = programmeCircuit1; + } + + @Override + public ProgrammeCircuit2 getProgrammeCircuit2() { + return programmeCircuit2; + } + + @Override + public void setProgrammeCircuit2(ProgrammeCircuit2 programmeCircuit2) { + this.programmeCircuit2 = programmeCircuit2; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmShort.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmShort.java new file mode 100644 index 0000000000000..aeaecda930dd2 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/cbetm/FrameCbetmShort.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.cbetm; + +/** + * The {@link FrameCbetmShort} class defines a CBETM Short Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public class FrameCbetmShort extends FrameCbetm { + + private static final long serialVersionUID = 4269743289079544119L; + + private Integer adir1; // ampères + private Integer adir2; // ampères + private Integer adir3; // ampères + + public FrameCbetmShort() { + // default constructor + } + + public Integer getAdir1() { + return adir1; + } + + public void setAdir1(Integer adir1) { + this.adir1 = adir1; + } + + public Integer getAdir2() { + return adir2; + } + + public void setAdir2(Integer adir2) { + this.adir2 = adir2; + } + + public Integer getAdir3() { + return adir3; + } + + public void setAdir3(Integer adir3) { + this.adir3 = adir3; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameAdco.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameAdco.java new file mode 100644 index 0000000000000..752bcbaa0d2bd --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameAdco.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +import org.openhab.binding.teleinfo.internal.dto.Frame; + +/** + * The {@link FrameAdco} class defines common attributes for CBEMM and CBETM Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public abstract class FrameAdco extends Frame { + + private static final long serialVersionUID = 1384731471611580773L; + + private String adco; + + public FrameAdco() { + // default constructor + } + + public String getAdco() { + return adco; + } + + public void setAdco(String adco) { + this.adco = adco; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameBaseOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameBaseOption.java new file mode 100644 index 0000000000000..8ae23f0320645 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameBaseOption.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link FrameBaseOption} interface defines common attributes for Base option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public interface FrameBaseOption { + + int getBase(); + + void setBase(int base); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameEjpOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameEjpOption.java new file mode 100644 index 0000000000000..65fa837486996 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameEjpOption.java @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link FrameEjpOption} interface defines common attributes for EJP option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public interface FrameEjpOption { + + int getEjphpm(); + + void setEjphpm(int ejphpm); + + int getEjphn(); + + void setEjphn(int ejphn); + + Integer getPejp(); + + void setPejp(Integer pejp); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameHcOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameHcOption.java new file mode 100644 index 0000000000000..06d2614888af3 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameHcOption.java @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link FrameHcOption} interface defines common attributes for HC option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public interface FrameHcOption { + + int getHchc(); + + void setHchc(int hchc); + + int getHchp(); + + void setHchp(int hchp); + + Hhphc getHhphc(); + + void setHhphc(Hhphc hhphc); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameTempoOption.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameTempoOption.java new file mode 100644 index 0000000000000..2f1a57f9d04c1 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/FrameTempoOption.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link FrameTempoOption} interface defines common attributes for Tempo option. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public interface FrameTempoOption { + + public static enum CouleurDemain { + Bleu, + Blanc, + Rouge + } + + public static enum ProgrammeCircuit1 { + A, + B, + C + } + + public static enum ProgrammeCircuit2 { + P0, + P1, + P2, + P3, + P4, + P5, + P6, + P7 + } + + int getBbrhpjr(); + + void setBbrhpjr(int bbrhpjr); + + int getBbrhcjr(); + + void setBbrhcjr(int bbrhcjr); + + int getBbrhpjw(); + + void setBbrhpjw(int bbrhpjw); + + int getBbrhcjw(); + + void setBbrhcjw(int bbrhcjw); + + int getBbrhpjb(); + + void setBbrhpjb(int bbrhpjb); + + int getBbrhcjb(); + + void setBbrhcjb(int bbrhcjb); + + CouleurDemain getDemain(); + + void setDemain(CouleurDemain couleurDemain); + + Hhphc getHhphc(); + + void setHhphc(Hhphc hhphc); + + ProgrammeCircuit1 getProgrammeCircuit1(); + + void setProgrammeCircuit1(ProgrammeCircuit1 programmeCircuit1); + + ProgrammeCircuit2 getProgrammeCircuit2(); + + void setProgrammeCircuit2(ProgrammeCircuit2 programmeCircuit2); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Hhphc.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Hhphc.java new file mode 100644 index 0000000000000..caf0d3e3e21cc --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Hhphc.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link Hhphc} enumeration defines all HHPHC values. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public enum Hhphc { + A, + C, + D, + E, + Y +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Ptec.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Ptec.java new file mode 100644 index 0000000000000..6137c11b625e2 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/dto/common/Ptec.java @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.dto.common; + +/** + * The {@link Ptec} enumeration defines all PTEC values. + * + * @author Nicolas SIBERIL - Initial contribution + */ +public enum Ptec { + TH, + HC, + HP, + HN, + PM, + HCJB, + HCJW, + HCJR, + HPJB, + HPJW, + HPJR +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractControllerHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractControllerHandler.java new file mode 100644 index 0000000000000..7ed3415748cac --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractControllerHandler.java @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Bridge; +import org.eclipse.smarthome.core.thing.binding.BaseBridgeHandler; +import org.eclipse.smarthome.core.thing.binding.ThingHandlerService; +import org.openhab.binding.teleinfo.internal.TeleinfoDiscoveryService; +import org.openhab.binding.teleinfo.internal.dto.Frame; + +/** + * The {@link TeleinfoAbstractControllerHandler} class defines a skeleton for controller handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoAbstractControllerHandler extends BaseBridgeHandler { + + private List listeners = Collections.synchronizedList(new ArrayList<>()); + + public TeleinfoAbstractControllerHandler(Bridge bridge) { + super(bridge); + } + + public void addListener(final TeleinfoControllerHandlerListener listener) { + listeners.add(listener); + } + + public void removeListener(final TeleinfoControllerHandlerListener listener) { + listeners.remove(listener); + } + + protected void fireOnFrameReceivedEvent(final Frame frame) { + listeners.forEach(l -> l.onFrameReceived(this, frame)); + } + + @Override + public Collection> getServices() { + return Collections.singleton(TeleinfoDiscoveryService.class); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractElectricityMeterHandler.java new file mode 100644 index 0000000000000..cefb4352114c0 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractElectricityMeterHandler.java @@ -0,0 +1,159 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.core.library.types.QuantityType; +import org.eclipse.smarthome.core.library.types.StringType; +import org.eclipse.smarthome.core.library.unit.SmartHomeUnits; +import org.eclipse.smarthome.core.thing.Bridge; +import org.eclipse.smarthome.core.thing.Channel; +import org.eclipse.smarthome.core.thing.ChannelUID; +import org.eclipse.smarthome.core.thing.Thing; +import org.eclipse.smarthome.core.thing.ThingStatus; +import org.eclipse.smarthome.core.thing.ThingStatusDetail; +import org.eclipse.smarthome.core.thing.ThingStatusInfo; +import org.eclipse.smarthome.core.thing.binding.BaseThingHandler; +import org.eclipse.smarthome.core.types.Command; +import org.eclipse.smarthome.core.types.UnDefType; +import org.openhab.binding.teleinfo.internal.dto.common.FrameBaseOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameEjpOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameHcOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link TeleinfoAbstractElectricityMeterHandler} class defines a skeleton for Electricity Meters handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoAbstractElectricityMeterHandler extends BaseThingHandler + implements TeleinfoControllerHandlerListener { + private final Logger logger = LoggerFactory.getLogger(TeleinfoAbstractElectricityMeterHandler.class); + protected TeleinfoElectricityMeterConfiguration configuration = new TeleinfoElectricityMeterConfiguration(); + + public TeleinfoAbstractElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void initialize() { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE, ERROR_OFFLINE_CONTROLLER_OFFLINE); + + Bridge bridge = getBridge(); + logger.debug("bridge = {}", bridge); + if (bridge != null) { + bridgeStatusChanged(bridge.getStatusInfo()); + } + configuration = getConfigAs(TeleinfoElectricityMeterConfiguration.class); + } + + @Override + public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) { + if (bridgeStatusInfo.getStatus() != ThingStatus.ONLINE) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE, ERROR_OFFLINE_CONTROLLER_OFFLINE); + return; + } + + Bridge bridge = getBridge(); + if (bridge != null) { + TeleinfoAbstractControllerHandler controllerHandler = (TeleinfoAbstractControllerHandler) bridge + .getHandler(); + if (controllerHandler != null) { + controllerHandler.addListener(this); + updateStatus(ThingStatus.ONLINE); + } + } + } + + @Override + public void handleCommand(ChannelUID channelUID, Command command) { + // no commands supported + } + + protected void updateStatesForBaseFrameOption(FrameBaseOption frameBaseOption) { + updateState(CHANNEL_BASE_FRAME_BASE, QuantityType.valueOf(frameBaseOption.getBase(), SmartHomeUnits.WATT_HOUR)); + } + + protected void updateStatesForHcFrameOption(FrameHcOption frameHcOption) { + updateState(CHANNEL_HC_FRAME_HCHC, QuantityType.valueOf(frameHcOption.getHchc(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_HC_FRAME_HCHP, QuantityType.valueOf(frameHcOption.getHchp(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_HC_FRAME_HHPHC, new StringType(frameHcOption.getHhphc().name())); + } + + protected void updateStatesForTempoFrameOption(FrameTempoOption frameTempoOption) { + updateState(CHANNEL_TEMPO_FRAME_BBRHPJR, + QuantityType.valueOf(frameTempoOption.getBbrhpjr(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_BBRHCJR, + QuantityType.valueOf(frameTempoOption.getBbrhcjr(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_BBRHPJW, + QuantityType.valueOf(frameTempoOption.getBbrhpjw(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_BBRHCJW, + QuantityType.valueOf(frameTempoOption.getBbrhcjw(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_BBRHPJB, + QuantityType.valueOf(frameTempoOption.getBbrhpjb(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_BBRHCJB, + QuantityType.valueOf(frameTempoOption.getBbrhcjb(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_TEMPO_FRAME_HHPHC, new StringType(frameTempoOption.getHhphc().name())); + updateState(CHANNEL_TEMPO_FRAME_PROGRAMME_CIRCUIT_1, + new StringType(frameTempoOption.getProgrammeCircuit1().name())); + updateState(CHANNEL_TEMPO_FRAME_PROGRAMME_CIRCUIT_2, + new StringType(frameTempoOption.getProgrammeCircuit2().name())); + + if (frameTempoOption.getDemain() == null) { + updateState(CHANNEL_TEMPO_FRAME_DEMAIN, UnDefType.NULL); + } else { + updateState(CHANNEL_TEMPO_FRAME_DEMAIN, new StringType(frameTempoOption.getDemain().name())); + } + } + + protected void updateStatesForEjpFrameOption(FrameEjpOption frameEjpOption) { + updateState(CHANNEL_EJP_FRAME_EJPHN, QuantityType.valueOf(frameEjpOption.getEjphn(), SmartHomeUnits.WATT_HOUR)); + updateState(CHANNEL_EJP_FRAME_EJPHPM, + QuantityType.valueOf(frameEjpOption.getEjphpm(), SmartHomeUnits.WATT_HOUR)); + + if (frameEjpOption.getPejp() == null) { + updateState(CHANNEL_EJP_FRAME_PEJP, UnDefType.NULL); + } else { + updateState(CHANNEL_EJP_FRAME_PEJP, QuantityType.valueOf(frameEjpOption.getPejp(), SmartHomeUnits.MINUTE)); + } + } + + @Override + protected void updateStatus(ThingStatus status, ThingStatusDetail statusDetail, @Nullable String description) { + super.updateStatus(status, statusDetail, description); + + if (!(ThingStatus.ONLINE.equals(status))) { + for (Channel channel : getThing().getChannels()) { + if (!CHANNEL_LAST_UPDATE.equals(channel.getUID().getId())) { + updateState(channel.getUID(), UnDefType.UNDEF); + } + } + } + } + + @Override + protected void updateStatus(ThingStatus status, ThingStatusDetail statusDetail) { + this.updateStatus(status, statusDetail, null); + } + + @Override + protected void updateStatus(ThingStatus status) { + this.updateStatus(status, ThingStatusDetail.NONE, null); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoControllerHandlerListener.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoControllerHandlerListener.java new file mode 100644 index 0000000000000..cf50686b54114 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoControllerHandlerListener.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.teleinfo.internal.dto.Frame; + +/** + * The {@link TeleinfoControllerHandlerListener} interface defines all events pushed by a + * {@link TeleinfoAbstractControllerHandler}. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public interface TeleinfoControllerHandlerListener { + + void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, final Frame frame); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoElectricityMeterConfiguration.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoElectricityMeterConfiguration.java new file mode 100644 index 0000000000000..0dc741e5be61a --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoElectricityMeterConfiguration.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link TeleinfoElectricityMeterConfiguration} class stores electricity meter thing configuration + * + * @author Olivier MARCEAU - Initial contribution + */ +@NonNullByDefault +public class TeleinfoElectricityMeterConfiguration { + + private String adco = ""; + + public String getAdco() { + return adco; + } + + public void setAdco(String adco) { + this.adco = adco; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoThingHandlerFactory.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoThingHandlerFactory.java new file mode 100644 index 0000000000000..d0b75199dcaff --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoThingHandlerFactory.java @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.core.thing.Bridge; +import org.eclipse.smarthome.core.thing.Thing; +import org.eclipse.smarthome.core.thing.ThingTypeUID; +import org.eclipse.smarthome.core.thing.binding.BaseThingHandlerFactory; +import org.eclipse.smarthome.core.thing.binding.ThingHandler; +import org.eclipse.smarthome.core.thing.binding.ThingHandlerFactory; +import org.eclipse.smarthome.io.transport.serial.SerialPortManager; +import org.openhab.binding.teleinfo.internal.handler.cbemm.TeleinfoBaseCbemmElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.TeleinfoEjpCbemmElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.TeleinfoHcCbemmElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.TeleinfoTempoCbemmElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc.TeleinfoBaseCbemmEvoIccElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc.TeleinfoEjpCbemmEvoIccElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc.TeleinfoHcCbemmEvoIccElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc.TeleinfoTempoCbemmEvoIccElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbetm.TeleinfoBaseCbetmLongElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbetm.TeleinfoEjpCbetmLongElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbetm.TeleinfoHcCbetmLongElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.handler.cbetm.TeleinfoTempoCbetmLongElectricityMeterHandler; +import org.openhab.binding.teleinfo.internal.serial.TeleinfoSerialControllerHandler; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * The {@link TeleinfoThingHandlerFactory} is responsible for creating things and thing + * handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +@Component(configurationPid = "binding.teleinfo", service = ThingHandlerFactory.class) +public class TeleinfoThingHandlerFactory extends BaseThingHandlerFactory { + + private static final Set SUPPORTED_THING_TYPES_UIDS = Stream.of(THING_TYPE_SERIAL_CONTROLLER, + THING_HC_CBEMM_ELECTRICITY_METER_TYPE_UID, THING_BASE_CBEMM_ELECTRICITY_METER_TYPE_UID, + THING_TEMPO_CBEMM_ELECTRICITY_METER_TYPE_UID, THING_EJP_CBEMM_ELECTRICITY_METER_TYPE_UID, + THING_HC_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, THING_BASE_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, + THING_TEMPO_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, THING_EJP_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID, + THING_HC_CBETM_ELECTRICITY_METER_TYPE_UID, THING_BASE_CBETM_ELECTRICITY_METER_TYPE_UID, + THING_TEMPO_CBETM_ELECTRICITY_METER_TYPE_UID, THING_EJP_CBETM_ELECTRICITY_METER_TYPE_UID) + .collect(Collectors.toSet()); + + private final SerialPortManager serialPortManager; + + @Activate + public TeleinfoThingHandlerFactory(@Reference SerialPortManager serialPortManager) { + this.serialPortManager = serialPortManager; + } + + @Override + public boolean supportsThingType(ThingTypeUID thingTypeUID) { + return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID); + } + + @Override + protected @Nullable ThingHandler createHandler(Thing thing) { + ThingTypeUID thingTypeUID = thing.getThingTypeUID(); + + if (THING_TYPE_SERIAL_CONTROLLER.equals(thingTypeUID)) { + return new TeleinfoSerialControllerHandler((Bridge) thing, serialPortManager); + } + + if (THING_BASE_CBEMM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoBaseCbemmElectricityMeterHandler(thing); + } else if (THING_HC_CBEMM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoHcCbemmElectricityMeterHandler(thing); + } else if (THING_TEMPO_CBEMM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoTempoCbemmElectricityMeterHandler(thing); + } else if (THING_EJP_CBEMM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoEjpCbemmElectricityMeterHandler(thing); + } else if (THING_BASE_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoBaseCbemmEvoIccElectricityMeterHandler(thing); + } else if (THING_HC_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoHcCbemmEvoIccElectricityMeterHandler(thing); + } else if (THING_TEMPO_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoTempoCbemmEvoIccElectricityMeterHandler(thing); + } else if (THING_EJP_CBEMM_EVO_ICC_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoEjpCbemmEvoIccElectricityMeterHandler(thing); + } else if (THING_BASE_CBETM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoBaseCbetmLongElectricityMeterHandler(thing); + } else if (THING_HC_CBETM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoHcCbetmLongElectricityMeterHandler(thing); + } else if (THING_TEMPO_CBETM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoTempoCbetmLongElectricityMeterHandler(thing); + } else if (THING_EJP_CBETM_ELECTRICITY_METER_TYPE_UID.equals(thing.getThingTypeUID())) { + return new TeleinfoEjpCbetmLongElectricityMeterHandler(thing); + } else { + throw new IllegalStateException("Teleinfo frame type not supported: " + thing.getThingTypeUID()); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoAbstractCbemmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoAbstractCbemmElectricityMeterHandler.java new file mode 100644 index 0000000000000..790ebd8e2b0bb --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoAbstractCbemmElectricityMeterHandler.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.library.types.DateTimeType; +import org.eclipse.smarthome.core.library.types.QuantityType; +import org.eclipse.smarthome.core.library.types.StringType; +import org.eclipse.smarthome.core.library.unit.SmartHomeUnits; +import org.eclipse.smarthome.core.thing.Thing; +import org.eclipse.smarthome.core.types.UnDefType; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemm; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractElectricityMeterHandler; + +/** + * The {@link TeleinfoAbstractCbemmElectricityMeterHandler} class defines a skeleton for CBEMM Electricity Meters + * handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoAbstractCbemmElectricityMeterHandler extends TeleinfoAbstractElectricityMeterHandler { + + public TeleinfoAbstractCbemmElectricityMeterHandler(Thing thing) { + super(thing); + } + + protected void updateStatesForCommonCbemmChannels(FrameCbemm frame) { + // update common channels + updateState(CHANNEL_CBEMM_ISOUSC, QuantityType.valueOf(frame.getIsousc(), SmartHomeUnits.AMPERE)); + updateState(CHANNEL_CBEMM_PTEC, new StringType(frame.getPtec().name())); + if (frame.getImax() == null) { + updateState(CHANNEL_CBEMM_IMAX, UnDefType.NULL); + } else { + updateState(CHANNEL_CBEMM_IMAX, QuantityType.valueOf(frame.getImax(), SmartHomeUnits.AMPERE)); + } + + if (frame.getAdps() == null) { + updateState(CHANNEL_CBEMM_ADPS, UnDefType.NULL); + } else { + updateState(CHANNEL_CBEMM_ADPS, QuantityType.valueOf(frame.getAdps(), SmartHomeUnits.AMPERE)); + } + updateState(CHANNEL_CBEMM_IINST, QuantityType.valueOf(frame.getIinst(), SmartHomeUnits.AMPERE)); + + updateState(CHANNEL_LAST_UPDATE, new DateTimeType()); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoBaseCbemmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoBaseCbemmElectricityMeterHandler.java new file mode 100644 index 0000000000000..5b3af50de0af3 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoBaseCbemmElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmBaseOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoBaseCbemmElectricityMeterHandler} class defines a handler for a BASE CBEMM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoBaseCbemmElectricityMeterHandler extends TeleinfoAbstractCbemmElectricityMeterHandler { + + public TeleinfoBaseCbemmElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmBaseOption frameCbemmBaseOption = (FrameCbemmBaseOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmBaseOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmChannels(frameCbemmBaseOption); + updateStatesForBaseFrameOption(frameCbemmBaseOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoEjpCbemmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoEjpCbemmElectricityMeterHandler.java new file mode 100644 index 0000000000000..86f0a91a861a0 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoEjpCbemmElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmEjpOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoEjpCbemmElectricityMeterHandler} class defines a handler for a EJB CBEMM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoEjpCbemmElectricityMeterHandler extends TeleinfoAbstractCbemmElectricityMeterHandler { + + public TeleinfoEjpCbemmElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmEjpOption frameCbemmEjpOption = (FrameCbemmEjpOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmEjpOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmChannels(frameCbemmEjpOption); + updateStatesForEjpFrameOption(frameCbemmEjpOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoHcCbemmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoHcCbemmElectricityMeterHandler.java new file mode 100644 index 0000000000000..c148e9a8e8f77 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoHcCbemmElectricityMeterHandler.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmHcOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoHcCbemmElectricityMeterHandler} class defines a handler for a HC CBEMM Electricity Meters thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoHcCbemmElectricityMeterHandler extends TeleinfoAbstractCbemmElectricityMeterHandler { + + public TeleinfoHcCbemmElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmHcOption frameCbemmHcOption = (FrameCbemmHcOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmHcOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmChannels(frameCbemmHcOption); + updateStatesForHcFrameOption(frameCbemmHcOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoTempoCbemmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoTempoCbemmElectricityMeterHandler.java new file mode 100644 index 0000000000000..093486a592158 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/TeleinfoTempoCbemmElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmTempoOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoTempoCbemmElectricityMeterHandler} class defines a handler for a TEMPO CBEMM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoTempoCbemmElectricityMeterHandler extends TeleinfoAbstractCbemmElectricityMeterHandler { + + public TeleinfoTempoCbemmElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmTempoOption frameCbemmTempoOption = (FrameCbemmTempoOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmTempoOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmChannels(frameCbemmTempoOption); + updateStatesForTempoFrameOption(frameCbemmTempoOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoAbstractCbemmEvoIccElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoAbstractCbemmEvoIccElectricityMeterHandler.java new file mode 100644 index 0000000000000..25d04b08176be --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoAbstractCbemmEvoIccElectricityMeterHandler.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.CHANNEL_CBEMM_EVOLUTION_ICC_PAPP; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.library.types.QuantityType; +import org.eclipse.smarthome.core.library.unit.SmartHomeUnits; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIcc; +import org.openhab.binding.teleinfo.internal.handler.cbemm.TeleinfoAbstractCbemmElectricityMeterHandler; + +/** + * The {@link TeleinfoAbstractCbemmEvoIccElectricityMeterHandler} class defines a skeleton for CBEMM Evolution ICC + * Electricity Meters + * handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoAbstractCbemmEvoIccElectricityMeterHandler + extends TeleinfoAbstractCbemmElectricityMeterHandler { + + public TeleinfoAbstractCbemmEvoIccElectricityMeterHandler(Thing thing) { + super(thing); + } + + protected void updateStatesForCommonCbemmEvolutionIccChannels(FrameCbemmEvolutionIcc frame) { + updateStatesForCommonCbemmChannels(frame); + updateState(CHANNEL_CBEMM_EVOLUTION_ICC_PAPP, QuantityType.valueOf(frame.getPapp(), SmartHomeUnits.WATT)); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoBaseCbemmEvoIccElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoBaseCbemmEvoIccElectricityMeterHandler.java new file mode 100644 index 0000000000000..dc6a65610429d --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoBaseCbemmEvoIccElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccBaseOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoBaseCbemmEvoIccElectricityMeterHandler} class defines a handler for a BASE CBEMM Evolution ICC + * Electricity Meters thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoBaseCbemmEvoIccElectricityMeterHandler extends TeleinfoAbstractCbemmEvoIccElectricityMeterHandler { + + public TeleinfoBaseCbemmEvoIccElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmEvolutionIccBaseOption frameCbemmEvoIccBaseOption = (FrameCbemmEvolutionIccBaseOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmEvoIccBaseOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmEvolutionIccChannels(frameCbemmEvoIccBaseOption); + updateStatesForBaseFrameOption(frameCbemmEvoIccBaseOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoEjpCbemmEvoIccElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoEjpCbemmEvoIccElectricityMeterHandler.java new file mode 100644 index 0000000000000..1f24418dded73 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoEjpCbemmEvoIccElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccEjpOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoEjpCbemmEvoIccElectricityMeterHandler} class defines a handler for a EJP CBEMM Evolution ICC + * Electricity Meters thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoEjpCbemmEvoIccElectricityMeterHandler extends TeleinfoAbstractCbemmEvoIccElectricityMeterHandler { + + public TeleinfoEjpCbemmEvoIccElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmEvolutionIccEjpOption frameCbemmEvoIccEjpOption = (FrameCbemmEvolutionIccEjpOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmEvoIccEjpOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmEvolutionIccChannels(frameCbemmEvoIccEjpOption); + updateStatesForEjpFrameOption(frameCbemmEvoIccEjpOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoHcCbemmEvoIccElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoHcCbemmEvoIccElectricityMeterHandler.java new file mode 100644 index 0000000000000..e362969fa15ff --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoHcCbemmEvoIccElectricityMeterHandler.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccHcOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoHcCbemmEvoIccElectricityMeterHandler} class defines a handler for a HC CBEMM Evolution ICC + * Electricity Meters thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoHcCbemmEvoIccElectricityMeterHandler extends TeleinfoAbstractCbemmEvoIccElectricityMeterHandler { + + public TeleinfoHcCbemmEvoIccElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmEvolutionIccHcOption frameCbemmEvoIccHcOption = (FrameCbemmEvolutionIccHcOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmEvoIccHcOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmEvolutionIccChannels(frameCbemmEvoIccHcOption); + updateStatesForHcFrameOption(frameCbemmEvoIccHcOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoTempoCbemmEvoIccElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoTempoCbemmEvoIccElectricityMeterHandler.java new file mode 100644 index 0000000000000..9bff39aaec5e6 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbemm/evoicc/TeleinfoTempoCbemmEvoIccElectricityMeterHandler.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbemm.evoicc; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccTempoOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoTempoCbemmEvoIccElectricityMeterHandler} class defines a handler for a TEMPO CBEMM Evolution ICC + * Electricity Meters thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoTempoCbemmEvoIccElectricityMeterHandler + extends TeleinfoAbstractCbemmEvoIccElectricityMeterHandler { + + public TeleinfoTempoCbemmEvoIccElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbemmEvolutionIccTempoOption frameCbemmEvoIccTempoOption = (FrameCbemmEvolutionIccTempoOption) frame; + + String adco = configuration.getAdco(); + if (frameCbemmEvoIccTempoOption.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbemmEvolutionIccChannels(frameCbemmEvoIccTempoOption); + updateStatesForTempoFrameOption(frameCbemmEvoIccTempoOption); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoAbstractCbetmElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoAbstractCbetmElectricityMeterHandler.java new file mode 100644 index 0000000000000..112e69fd02dfd --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoAbstractCbetmElectricityMeterHandler.java @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbetm; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.library.types.DateTimeType; +import org.eclipse.smarthome.core.library.types.QuantityType; +import org.eclipse.smarthome.core.library.types.StringType; +import org.eclipse.smarthome.core.library.unit.SmartHomeUnits; +import org.eclipse.smarthome.core.thing.Thing; +import org.eclipse.smarthome.core.types.UnDefType; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetm; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLong; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmShort; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractElectricityMeterHandler; + +/** + * The {@link TeleinfoAbstractCbetmElectricityMeterHandler} class defines a skeleton for CBETM Electricity Meters + * handlers. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoAbstractCbetmElectricityMeterHandler extends TeleinfoAbstractElectricityMeterHandler { + + public TeleinfoAbstractCbetmElectricityMeterHandler(Thing thing) { + super(thing); + } + + protected void updateStatesForCommonCbetmChannels(FrameCbetm frameCbetm) { + updateState(CHANNEL_CBETM_IINST1, QuantityType.valueOf(frameCbetm.getIinst1(), SmartHomeUnits.AMPERE)); + updateState(CHANNEL_CBETM_IINST2, QuantityType.valueOf(frameCbetm.getIinst2(), SmartHomeUnits.AMPERE)); + updateState(CHANNEL_CBETM_IINST3, QuantityType.valueOf(frameCbetm.getIinst3(), SmartHomeUnits.AMPERE)); + + if (frameCbetm instanceof FrameCbetmLong) { + FrameCbetmLong frameCbetmLong = (FrameCbetmLong) frameCbetm; + + updateState(CHANNEL_CBETM_FRAME_TYPE, new StringType("LONG")); + + updateState(CHANNEL_CBETM_LONG_ISOUSC, + QuantityType.valueOf(frameCbetmLong.getIsousc(), SmartHomeUnits.AMPERE)); + updateState(CHANNEL_CBETM_LONG_PTEC, new StringType(frameCbetmLong.getPtec().name())); + if (frameCbetmLong.getImax1() == null) { + updateState(CHANNEL_CBETM_LONG_IMAX1, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_LONG_IMAX1, + QuantityType.valueOf(frameCbetmLong.getImax1(), SmartHomeUnits.AMPERE)); + } + if (frameCbetmLong.getImax2() == null) { + updateState(CHANNEL_CBETM_LONG_IMAX2, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_LONG_IMAX2, + QuantityType.valueOf(frameCbetmLong.getImax2(), SmartHomeUnits.AMPERE)); + } + if (frameCbetmLong.getImax3() == null) { + updateState(CHANNEL_CBETM_LONG_IMAX3, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_LONG_IMAX3, + QuantityType.valueOf(frameCbetmLong.getImax3(), SmartHomeUnits.AMPERE)); + } + + updateState(CHANNEL_CBETM_LONG_PMAX, QuantityType.valueOf(frameCbetmLong.getPmax(), SmartHomeUnits.WATT)); + updateState(CHANNEL_CBETM_LONG_PAPP, QuantityType.valueOf(frameCbetmLong.getPapp(), SmartHomeUnits.WATT)); + updateState(CHANNEL_CBETM_LONG_PPOT, new StringType(frameCbetmLong.getPpot())); + + updateState(CHANNEL_CBETM_SHORT_ADIR1, UnDefType.NULL); + updateState(CHANNEL_CBETM_SHORT_ADIR2, UnDefType.NULL); + updateState(CHANNEL_CBETM_SHORT_ADIR3, UnDefType.NULL); + } else { // FrameCbetmShort + FrameCbetmShort frameCbetmShort = (FrameCbetmShort) frameCbetm; + + updateState(CHANNEL_CBETM_FRAME_TYPE, new StringType("SHORT")); + + if (frameCbetmShort.getAdir1() == null) { + updateState(CHANNEL_CBETM_SHORT_ADIR1, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_SHORT_ADIR1, + QuantityType.valueOf(frameCbetmShort.getAdir1(), SmartHomeUnits.AMPERE)); + } + + if (frameCbetmShort.getAdir2() == null) { + updateState(CHANNEL_CBETM_SHORT_ADIR2, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_SHORT_ADIR2, + QuantityType.valueOf(frameCbetmShort.getAdir2(), SmartHomeUnits.AMPERE)); + } + + if (frameCbetmShort.getAdir3() == null) { + updateState(CHANNEL_CBETM_SHORT_ADIR3, UnDefType.NULL); + } else { + updateState(CHANNEL_CBETM_SHORT_ADIR3, + QuantityType.valueOf(frameCbetmShort.getAdir3(), SmartHomeUnits.AMPERE)); + } + + updateState(CHANNEL_CBETM_LONG_ISOUSC, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_PTEC, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_IMAX1, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_IMAX2, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_IMAX3, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_PMAX, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_PAPP, UnDefType.NULL); + updateState(CHANNEL_CBETM_LONG_PPOT, UnDefType.NULL); + } + + updateState(CHANNEL_LAST_UPDATE, new DateTimeType()); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoBaseCbetmLongElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoBaseCbetmLongElectricityMeterHandler.java new file mode 100644 index 0000000000000..efe73922e2199 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoBaseCbetmLongElectricityMeterHandler.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbetm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetm; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongBaseOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoBaseCbetmLongElectricityMeterHandler} class defines a handler for a BASE CBETM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoBaseCbetmLongElectricityMeterHandler extends TeleinfoAbstractCbetmElectricityMeterHandler { + + public TeleinfoBaseCbetmLongElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbetm frameCbetm = (FrameCbetm) frame; + + String adco = configuration.getAdco(); + if (frameCbetm.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbetmChannels(frameCbetm); + if (frameCbetm instanceof FrameCbetmLongBaseOption) { + updateStatesForBaseFrameOption((FrameCbetmLongBaseOption) frameCbetm); + } + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoEjpCbetmLongElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoEjpCbetmLongElectricityMeterHandler.java new file mode 100644 index 0000000000000..29ac006768d20 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoEjpCbetmLongElectricityMeterHandler.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbetm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetm; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongEjpOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoEjpCbetmLongElectricityMeterHandler} class defines a handler for a EJP CBETM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoEjpCbetmLongElectricityMeterHandler extends TeleinfoAbstractCbetmElectricityMeterHandler { + + public TeleinfoEjpCbetmLongElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbetm frameCbetm = (FrameCbetm) frame; + + String adco = configuration.getAdco(); + if (frameCbetm.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbetmChannels(frameCbetm); + if (frameCbetm instanceof FrameCbetmLongEjpOption) { + updateStatesForEjpFrameOption((FrameCbetmLongEjpOption) frameCbetm); + } + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoHcCbetmLongElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoHcCbetmLongElectricityMeterHandler.java new file mode 100644 index 0000000000000..84731b593ea07 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoHcCbetmLongElectricityMeterHandler.java @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbetm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetm; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongHcOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoHcCbetmLongElectricityMeterHandler} class defines a handler for a HC CBETM Electricity Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoHcCbetmLongElectricityMeterHandler extends TeleinfoAbstractCbetmElectricityMeterHandler { + + public TeleinfoHcCbetmLongElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbetm frameCbetm = (FrameCbetm) frame; + + String adco = configuration.getAdco(); + if (frameCbetm.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbetmChannels(frameCbetm); + + if (frameCbetm instanceof FrameCbetmLongHcOption) { + updateStatesForHcFrameOption((FrameCbetmLongHcOption) frameCbetm); + } + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoTempoCbetmLongElectricityMeterHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoTempoCbetmLongElectricityMeterHandler.java new file mode 100644 index 0000000000000..b574f88e9e293 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/cbetm/TeleinfoTempoCbetmLongElectricityMeterHandler.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.handler.cbetm; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.smarthome.core.thing.Thing; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetm; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongTempoOption; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; + +/** + * The {@link TeleinfoTempoCbetmLongElectricityMeterHandler} class defines a handler for a TEMPO CBETM Electricity + * Meters + * thing. + * + * @author Nicolas SIBERIL - Initial contribution + * @author Olivier MARCEAU - Change ADCO property to parameter + */ +@NonNullByDefault +public class TeleinfoTempoCbetmLongElectricityMeterHandler extends TeleinfoAbstractCbetmElectricityMeterHandler { + + public TeleinfoTempoCbetmLongElectricityMeterHandler(Thing thing) { + super(thing); + } + + @Override + public void onFrameReceived(TeleinfoAbstractControllerHandler controllerHandler, Frame frame) { + final FrameCbetm frameCbetm = (FrameCbetm) frame; + + String adco = configuration.getAdco(); + if (frameCbetm.getAdco().equalsIgnoreCase(adco)) { + updateStatesForCommonCbetmChannels(frameCbetm); + + if (frameCbetm instanceof FrameCbetmLongTempoOption) { + updateStatesForTempoFrameOption((FrameCbetmLongTempoOption) frameCbetm); + } + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReader.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReader.java new file mode 100644 index 0000000000000..7c39c04bc37b7 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReader.java @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader; + +import java.io.Closeable; +import java.io.IOException; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link TeleinfoReader} interface defines a mechanism to read Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public interface TeleinfoReader extends Closeable { + + void open() throws IOException; + + void addListener(final TeleinfoReaderListener listener); + + void removeListener(final TeleinfoReaderListener listener); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderAdaptor.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderAdaptor.java new file mode 100644 index 0000000000000..2524c36042b83 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderAdaptor.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.teleinfo.internal.dto.Frame; + +/** + * The {@link TeleinfoReaderAdaptor} class defines an adaptor at {@link TeleinfoReader} interface. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public abstract class TeleinfoReaderAdaptor implements TeleinfoReader { + + private List listeners = new ArrayList<>(); + + @Override + public void addListener(final TeleinfoReaderListener listener) { + listeners.add(listener); + } + + @Override + public void removeListener(final TeleinfoReaderListener listener) { + listeners.remove(listener); + } + + protected void fireOnFrameReceivedEvent(final Frame frame) { + for (TeleinfoReaderListener listener : listeners) { + listener.onFrameReceived(this, frame); + } + } + + protected void fireOnOpeningEvent() { + for (TeleinfoReaderListener listener : listeners) { + listener.onOpening(this); + } + } + + protected void fireOnOpenedEvent() { + for (TeleinfoReaderListener listener : listeners) { + listener.onOpened(this); + } + } + + protected void fireOnClosingEvent() { + for (TeleinfoReaderListener listener : listeners) { + listener.onClosing(this); + } + } + + protected void fireOnClosedEvent() { + for (TeleinfoReaderListener listener : listeners) { + listener.onClosed(this); + } + } + + public List getListeners() { + return Collections.unmodifiableList(listeners); + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderListener.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderListener.java new file mode 100644 index 0000000000000..177cead0a0807 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/TeleinfoReaderListener.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.teleinfo.internal.dto.Frame; + +/** + * The {@link TeleinfoReaderListener} interface defines all events pushed by a {@link TeleinfoReader}. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public interface TeleinfoReaderListener { + + default void onFrameReceived(final TeleinfoReader reader, final Frame frame) { + // NOP + } + + default void onOpening(final TeleinfoReader reader) { + // NOP + } + + default void onOpened(final TeleinfoReader reader) { + // NOP + } + + default void onClosing(final TeleinfoReader reader) { + // NOP + } + + default void onClosed(final TeleinfoReader reader) { + // NOP + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStream.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStream.java new file mode 100644 index 0000000000000..417157fdaab1b --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStream.java @@ -0,0 +1,690 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemm; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.FrameCbemmTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIcc; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLong; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongEjpOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmShort; +import org.openhab.binding.teleinfo.internal.dto.common.FrameBaseOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameEjpOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameHcOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.CouleurDemain; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.ProgrammeCircuit1; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.ProgrammeCircuit2; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.FrameUtil; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.InvalidFrameException; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.Label; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.Converter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.CouleurDemainConverter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.FloatConverter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.HhphcConverter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.IntegerConverter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.PtecConverter; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.converter.StringConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * InputStream for Teleinfo {@link Frame} in serial port format. + */ +/** + * The {@link TeleinfoInputStream} class is an {@link InputStream} to decode/read Teleinfo frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoInputStream extends InputStream { + + public static final long DEFAULT_TIMEOUT_NEXT_HEADER_FRAME_US = 33400; + public static final long DEFAULT_TIMEOUT_READING_FRAME_US = 33400; + + private final Logger logger = LoggerFactory.getLogger(TeleinfoInputStream.class); + private static final Map, Converter> LABEL_VALUE_CONVERTERS; + + private BufferedReader bufferedReader; + private @Nullable String groupLine; + private ExecutorService executorService; + private long waitNextHeaderFrameTimeoutInUs; + private long readingFrameTimeoutInUs; + private boolean autoRepairInvalidADPSgroupLine; + private boolean useOwnScheduler; + + static { + LABEL_VALUE_CONVERTERS = new HashMap<>(); + LABEL_VALUE_CONVERTERS.put(Integer.class, new IntegerConverter()); + LABEL_VALUE_CONVERTERS.put(String.class, new StringConverter()); + LABEL_VALUE_CONVERTERS.put(Float.class, new FloatConverter()); + LABEL_VALUE_CONVERTERS.put(Ptec.class, new PtecConverter()); + LABEL_VALUE_CONVERTERS.put(Hhphc.class, new HhphcConverter()); + LABEL_VALUE_CONVERTERS.put(CouleurDemain.class, new CouleurDemainConverter()); + } + + public TeleinfoInputStream(final InputStream teleinfoInputStream) { + this(teleinfoInputStream, DEFAULT_TIMEOUT_NEXT_HEADER_FRAME_US, DEFAULT_TIMEOUT_READING_FRAME_US, false); + } + + public TeleinfoInputStream(final InputStream teleinfoInputStream, boolean autoRepairInvalidADPSgroupLine) { + this(teleinfoInputStream, DEFAULT_TIMEOUT_NEXT_HEADER_FRAME_US, DEFAULT_TIMEOUT_READING_FRAME_US, + autoRepairInvalidADPSgroupLine); + } + + public TeleinfoInputStream(final @Nullable InputStream teleinfoInputStream, long waitNextHeaderFrameTimeoutInUs, + long readingFrameTimeoutInUs, boolean autoRepairInvalidADPSgroupLine) { + this(teleinfoInputStream, waitNextHeaderFrameTimeoutInUs, readingFrameTimeoutInUs, + autoRepairInvalidADPSgroupLine, null); + } + + public TeleinfoInputStream(final @Nullable InputStream teleinfoInputStream, long waitNextHeaderFrameTimeoutInUs, + long readingFrameTimeoutInUs, boolean autoRepairInvalidADPSgroupLine, + @Nullable ExecutorService executorService) { + if (teleinfoInputStream == null) { + throw new IllegalArgumentException("Teleinfo inputStream is null"); + } + + this.waitNextHeaderFrameTimeoutInUs = waitNextHeaderFrameTimeoutInUs; + this.readingFrameTimeoutInUs = readingFrameTimeoutInUs; + this.autoRepairInvalidADPSgroupLine = autoRepairInvalidADPSgroupLine; + if (executorService == null) { + this.executorService = Executors.newFixedThreadPool(2); + this.useOwnScheduler = true; + } else { + this.executorService = executorService; + this.useOwnScheduler = false; + } + + this.bufferedReader = new BufferedReader(new InputStreamReader(teleinfoInputStream, StandardCharsets.US_ASCII)); + + groupLine = null; + } + + @Override + public void close() throws IOException { + logger.debug("close() [start]"); + bufferedReader.close(); + if (useOwnScheduler) { + executorService.shutdownNow(); + } + super.close(); + logger.debug("close() [end]"); + } + + /** + * Returns the next frame. + * + * @return the next frame or null if end of stream + * @throws TimeoutException + * @throws IOException + * @throws InvalidFrameException + * @throws Exception + */ + public synchronized @Nullable Frame readNextFrame() throws TimeoutException, InvalidFrameException, IOException { + // seek the next header frame + Future<@Nullable Void> seekNextHeaderFrameTask = executorService.submit(() -> { + while (!isHeaderFrame(groupLine)) { + groupLine = bufferedReader.readLine(); + if (logger.isTraceEnabled()) { + logger.trace("groupLine = {}", groupLine); + } + if (groupLine == null) { // end of stream + logger.trace("end of stream reached !"); + return null; + } + } + + logger.trace("header frame found !"); + return null; + }); + try { + logger.debug("seeking the next header frame..."); + logger.trace("waitNextHeaderFrameTimeoutInUs = {}", waitNextHeaderFrameTimeoutInUs); + seekNextHeaderFrameTask.get(waitNextHeaderFrameTimeoutInUs, TimeUnit.MICROSECONDS); + + if (groupLine == null) { // end of stream + return null; + } + } catch (InterruptedException e) { + logger.debug("Got interrupted exception", e); + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + rethrowTaskExecutionException(e); + } + + Future> nextFrameFuture = executorService.submit(new Callable>() { + @Override + public Map call() throws Exception { + // read label values + Map frameValues = new HashMap<>(); + while ((groupLine = bufferedReader.readLine()) != null && !isHeaderFrame(groupLine)) { + logger.trace("groupLine = {}", groupLine); + String groupLineRef = groupLine; + if (groupLineRef != null) { + String[] groupLineTokens = groupLineRef.split("\\s"); + if (groupLineTokens.length != 2 && groupLineTokens.length != 3) { + final String error = String.format("The groupLine '%1$s' is incomplete", groupLineRef); + throw new InvalidFrameException(error); + } + String labelStr = groupLineTokens[0]; + String valueString = groupLineTokens[1]; + + // verify integrity (through checksum) + char checksum = (groupLineTokens.length == 3 ? groupLineTokens[2].charAt(0) : ' '); + char computedChecksum = FrameUtil.computeGroupLineChecksum(labelStr, valueString); + if (computedChecksum != checksum) { + logger.trace("computedChecksum = {}", computedChecksum); + logger.trace("checksum = {}", checksum); + final String error = String.format( + "The groupLine '%s' is corrupted (integrity not checked). Actual checksum: '%s' / Expected checksum: '%s'", + groupLineRef, checksum, computedChecksum); + throw new InvalidFrameException(error); + } + + Label label; + try { + label = Label.valueOf(labelStr); + } catch (IllegalArgumentException e) { + if (autoRepairInvalidADPSgroupLine && labelStr.startsWith(Label.ADPS.name())) { + // in this hardware issue, label variable is composed by label name and value. E.g: + // ADPS032 + logger.warn("Try to auto repair malformed ADPS groupLine '{}'", labelStr); + label = Label.ADPS; + valueString = labelStr.substring(Label.ADPS.name().length()); + } else { + final String error = String.format("The label '%s' is unknown", labelStr); + throw new InvalidFrameException(error); + } + } + + Class labelType = label.getType(); + Converter converter = LABEL_VALUE_CONVERTERS.get(labelType); + try { + Object value = converter.convert(valueString); + if (value != null) { + frameValues.put(label, value); + } + } catch (ConversionException e) { + final String error = String.format("An error occurred during '%s' value conversion", + valueString); + throw new InvalidFrameException(error, e); + } + } + } + + return frameValues; + } + }); + + try { + logger.debug("reading data frame..."); + logger.trace("readingFrameTimeoutInUs = {}", readingFrameTimeoutInUs); + Map frameValues = nextFrameFuture.get(readingFrameTimeoutInUs, TimeUnit.MICROSECONDS); + + // build the frame from map values + final Frame frame = buildFrame(frameValues); + frame.setTimestamp(LocalDate.now()); + frame.setId(UUID.randomUUID()); + + return frame; + } catch (InterruptedException e) { + logger.debug("Got interrupted exception", e); + Thread.currentThread().interrupt(); + throw new IllegalStateException(e); + } catch (ExecutionException e) { + rethrowTaskExecutionException(e); + } + return null; + } + + public long getWaitNextHeaderFrameTimeoutInUs() { + return waitNextHeaderFrameTimeoutInUs; + } + + public void setWaitNextHeaderFrameTimeoutInUs(long waitNextHeaderFrameTimeoutInUs) { + this.waitNextHeaderFrameTimeoutInUs = waitNextHeaderFrameTimeoutInUs; + } + + public long getReadingFrameTimeoutInUs() { + return readingFrameTimeoutInUs; + } + + public void setReadingFrameTimeoutInUs(long readingFrameTimeoutInUs) { + this.readingFrameTimeoutInUs = readingFrameTimeoutInUs; + } + + public boolean isAutoRepairInvalidADPSgroupLine() { + return autoRepairInvalidADPSgroupLine; + } + + public void setAutoRepairInvalidADPSgroupLine(boolean autoRepairInvalidADPSgroupLine) { + this.autoRepairInvalidADPSgroupLine = autoRepairInvalidADPSgroupLine; + } + + @Override + public int read() throws IOException { + throw new UnsupportedOperationException("The 'read()' is not supported"); + } + + private boolean isHeaderFrame(final @Nullable String line) { + // A new teleinfo trame begin with '3' and '2' bytes (END OF TEXT et START OF TEXT) + return (line != null && line.length() > 1 && line.codePointAt(0) == 3 && line.codePointAt(1) == 2); + } + + private Frame buildFrame(final Map frameValues) throws InvalidFrameException { + if (frameValues.containsKey(Label.IINST1)) { + if (frameValues.containsKey(Label.IMAX1)) { + return buildFrameCbetmLong(frameValues); + } else { + return buildFrameCbetmShort(frameValues); + } + } else if (frameValues.containsKey(Label.PAPP)) { + return buildFrameCbemmEvolutionIcc(frameValues); + } else { + return buildFrameCbemm(frameValues); + } + } + + private FrameCbetmLong buildFrameCbetmLong(final Map frameValues) throws InvalidFrameException { + logger.trace("buildFrameCbetmLong(Map) [start]"); + final FrameCbetmLong frameCbetm; + String optionTarif = getRequiredLabelValue(Label.OPTARIF, frameValues); + if ("BASE".equals(optionTarif)) { + frameCbetm = buildFrameCbetmLongBaseOption(frameValues); + } else if ("HC..".equals(optionTarif)) { + frameCbetm = buildFrameCbetmLongHcOption(frameValues); + } else if ("EJP.".equals(optionTarif)) { + frameCbetm = buildFrameCbetmLongEjpOption(frameValues); + } else if (optionTarif.startsWith("BBR") && optionTarif.length() == 4) { + ProgrammeCircuit1 prgCircuit1 = convertProgrammeCircuit1(optionTarif.charAt(3)); + ProgrammeCircuit2 prgCircuit2 = convertProgrammeCircuit2(optionTarif.charAt(3)); + frameCbetm = buildFrameCbetmLongTempoOption(frameValues, prgCircuit1, prgCircuit2); + } else { + final String error = String.format("The option Tarif '%s' is not supported", optionTarif); + throw new InvalidFrameException(error); + } + logger.trace("buildFrameCbetmLong(Map) [end]"); + return frameCbetm; + } + + private void setCbetmCommonFrameFields(final FrameCbetmLong frame, final Map frameValues) + throws InvalidFrameException { + logger.trace("setCbetmCommonFrameFields(Frame, Map) [start]"); + frame.setAdco(getRequiredLabelValue(Label.ADCO, frameValues)); + frame.setIsousc(getRequiredLabelValue(Label.ISOUSC, frameValues)); + frame.setIinst1(getRequiredLabelValue(Label.IINST1, frameValues)); + frame.setIinst2(getRequiredLabelValue(Label.IINST2, frameValues)); + frame.setIinst3(getRequiredLabelValue(Label.IINST3, frameValues)); + frame.setImax1(getRequiredLabelValue(Label.IMAX1, frameValues)); + frame.setImax2(getRequiredLabelValue(Label.IMAX2, frameValues)); + frame.setImax3(getRequiredLabelValue(Label.IMAX3, frameValues)); + frame.setPtec(getRequiredLabelValue(Label.PTEC, frameValues)); + frame.setPmax(getRequiredLabelValue(Label.PMAX, frameValues)); + frame.setPapp(getRequiredLabelValue(Label.PAPP, frameValues)); + frame.setMotdetat(getRequiredLabelValue(Label.MOTDETAT, frameValues)); + frame.setPpot(getRequiredLabelValue(Label.PPOT, frameValues)); + logger.trace("setCbetmCommonFrameFields(Frame, Map) [end]"); + } + + private FrameCbetmLongBaseOption buildFrameCbetmLongBaseOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbetmBaseOption(Map) [start]"); + FrameCbetmLongBaseOption frame = new FrameCbetmLongBaseOption(); + setCbetmCommonFrameFields(frame, frameValues); + setFrameBaseOptionFields(frame, frameValues); + logger.trace("buildFrameCbetmBaseOption(Map) [end]"); + return frame; + } + + private FrameCbetmLongHcOption buildFrameCbetmLongHcOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbetmHcOption(Map) [start]"); + FrameCbetmLongHcOption frame = new FrameCbetmLongHcOption(); + setCbetmCommonFrameFields(frame, frameValues); + setFrameHcOptionFields(frame, frameValues); + logger.trace("buildFrameCbetmHcOption(Map) [end]"); + return frame; + } + + private FrameCbetmLongEjpOption buildFrameCbetmLongEjpOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbetmEjpOption(Map) [start]"); + FrameCbetmLongEjpOption frame = new FrameCbetmLongEjpOption(); + setCbetmCommonFrameFields(frame, frameValues); + setFrameEjpOptionFields(frame, frameValues); + logger.trace("buildFrameCbetmEjpOption(Map) [end]"); + return frame; + } + + private FrameCbetmLongTempoOption buildFrameCbetmLongTempoOption(final Map frameValues, + ProgrammeCircuit1 prgCircuit1, ProgrammeCircuit2 prgCircuit2) throws InvalidFrameException { + logger.trace("buildFrameCbetmTempoOption(Map) [start]"); + FrameCbetmLongTempoOption frame = new FrameCbetmLongTempoOption(); + setCbetmCommonFrameFields(frame, frameValues); + setFrameTempoOptionFields(frame, frameValues, prgCircuit1, prgCircuit2); + logger.trace("buildFrameCbetmTempoOption(Map) [end]"); + return frame; + } + + private FrameCbetmShort buildFrameCbetmShort(final Map frameValues) throws InvalidFrameException { + logger.trace("buildFrameCbetmShort(Map) [start]"); + FrameCbetmShort frame = new FrameCbetmShort(); + frame.setAdco(getRequiredLabelValue(Label.ADCO, frameValues)); + frame.setIinst1(getRequiredLabelValue(Label.IINST1, frameValues)); + frame.setIinst2(getRequiredLabelValue(Label.IINST2, frameValues)); + frame.setIinst3(getRequiredLabelValue(Label.IINST3, frameValues)); + frame.setAdir1(getOptionalLabelValue(Label.ADIR1, frameValues)); + frame.setAdir2(getOptionalLabelValue(Label.ADIR2, frameValues)); + frame.setAdir3(getOptionalLabelValue(Label.ADIR3, frameValues)); + logger.trace("buildFrameCbetmShort(Map) [end]"); + return frame; + } + + private FrameCbemm buildFrameCbemm(final Map frameValues) throws InvalidFrameException { + logger.trace("buildFrameCbemm(Map) [start]"); + final FrameCbemm frameCbemm; + String optionTarif = getRequiredLabelValue(Label.OPTARIF, frameValues); + if ("BASE".equals(optionTarif)) { + frameCbemm = buildFrameCbemmBaseOption(frameValues); + } else if ("HC..".equals(optionTarif)) { + frameCbemm = buildFrameCbemmHcOption(frameValues); + } else if ("EJP.".equals(optionTarif)) { + frameCbemm = buildFrameCbemmEjpOption(frameValues); + } else if (optionTarif.startsWith("BBR") && optionTarif.length() == 4) { + ProgrammeCircuit1 prgCircuit1 = convertProgrammeCircuit1(optionTarif.charAt(3)); + ProgrammeCircuit2 prgCircuit2 = convertProgrammeCircuit2(optionTarif.charAt(3)); + frameCbemm = buildFrameCbemmTempoOption(frameValues, prgCircuit1, prgCircuit2); + } else { + final String error = String.format("The option Tarif '%s' is not supported", optionTarif); + throw new InvalidFrameException(error); + } + logger.trace("buildFrameCbemm(Map) [end]"); + return frameCbemm; + } + + private void setCbemmCommonFrameFields(final FrameCbemm frame, final Map frameValues) + throws InvalidFrameException { + logger.trace("setCbemmCommonFrameFields(Frame, Map) [start]"); + frame.setAdco(getRequiredLabelValue(Label.ADCO, frameValues)); + frame.setIsousc(getRequiredLabelValue(Label.ISOUSC, frameValues)); + frame.setIinst(getRequiredLabelValue(Label.IINST, frameValues)); + frame.setImax(getOptionalLabelValue(Label.IMAX, frameValues)); + frame.setPtec(getRequiredLabelValue(Label.PTEC, frameValues)); + frame.setAdps(getOptionalLabelValue(Label.ADPS, frameValues)); + frame.setMotdetat(getRequiredLabelValue(Label.MOTDETAT, frameValues)); + logger.trace("setCbemmCommonFrameFields(Frame, Map) [end]"); + } + + private FrameCbemmBaseOption buildFrameCbemmBaseOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmBaseOption(Map) [start]"); + FrameCbemmBaseOption frame = new FrameCbemmBaseOption(); + setCbemmCommonFrameFields(frame, frameValues); + setFrameBaseOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmBaseOption(Map) [end]"); + return frame; + } + + private FrameCbemmHcOption buildFrameCbemmHcOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmHcOption(Map) [start]"); + FrameCbemmHcOption frame = new FrameCbemmHcOption(); + setCbemmCommonFrameFields(frame, frameValues); + setFrameHcOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmHcOption(Map) [end]"); + return frame; + } + + private FrameCbemmEjpOption buildFrameCbemmEjpOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEjpOption(Map) [start]"); + FrameCbemmEjpOption frame = new FrameCbemmEjpOption(); + setCbemmCommonFrameFields(frame, frameValues); + setFrameEjpOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmEjpOption(Map) [end]"); + return frame; + } + + private FrameCbemmTempoOption buildFrameCbemmTempoOption(final Map frameValues, + ProgrammeCircuit1 prgCircuit1, ProgrammeCircuit2 prgCircuit2) throws InvalidFrameException { + logger.trace("buildFrameCbemmTempoOption(Map) [start]"); + FrameCbemmTempoOption frame = new FrameCbemmTempoOption(); + setCbemmCommonFrameFields(frame, frameValues); + setFrameTempoOptionFields(frame, frameValues, prgCircuit1, prgCircuit2); + logger.trace("buildFrameCbemmTempoOption(Map) [end]"); + return frame; + } + + private FrameCbemmEvolutionIcc buildFrameCbemmEvolutionIcc(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEvolutionIcc(Map) [start]"); + final FrameCbemmEvolutionIcc frameCbemmEvoIcc; + String optionTarif = getRequiredLabelValue(Label.OPTARIF, frameValues); + if ("BASE".equals(optionTarif)) { + frameCbemmEvoIcc = buildFrameCbemmEvolutionIccBaseOption(frameValues); + } else if ("HC..".equals(optionTarif)) { + frameCbemmEvoIcc = buildFrameCbemmEvolutionIccHcOption(frameValues); + } else if ("EJP.".equals(optionTarif)) { + frameCbemmEvoIcc = buildFrameCbemmEvolutionIccEjpOption(frameValues); + } else if (optionTarif.startsWith("BBR") && optionTarif.length() == 4) { + ProgrammeCircuit1 prgCircuit1 = convertProgrammeCircuit1(optionTarif.charAt(3)); + ProgrammeCircuit2 prgCircuit2 = convertProgrammeCircuit2(optionTarif.charAt(3)); + frameCbemmEvoIcc = buildFrameCbemmEvolutionIccTempoOption(frameValues, prgCircuit1, prgCircuit2); + } else { + final String error = String.format("The option Tarif '%s' is not supported", optionTarif); + throw new InvalidFrameException(error); + } + + logger.trace("buildFrameCbemmEvolutionIcc(Map) [end]"); + return frameCbemmEvoIcc; + } + + private void setCbemmEvolutionIccCommonFrameFields(final FrameCbemmEvolutionIcc frame, + final Map frameValues) throws InvalidFrameException { + logger.trace("setCbemmEvolutionIccCommonFrameFields(Frame, Map) [start]"); + setCbemmCommonFrameFields(frame, frameValues); + frame.setPapp(getRequiredLabelValue(Label.PAPP, frameValues)); + logger.trace("setCbemmEvolutionIccCommonFrameFields(Frame, Map) [end]"); + } + + private FrameCbemmEvolutionIccBaseOption buildFrameCbemmEvolutionIccBaseOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEvolutionIccBaseOption(Map) [start]"); + FrameCbemmEvolutionIccBaseOption frame = new FrameCbemmEvolutionIccBaseOption(); + setCbemmEvolutionIccCommonFrameFields(frame, frameValues); + setFrameBaseOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmEvolutionIccBaseOption(Map) [end]"); + return frame; + } + + private FrameCbemmEvolutionIccHcOption buildFrameCbemmEvolutionIccHcOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEvolutionIccHcOption(Map) [start]"); + FrameCbemmEvolutionIccHcOption frame = new FrameCbemmEvolutionIccHcOption(); + setCbemmEvolutionIccCommonFrameFields(frame, frameValues); + setFrameHcOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmEvolutionIccHcOption(Map) [end]"); + return frame; + } + + private FrameCbemmEvolutionIccTempoOption buildFrameCbemmEvolutionIccTempoOption( + final Map frameValues, ProgrammeCircuit1 prgCircuit1, ProgrammeCircuit2 prgCircuit2) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEvolutionIccTempoOption(Map) [start]"); + FrameCbemmEvolutionIccTempoOption frame = new FrameCbemmEvolutionIccTempoOption(); + setCbemmEvolutionIccCommonFrameFields(frame, frameValues); + setFrameTempoOptionFields(frame, frameValues, prgCircuit1, prgCircuit2); + logger.trace("buildFrameCbemmEvolutionIccTempoOption(Map) [end]"); + return frame; + } + + private FrameCbemmEvolutionIccEjpOption buildFrameCbemmEvolutionIccEjpOption(final Map frameValues) + throws InvalidFrameException { + logger.trace("buildFrameCbemmEvolutionIccEjpOption(Map) [start]"); + FrameCbemmEvolutionIccEjpOption frame = new FrameCbemmEvolutionIccEjpOption(); + setCbemmEvolutionIccCommonFrameFields(frame, frameValues); + setFrameEjpOptionFields(frame, frameValues); + logger.trace("buildFrameCbemmEvolutionIccEjpOption(Map) [end]"); + return frame; + } + + private void setFrameBaseOptionFields(final FrameBaseOption frameBaseOption, final Map frameValues) + throws InvalidFrameException { + logger.trace("setFrameBaseOptionFields(FrameBaseOption) [start]"); + frameBaseOption.setBase(getRequiredLabelValue(Label.BASE, frameValues)); + logger.trace("setFrameBaseOptionFields(FrameBaseOption) [end]"); + } + + private void setFrameHcOptionFields(final FrameHcOption frameHcOption, final Map frameValues) + throws InvalidFrameException { + logger.trace("setFrameHcOptionFields(FrameHcOption) [start]"); + frameHcOption.setHchc(getRequiredLabelValue(Label.HCHC, frameValues)); + frameHcOption.setHchp(getRequiredLabelValue(Label.HCHP, frameValues)); + frameHcOption.setHhphc(getRequiredLabelValue(Label.HHPHC, frameValues)); + logger.trace("setFrameHcOptionFields(FrameHcOption) [end]"); + } + + private void setFrameEjpOptionFields(final FrameEjpOption frameEjpOption, final Map frameValues) + throws InvalidFrameException { + logger.trace("setFrameEjpOptionFields(FrameEjpOption) [start]"); + frameEjpOption.setEjphn(getRequiredLabelValue(Label.EJPHN, frameValues)); + frameEjpOption.setEjphpm(getRequiredLabelValue(Label.EJPHPM, frameValues)); + frameEjpOption.setPejp(getOptionalLabelValue(Label.PEJP, frameValues)); + logger.trace("setFrameEjpOptionFields(FrameEjpOption) [end]"); + } + + private void setFrameTempoOptionFields(final FrameTempoOption frameTempoOption, + final Map frameValues, ProgrammeCircuit1 prgCircuit1, ProgrammeCircuit2 prgCircuit2) + throws InvalidFrameException { + logger.trace("setFrameTempoOptionFields(FrameTempoOption) [start]"); + frameTempoOption.setBbrhpjr(getRequiredLabelValue(Label.BBRHPJR, frameValues)); + frameTempoOption.setBbrhcjr(getRequiredLabelValue(Label.BBRHCJR, frameValues)); + frameTempoOption.setBbrhpjw(getRequiredLabelValue(Label.BBRHPJW, frameValues)); + frameTempoOption.setBbrhcjw(getRequiredLabelValue(Label.BBRHCJW, frameValues)); + frameTempoOption.setBbrhpjb(getRequiredLabelValue(Label.BBRHPJB, frameValues)); + frameTempoOption.setBbrhcjb(getRequiredLabelValue(Label.BBRHCJB, frameValues)); + frameTempoOption.setDemain(getOptionalLabelValue(Label.DEMAIN, frameValues)); + frameTempoOption.setHhphc(getRequiredLabelValue(Label.HHPHC, frameValues)); + frameTempoOption.setProgrammeCircuit1(prgCircuit1); + frameTempoOption.setProgrammeCircuit2(prgCircuit2); + logger.trace("setFrameTempoOptionFields(FrameTempoOption) [end]"); + } + + @SuppressWarnings("unchecked") + private T getRequiredLabelValue(Label label, final Map frameValues) + throws InvalidFrameException { + if (!frameValues.containsKey(label)) { + final String error = String.format("The required label '%1$s' is missing in frame", label); + throw new InvalidFrameException(error); + } + + return (T) frameValues.get(label); + } + + @SuppressWarnings("unchecked") + private T getOptionalLabelValue(Label label, final Map frameValues) { + return (T) frameValues.get(label); + } + + private ProgrammeCircuit1 convertProgrammeCircuit1(char value) { + String prgCircuit1 = computeProgrammeCircuitBinaryValue(value).substring(3, 5); + switch (prgCircuit1) { + case "01": + return ProgrammeCircuit1.A; + case "10": + return ProgrammeCircuit1.B; + case "11": + return ProgrammeCircuit1.C; + default: + final String error = String.format("Programme circuit 1 '%s' is unknown", prgCircuit1); + throw new IllegalStateException(error); + } + } + + private ProgrammeCircuit2 convertProgrammeCircuit2(char value) { + String prgCircuit2 = computeProgrammeCircuitBinaryValue(value).substring(5, 8); + switch (prgCircuit2) { + case "000": + return ProgrammeCircuit2.P0; + case "001": + return ProgrammeCircuit2.P1; + case "010": + return ProgrammeCircuit2.P2; + case "011": + return ProgrammeCircuit2.P3; + case "100": + return ProgrammeCircuit2.P4; + case "101": + return ProgrammeCircuit2.P5; + case "110": + return ProgrammeCircuit2.P6; + case "111": + return ProgrammeCircuit2.P7; + default: + final String error = String.format("Programme circuit 2 '%s' is unknown", prgCircuit2); + throw new IllegalStateException(error); + } + } + + private String computeProgrammeCircuitBinaryValue(char value) { + return String.format("%8s", Integer.toBinaryString(value)).replace(' ', '0'); + } + + private void rethrowTaskExecutionException(ExecutionException e) + throws InvalidFrameException, IOException, TimeoutException { + Throwable cause = e.getCause(); + if (cause instanceof InvalidFrameException) { + throw (InvalidFrameException) cause; + } else if (cause instanceof IOException) { + throw (IOException) cause; + } else if (cause instanceof TimeoutException) { + throw (TimeoutException) cause; + } else { + throw new IllegalStateException(e); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/ConversionException.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/ConversionException.java new file mode 100644 index 0000000000000..02b294a22a259 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/ConversionException.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link ConversionException} class defines a conversion exception. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class ConversionException extends Exception { + + private static final long serialVersionUID = -1109821041874271681L; + private static final String ERROR_MESSAGE = "Unable to convert '%1$s' value"; + + private String valueToConvert; + + public ConversionException(String valueToConvert) { + this(valueToConvert, null); + } + + public ConversionException(String valueToConvert, @Nullable Throwable cause) { + super(String.format(ERROR_MESSAGE, valueToConvert), cause); + this.valueToConvert = valueToConvert; + } + + public String getValueToConvert() { + return valueToConvert; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/FrameUtil.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/FrameUtil.java new file mode 100644 index 0000000000000..a5df7fa1e0522 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/FrameUtil.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link FrameUtil} class defines a utility class for {@link FrameCbetmLong}. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class FrameUtil { + + private FrameUtil() { + // private constructor (utility class) + } + + /** + * Compute the checksum of the given group line. + * + * @param groupLine group line ("etiquette" "valeur"). Note: the SPACE before the checksum of the group line + * must not include in checksum computation. + * @return the checksum of the given group line. + */ + public static char computeGroupLineChecksum(final String label, final String value) { + final String groupLine = label + " " + value; + int sum = 0; + for (int i = 0; i < groupLine.length(); i++) { + sum = sum + groupLine.codePointAt(i); + } + sum = (sum & 0x3F) + 0x20; + + return (char) sum; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/InvalidFrameException.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/InvalidFrameException.java new file mode 100644 index 0000000000000..44c48bf12d91d --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/InvalidFrameException.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport; + +import java.util.Date; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link InvalidFrameException} class defines an exception for invalid frames. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class InvalidFrameException extends Exception { + + private static final long serialVersionUID = 4729529258857792922L; + + private Date timestamp; + + public InvalidFrameException() { + timestamp = new Date(); + } + + public InvalidFrameException(String message) { + super(message, null); + timestamp = new Date(); + } + + public InvalidFrameException(String message, Throwable cause) { + super(message, cause); + timestamp = new Date(); + } + + public Date getTimestamp() { + return timestamp; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/Label.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/Label.java new file mode 100644 index 0000000000000..b241284d604a6 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/Label.java @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.CouleurDemain; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; + +/** + * The {@link Label} enum defines all Teleinfo labels and their format. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public enum Label { + + ADCO(String.class, 12), + OPTARIF(String.class, 4), + BASE(Integer.class, 9), + HCHC(Integer.class, 9), + HCHP(Integer.class, 9), + EJPHN(Integer.class, 9), + EJPHPM(Integer.class, 9), + GAZ(Integer.class, 7), + AUTRE(Integer.class, 7), + PTEC(Ptec.class, 4), + MOTDETAT(String.class, 6), + ISOUSC(Integer.class, 2), + IINST(Integer.class, 3), + IINST1(Integer.class, 3), + IINST2(Integer.class, 3), + IINST3(Integer.class, 3), + ADIR1(Integer.class, 3), + ADIR2(Integer.class, 3), + ADIR3(Integer.class, 3), + ADPS(Integer.class, 3), + IMAX(Integer.class, 3), + IMAX1(Integer.class, 3), + IMAX2(Integer.class, 3), + IMAX3(Integer.class, 3), + PMAX(Integer.class, 5), + PPOT(String.class, 2), + HHPHC(Hhphc.class, 1), + PAPP(Integer.class, 5), + BBRHCJB(Integer.class, 9), + BBRHPJB(Integer.class, 9), + BBRHCJW(Integer.class, 9), + BBRHPJW(Integer.class, 9), + BBRHCJR(Integer.class, 9), + BBRHPJR(Integer.class, 9), + PEJP(Integer.class, 2), + DEMAIN(CouleurDemain.class, 4); + + private Class type; + private int size; + + Label(Class type, int size) { + this.type = type; + this.size = size; + } + + public Class getType() { + return type; + } + + public int getSize() { + return size; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/Converter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/Converter.java new file mode 100644 index 0000000000000..a35be37eb38e8 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/Converter.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; + +/** + * The {@link Converter} interface defines a converter to translate a Teleinfo String value into Java object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public interface Converter { + + public @Nullable Object convert(String value) throws ConversionException; +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/CouleurDemainConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/CouleurDemainConverter.java new file mode 100644 index 0000000000000..7372612dad3db --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/CouleurDemainConverter.java @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.CouleurDemain; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link CouleurDemainConverter} class defines a converter to translate a Teleinfo String value into + * {@link org.openhab.binding.teleinfo.internal.dto.common.Ptec} object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class CouleurDemainConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(CouleurDemainConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + CouleurDemain convertedValue = null; + switch (value) { + case "----": + // convertedValue = null; + break; + case "BLEU": + convertedValue = CouleurDemain.Bleu; + break; + case "BLAN": + convertedValue = CouleurDemain.Blanc; + break; + case "ROUG": + convertedValue = CouleurDemain.Rouge; + break; + default: + throw new ConversionException(value); + } + + logger.debug("convert(String) [end]"); + return convertedValue; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/FloatConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/FloatConverter.java new file mode 100644 index 0000000000000..b5bbaa4b9f5d2 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/FloatConverter.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link FloatConverter} class defines a converter to translate a Teleinfo String value into Float object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class FloatConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(FloatConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + Object convertedValue = null; + try { + convertedValue = Float.parseFloat(value); + } catch (NumberFormatException e) { + throw new ConversionException(value, e); + } + + logger.debug("convert(String) [end]"); + return convertedValue; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/HhphcConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/HhphcConverter.java new file mode 100644 index 0000000000000..59427301ca4f8 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/HhphcConverter.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link HhphcConverter} class defines a converter to translate a Teleinfo String value into + * {@link Hhphc} object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class HhphcConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(HhphcConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + Hhphc convertedValue = null; + switch (value) { + case "A": + convertedValue = Hhphc.A; + break; + case "C": + convertedValue = Hhphc.C; + break; + case "D": + convertedValue = Hhphc.D; + break; + case "E": + convertedValue = Hhphc.E; + break; + case "Y": + convertedValue = Hhphc.Y; + break; + default: + throw new ConversionException(value); + } + + logger.debug("convert(String) [end]"); + return convertedValue; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/IntegerConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/IntegerConverter.java new file mode 100644 index 0000000000000..7930c14a5c7c7 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/IntegerConverter.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link IntegerConverter} class defines a converter to translate a Teleinfo String value into Integer object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class IntegerConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(IntegerConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + Object convertedValue = null; + try { + convertedValue = Integer.parseInt(value, 10); + } catch (NumberFormatException e) { + throw new ConversionException(value, e); + } + + logger.debug("convert(String) [end]"); + return convertedValue; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/PtecConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/PtecConverter.java new file mode 100644 index 0000000000000..fe3dee04533eb --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/PtecConverter.java @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link PtecConverter} class defines a converter to translate a Teleinfo String value into + * {@link Ptec} object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class PtecConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(PtecConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + Ptec convertedValue = null; + switch (value) { + case "TH..": + convertedValue = Ptec.TH; + break; + case "HC..": + convertedValue = Ptec.HC; + break; + case "HP..": + convertedValue = Ptec.HP; + break; + case "HN..": + convertedValue = Ptec.HN; + break; + case "PM..": + convertedValue = Ptec.PM; + break; + case "HCJB": + convertedValue = Ptec.HCJB; + break; + case "HCJW": + convertedValue = Ptec.HCJW; + break; + case "HCJR": + convertedValue = Ptec.HCJR; + break; + case "HPJB": + convertedValue = Ptec.HPJB; + break; + case "HPJW": + convertedValue = Ptec.HPJW; + break; + case "HPJR": + convertedValue = Ptec.HPJR; + break; + default: + throw new ConversionException(value); + } + + logger.debug("convert(String) [end]"); + return convertedValue; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/StringConverter.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/StringConverter.java new file mode 100644 index 0000000000000..38a37c45d5c4c --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/reader/io/serialport/converter/StringConverter.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io.serialport.converter; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link StringConverter} class defines a converter to translate a Teleinfo String value into String object. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class StringConverter implements Converter { + + private final Logger logger = LoggerFactory.getLogger(StringConverter.class); + + @Override + public @Nullable Object convert(String value) throws ConversionException { + logger.debug("convert(String) [start]"); + if (logger.isTraceEnabled()) { + logger.trace("value = {}", value); + } + + logger.debug("convert(String) [end]"); + return value; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThread.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThread.java new file mode 100644 index 0000000000000..69c165dd45613 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThread.java @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.serial; + +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeoutException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.io.transport.serial.SerialPort; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.reader.io.TeleinfoInputStream; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.InvalidFrameException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link TeleinfoReceiveThread} class defines a thread to decode and fire Teleinfo frames for Serial controller. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoReceiveThread extends Thread { + + private static final int SERIAL_PORT_DELAY_RETRY_IN_SECONDS = 60; + + private final Logger logger = LoggerFactory.getLogger(TeleinfoReceiveThread.class); + + private SerialPort serialPort; + private @Nullable TeleinfoReceiveThreadListener listener; + private boolean autoRepairInvalidADPSgroupLine; + private ExecutorService executorService; + + public TeleinfoReceiveThread(SerialPort serialPort, final TeleinfoSerialControllerHandler listener, + boolean autoRepairInvalidADPSgroupLine, ExecutorService scheduler) { + super("OH-binding-TeleinfoReceiveThread-" + listener.getThing().getUID().getId()); + setDaemon(true); + this.serialPort = serialPort; + this.listener = listener; + this.autoRepairInvalidADPSgroupLine = autoRepairInvalidADPSgroupLine; + this.executorService = scheduler; + } + + @Override + public void run() { + try (TeleinfoInputStream teleinfoStream = new TeleinfoInputStream(serialPort.getInputStream(), + TeleinfoInputStream.DEFAULT_TIMEOUT_NEXT_HEADER_FRAME_US * 100, + TeleinfoInputStream.DEFAULT_TIMEOUT_READING_FRAME_US * 100, autoRepairInvalidADPSgroupLine, + executorService)) { + while (!interrupted()) { + TeleinfoReceiveThreadListener listener = this.listener; + if (listener != null) { + try { + Frame nextFrame = teleinfoStream.readNextFrame(); + if (nextFrame != null) + listener.onFrameReceived(this, nextFrame); + } catch (InvalidFrameException e) { + logger.warn("Got invalid frame. Detail: \"{}\"", e.getLocalizedMessage()); + listener.onInvalidFrameReceived(this, e); + } catch (TimeoutException e) { + logger.warn("Got timeout during frame reading", e); + logger.warn("Retry in progress. Next retry in {} seconds...", + SERIAL_PORT_DELAY_RETRY_IN_SECONDS); + listener.continueOnReadNextFrameTimeoutException(); + try { + Thread.sleep(SERIAL_PORT_DELAY_RETRY_IN_SECONDS * 1000); + } catch (InterruptedException e1) { + break; + } + + } catch (IOException e) { + logger.warn("Got I/O exception. Detail: \"{}\"", e.getLocalizedMessage(), e); + listener.onSerialPortInputStreamIOException(this, e); + break; + } catch (IllegalStateException e) { + logger.warn("Got illegal state exception", e); + } + } + } + } catch (IOException e) { + logger.warn("An error occurred during serial port input stream opening", e); + } + + serialPort.removeEventListener(); + } + + public @Nullable TeleinfoReceiveThreadListener getListener() { + return listener; + } + + public void setListener(@Nullable TeleinfoReceiveThreadListener listener) { + this.listener = listener; + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThreadListener.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThreadListener.java new file mode 100644 index 0000000000000..b055c08ef1738 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoReceiveThreadListener.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.serial; + +import java.io.IOException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.InvalidFrameException; + +/** + * The {@link TeleinfoReceiveThreadListener} interface defines all events pushed by a {@link TeleinfoReceiveThread}. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public interface TeleinfoReceiveThreadListener { + + void onFrameReceived(final TeleinfoReceiveThread receiveThread, final Frame frame); + + void onInvalidFrameReceived(final TeleinfoReceiveThread receiveThread, final InvalidFrameException error); + + void onSerialPortInputStreamIOException(final TeleinfoReceiveThread receiveThread, final IOException e); + + void continueOnReadNextFrameTimeoutException(); +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerConfiguration.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerConfiguration.java new file mode 100644 index 0000000000000..919eed7d7baf1 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerConfiguration.java @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.serial; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link TeleinfoSerialControllerConfiguration} class contains fields mapping thing configuration parameters. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoSerialControllerConfiguration { + + public String serialport = ""; + public boolean autoRepairInvalidADPSgroupLine = true; +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerHandler.java b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerHandler.java new file mode 100644 index 0000000000000..de89365e81aa1 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/serial/TeleinfoSerialControllerHandler.java @@ -0,0 +1,187 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.serial; + +import static org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants.*; + +import java.io.IOException; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.core.library.types.DecimalType; +import org.eclipse.smarthome.core.thing.Bridge; +import org.eclipse.smarthome.core.thing.ChannelUID; +import org.eclipse.smarthome.core.thing.ThingStatus; +import org.eclipse.smarthome.core.thing.ThingStatusDetail; +import org.eclipse.smarthome.core.types.Command; +import org.eclipse.smarthome.io.transport.serial.PortInUseException; +import org.eclipse.smarthome.io.transport.serial.SerialPort; +import org.eclipse.smarthome.io.transport.serial.SerialPortIdentifier; +import org.eclipse.smarthome.io.transport.serial.SerialPortManager; +import org.eclipse.smarthome.io.transport.serial.UnsupportedCommOperationException; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.handler.TeleinfoAbstractControllerHandler; +import org.openhab.binding.teleinfo.internal.reader.io.serialport.InvalidFrameException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link TeleinfoSerialControllerHandler} class defines a handler for serial controller. + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoSerialControllerHandler extends TeleinfoAbstractControllerHandler + implements TeleinfoReceiveThreadListener { + + private final Logger logger = LoggerFactory.getLogger(TeleinfoSerialControllerHandler.class); + + private static final int SERIAL_RECEIVE_TIMEOUT_MS = 250; + private static final int RECEIVER_THREAD_JOIN_DELAY_MS = 500; + + private SerialPortManager serialPortManager; + private @Nullable SerialPort serialPort; + private @Nullable TeleinfoReceiveThread receiveThread; + private @Nullable ScheduledFuture keepAliveThread; + private long invalidFrameCounter = 0; + + public TeleinfoSerialControllerHandler(Bridge thing, SerialPortManager serialPortManager) { + super(thing); + this.serialPortManager = serialPortManager; + } + + @Override + public void initialize() { + invalidFrameCounter = 0; + + keepAliveThread = scheduler.scheduleWithFixedDelay(() -> { + if (!isInitialized()) { + openSerialPortAndStartReceiving(); + updateStatus(ThingStatus.UNKNOWN); + } + logger.debug("Check Teleinfo receiveThread status..."); + logger.debug("isInitialized() = {}", isInitialized()); + TeleinfoReceiveThread receiveThreadRef = receiveThread; + if (receiveThreadRef != null) { + logger.debug("receiveThread.isAlive() = {}", receiveThreadRef.isAlive()); + } + if (isInitialized() && (receiveThreadRef == null || !receiveThreadRef.isAlive())) { + updateStatus(ThingStatus.UNKNOWN, ThingStatusDetail.NONE, ERROR_UNKNOWN_RETRY_IN_PROGRESS); + logger.info("Try to restart Teleinfo receiving..."); + stopReceivingAndCloseSerialPort(); + openSerialPortAndStartReceiving(); + } + }, 0, 60, TimeUnit.SECONDS); + } + + @Override + public void dispose() { + ScheduledFuture keepAliveThreadRef = keepAliveThread; + if (keepAliveThreadRef != null) { + keepAliveThreadRef.cancel(true); + keepAliveThread = null; + } + stopReceivingAndCloseSerialPort(); + + super.dispose(); + } + + @Override + public void handleCommand(ChannelUID channelUID, Command command) { + } + + @Override + public void onFrameReceived(TeleinfoReceiveThread receiveThread, Frame frame) { + updateStatus(ThingStatus.ONLINE); + fireOnFrameReceivedEvent(frame); + } + + @Override + public void onInvalidFrameReceived(TeleinfoReceiveThread receiveThread, InvalidFrameException error) { + invalidFrameCounter++; + updateState(THING_SERIAL_CONTROLLER_CHANNEL_INVALID_FRAME_COUNTER, new DecimalType(invalidFrameCounter)); + } + + @Override + public void onSerialPortInputStreamIOException(TeleinfoReceiveThread receiveThread, IOException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, ERROR_UNKNOWN_RETRY_IN_PROGRESS); + } + + @Override + public void continueOnReadNextFrameTimeoutException() { + updateStatus(ThingStatus.UNKNOWN, ThingStatusDetail.NONE, ERROR_UNKNOWN_RETRY_IN_PROGRESS); + } + + private void openSerialPortAndStartReceiving() { + TeleinfoSerialControllerConfiguration config = getConfigAs(TeleinfoSerialControllerConfiguration.class); + + if (config.serialport.trim().isEmpty()) { + logger.warn("Teleinfo port is not set."); + return; + } + + logger.debug("Connecting to serial port '{}'...", config.serialport); + String currentOwner = null; + try { + final SerialPortIdentifier portIdentifier = serialPortManager.getIdentifier(config.serialport); + logger.debug("portIdentifier = {}", portIdentifier); + if (portIdentifier == null) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, + ERROR_OFFLINE_SERIAL_NOT_FOUND); + return; + } + logger.debug("Opening portIdentifier"); + currentOwner = portIdentifier.getCurrentOwner(); + logger.debug("portIdentifier.getCurrentOwner() = {}", currentOwner); + SerialPort commPort = portIdentifier.open("org.openhab.binding.teleinfo", 5000); + serialPort = commPort; + + commPort.setSerialPortParams(1200, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); + commPort.enableReceiveThreshold(1); + commPort.enableReceiveTimeout(SERIAL_RECEIVE_TIMEOUT_MS); + logger.debug("Starting receive thread"); + TeleinfoReceiveThread receiveThread = new TeleinfoReceiveThread(commPort, this, + config.autoRepairInvalidADPSgroupLine, scheduler); + this.receiveThread = receiveThread; + receiveThread.start(); + + logger.debug("Connected to serial port '{}'", config.serialport); + } catch (PortInUseException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, + ERROR_OFFLINE_SERIAL_INUSE); + } catch (UnsupportedCommOperationException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, + ERROR_OFFLINE_SERIAL_UNSUPPORTED); + } + } + + private void stopReceivingAndCloseSerialPort() { + TeleinfoReceiveThread receiveThreadRef = receiveThread; + if (receiveThreadRef != null) { + receiveThreadRef.interrupt(); + try { + receiveThreadRef.join(RECEIVER_THREAD_JOIN_DELAY_MS); + } catch (InterruptedException e) { + } + receiveThreadRef.setListener(null); + receiveThread = null; + } + SerialPort serialPortRef = serialPort; + if (serialPortRef != null) { + serialPortRef.close(); + serialPort = null; + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/binding/binding.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/binding/binding.xml new file mode 100644 index 0000000000000..3812614f49d0e --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/binding/binding.xml @@ -0,0 +1,10 @@ + + + + Teleinfo Binding + The Teleinfo binding decodes the electrical statistics from an ENEDIS/ERDF Electricity Meter + Nicolas Siberil + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/config/config-description.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/config/config-description.xml new file mode 100644 index 0000000000000..517e1a8b1205b --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/config/config-description.xml @@ -0,0 +1,15 @@ + + + + + + + Electricity meter identifier (format: 12 characters / e.g: '031528042289') + false + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/i18n/thingstate.properties b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/i18n/thingstate.properties new file mode 100644 index 0000000000000..a2e85d1e37046 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/i18n/thingstate.properties @@ -0,0 +1,6 @@ +teleinfo.thingstate.serial_notfound=Serial Error: Port {0} does not exist +teleinfo.thingstate.serial_inuse=Serial Error: Port {0} is in use +teleinfo.thingstate.serial_unsupported=Serial Error: Unsupported operation on port {0} +teleinfo.thingstate.serial_listeners=Serial Error: Too many listeners on port {0} +teleinfo.thingstate.controller_offline=Controller is offline +teleinfo.thingstate.controller_unknown_retry_inprogress=Serial Error: Retry in progress... diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmBaseOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmBaseOptionElectricityMeter.xml new file mode 100644 index 0000000000000..82aeb882549c8 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmBaseOptionElectricityMeter.xml @@ -0,0 +1,30 @@ + + + + + + + + + + Single-phase Electricity meter with BASE option - CBEMM (aka "Compteur Bleu Electronique Monophasé + Multitarif") + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEjpElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEjpElectricityMeter.xml new file mode 100644 index 0000000000000..8e2c2b3e9e97e --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEjpElectricityMeter.xml @@ -0,0 +1,32 @@ + + + + + + + + + + Single-phase Electricity meter with EJP option - CBEMM (aka "Compteur Bleu Electronique Monophasé + Multitarif") + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccBaseOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccBaseOptionElectricityMeter.xml new file mode 100644 index 0000000000000..dc18427548410 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccBaseOptionElectricityMeter.xml @@ -0,0 +1,31 @@ + + + + + + + + + + Single-phase Electricity meter with BASE option - CBEMM Evolution ICC (aka "Compteur Bleu Electronique + Monophasé Multitarif Evolution ICC") + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccEjpElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccEjpElectricityMeter.xml new file mode 100644 index 0000000000000..87716f3c569cc --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccEjpElectricityMeter.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + Single-phase Electricity meter with EJP option - CBEMM (aka "Compteur Bleu Electronique Monophasé + Multitarif") + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccHcElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccHcElectricityMeter.xml new file mode 100644 index 0000000000000..0acc6d4641598 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccHcElectricityMeter.xml @@ -0,0 +1,33 @@ + + + + + + + + + + Single-phase Electricity meter with HC/HP option - CBEMM Evolution ICC (aka "Compteur Bleu Electronique + Monophasé Multitarif Evolution ICC") + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccTempoElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccTempoElectricityMeter.xml new file mode 100644 index 0000000000000..812ceb90c5e3c --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmEvolutionIccTempoElectricityMeter.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + Single-phase Electricity meter with TEMPO option - CBEMM Evolution ICC (aka "Compteur Bleu Electronique + Monophasé Multitarif Evolution ICC") + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmHcElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmHcElectricityMeter.xml new file mode 100644 index 0000000000000..80d66a0065cb5 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmHcElectricityMeter.xml @@ -0,0 +1,32 @@ + + + + + + + + + + Single-phase Electricity meter with HC/HP option - CBEMM (aka "Compteur Bleu Electronique Monophasé + Multitarif") + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmTempoElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmTempoElectricityMeter.xml new file mode 100644 index 0000000000000..4c35d9c976577 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbemmTempoElectricityMeter.xml @@ -0,0 +1,39 @@ + + + + + + + + + + Single-phase Electricity meter with TEMPO option - CBEMM (aka "Compteur Bleu Electronique Monophasé + Multitarif") + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmBaseOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmBaseOptionElectricityMeter.xml new file mode 100644 index 0000000000000..4743bcc06e4f4 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmBaseOptionElectricityMeter.xml @@ -0,0 +1,40 @@ + + + + + + + + + + Three-phase Electricity meter with BASE option - CBETM (aka "Compteur Bleu Electronique Triphasé + Multitarif") + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmEjpOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmEjpOptionElectricityMeter.xml new file mode 100644 index 0000000000000..e9d73d528d1ba --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmEjpOptionElectricityMeter.xml @@ -0,0 +1,42 @@ + + + + + + + + + + Three-phase Electricity meter with EJP option - CBETM (aka "Compteur Bleu Electronique Triphasé + Multitarif") + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmHcOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmHcOptionElectricityMeter.xml new file mode 100644 index 0000000000000..9de5a95a3b22c --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmHcOptionElectricityMeter.xml @@ -0,0 +1,42 @@ + + + + + + + + + + Three-phase Electricity meter with HC option - CBETM (aka "Compteur Bleu Electronique Triphasé + Multitarif") + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmTempoOptionElectricityMeter.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmTempoOptionElectricityMeter.xml new file mode 100644 index 0000000000000..5205137d94e20 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/cbetmTempoOptionElectricityMeter.xml @@ -0,0 +1,49 @@ + + + + + + + + + + Three-phase Electricity meter with TEMPO option - CBETM (aka "Compteur Bleu Electronique Triphasé + Multitarif") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-base-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-base-channel-types.xml new file mode 100644 index 0000000000000..aca274f03e2aa --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-base-channel-types.xml @@ -0,0 +1,15 @@ + + + + + Number:Energy + + Total consumed energy + Energy + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-channel-types.xml new file mode 100644 index 0000000000000..50d1bb8c6fd3e --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-channel-types.xml @@ -0,0 +1,31 @@ + + + + + Number:ElectricCurrent + + Maximum consumed electric current + Energy + + + + + Number:ElectricCurrent + + Instantaneous electric current + Energy + + + + + Number:ElectricCurrent + + Excess electric current warning + Energy + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-evo-icc-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-evo-icc-channel-types.xml new file mode 100644 index 0000000000000..a1383ef353e3f --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbemm-evo-icc-channel-types.xml @@ -0,0 +1,15 @@ + + + + + Number + + Instantaneous apparent power + Energy + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbetm-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbetm-channel-types.xml new file mode 100644 index 0000000000000..03fbd590e5c66 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-cbetm-channel-types.xml @@ -0,0 +1,115 @@ + + + + + String + + frameType + Energy + + + + + + + + + + Number:ElectricCurrent + + Instantaneous electric current on phase 1 + Energy + + + + + Number:ElectricCurrent + + Instantaneous electric current on phase 2 + Energy + + + + + Number:ElectricCurrent + + Instantaneous electric current on phase 3 + Energy + + + + + Number:ElectricCurrent + + Maximum consumed electric current on phase 1 + Energy + + + + + Number:ElectricCurrent + + Maximum consumed electric current on phase 2 + Energy + + + + + Number:ElectricCurrent + + Maximum consumed electric current on phase 3 + Energy + + + + + Number:Power + + Maximum consumed electric power on all phases + Energy + + + + + Number + + Instantaneous apparent power + Energy + + + + + String + + Electrical potential presence + Energy + + + + + Number:ElectricCurrent + + Excess electric current on phase 1 warning + Energy + + + + + Number:ElectricCurrent + + Excess electric current on phase 2 warning + Energy + + + + + Number:ElectricCurrent + + Excess electric current on phase 3 warning + Energy + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-channel-types.xml new file mode 100644 index 0000000000000..835b9ac5c1403 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-channel-types.xml @@ -0,0 +1,60 @@ + + + + + Number:ElectricCurrent + + Subscribed electric current + Energy + + + + + String + + Current pricing period + Energy + + + + + + + + + + + + + + + + + + + String + + Pricing schedule group + Energy + + + + + + + + + + + + + DateTime + + Timestamp of last received Teleinfo frame + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-ejp-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-ejp-channel-types.xml new file mode 100644 index 0000000000000..ecf5436922150 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-ejp-channel-types.xml @@ -0,0 +1,30 @@ + + + + + Number:Energy + + Total consumed energy at high rate pricing + Energy + + + + + Number:Energy + + Total consumed energy at low rate pricing + Energy + + + + + Number:Time + + Prior notice to EJP start + Energy + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-hc-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-hc-channel-types.xml new file mode 100644 index 0000000000000..da1009834ea95 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-hc-channel-types.xml @@ -0,0 +1,23 @@ + + + + + Number:Energy + + Total consumed energy at low rate pricing + Energy + + + + + Number:Energy + + Total consumed energy at high rate pricing + Energy + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-tempo-channel-types.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-tempo-channel-types.xml new file mode 100644 index 0000000000000..07f6a5d8dce62 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/common-tempo-channel-types.xml @@ -0,0 +1,101 @@ + + + + + Number:Energy + + Total consumed energy at high rate pricing on red days + Energy + + + + + Number:Energy + + Total consumed energy at low rate pricing on red days + Energy + + + + + Number:Energy + + Total consumed energy at high rate pricing on white days + Energy + + + + + Number:Energy + + Total consumed energy at low rate pricing on white days + Energy + + + + + Number:Energy + + Total consumed energy at high rate pricing on blue days + Energy + + + + + Number:Energy + + Total consumed energy at low rate pricing on blue days + Energy + + + + + String + + Following day color + Energy + + + + + + + + + + + String + + Circuit 1 program + Energy + + + + + + + + + + + String + + Circuit 2 program + Energy + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/serialController.xml b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/serialController.xml new file mode 100644 index 0000000000000..486c94676f538 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/main/resources/ESH-INF/thing/serialController.xml @@ -0,0 +1,41 @@ + + + + + + Teleinfo USB Stick with Serial Interface + + + + + + + + + serial-port + Serial port of Teleinfo device (e.g.: /dev/ttyUSB0 on Linux, COM1 on Windows) + false + + + + Try to auto repair malformed ADPS data from hardware issues (e.g: "ADPS032" instead of "ADPS 032" + expected/well-formed data) + true + true + + + + + + + Number + + Counter tracking the number of frames invalid/corrupted (checksum) + + + + + diff --git a/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStreamTest.java b/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStreamTest.java new file mode 100644 index 0000000000000..72ba81af646c9 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/internal/reader/io/TeleinfoInputStreamTest.java @@ -0,0 +1,173 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.internal.reader.io; + +import java.io.FileInputStream; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.junit.Assert; +import org.junit.Test; +import org.openhab.binding.teleinfo.internal.dto.Frame; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccHcOption; +import org.openhab.binding.teleinfo.internal.dto.cbemm.evoicc.FrameCbemmEvolutionIccTempoOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongBaseOption; +import org.openhab.binding.teleinfo.internal.dto.cbetm.FrameCbetmLongEjpOption; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.ProgrammeCircuit1; +import org.openhab.binding.teleinfo.internal.dto.common.FrameTempoOption.ProgrammeCircuit2; +import org.openhab.binding.teleinfo.internal.dto.common.Hhphc; +import org.openhab.binding.teleinfo.internal.dto.common.Ptec; +import org.openhab.binding.teleinfo.util.TestUtils; + +/** + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public class TeleinfoInputStreamTest { + + @Test + public void testReadNextFrameCbetmBase1() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("cbetm-base-option-1.raw")))) { + Frame frame = in.readNextFrame(); + + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbetmLongBaseOption.class, frame.getClass()); + FrameCbetmLongBaseOption frameCbetmLongBaseOption = (FrameCbetmLongBaseOption) frame; + Assert.assertEquals("XXXXXXXXXXXX", frameCbetmLongBaseOption.getAdco()); + Assert.assertEquals(20, frameCbetmLongBaseOption.getIsousc()); + Assert.assertEquals(1181243, frameCbetmLongBaseOption.getBase()); + Assert.assertEquals(Ptec.TH, frameCbetmLongBaseOption.getPtec()); + Assert.assertEquals(0, frameCbetmLongBaseOption.getIinst1()); + Assert.assertEquals(2, frameCbetmLongBaseOption.getIinst2()); + Assert.assertEquals(0, frameCbetmLongBaseOption.getIinst3()); + Assert.assertEquals(26, frameCbetmLongBaseOption.getImax1().intValue()); + Assert.assertEquals(18, frameCbetmLongBaseOption.getImax2().intValue()); + Assert.assertEquals(27, frameCbetmLongBaseOption.getImax3().intValue()); + Assert.assertEquals(7990, frameCbetmLongBaseOption.getPmax()); + Assert.assertEquals(540, frameCbetmLongBaseOption.getPapp()); + Assert.assertEquals("00", frameCbetmLongBaseOption.getPpot()); + } + } + + @Test + public void testReadNextFrameCbemmEvoIccHc1() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-hc-option-1.raw")))) { + Frame frame = in.readNextFrame(); + + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbemmEvolutionIccHcOption.class, frame.getClass()); + FrameCbemmEvolutionIccHcOption frameCbemmEvolutionIccHcOption = (FrameCbemmEvolutionIccHcOption) frame; + Assert.assertEquals("XXXXXXXXXXXX", frameCbemmEvolutionIccHcOption.getAdco()); + Assert.assertEquals(30, frameCbemmEvolutionIccHcOption.getIsousc()); + Assert.assertEquals(6906827, frameCbemmEvolutionIccHcOption.getHchc()); + Assert.assertEquals(7617931, frameCbemmEvolutionIccHcOption.getHchp()); + Assert.assertEquals(Ptec.HP, frameCbemmEvolutionIccHcOption.getPtec()); + Assert.assertEquals(3, frameCbemmEvolutionIccHcOption.getIinst()); + Assert.assertEquals(44, frameCbemmEvolutionIccHcOption.getImax().intValue()); + Assert.assertEquals(680, frameCbemmEvolutionIccHcOption.getPapp()); + Assert.assertNull(frameCbemmEvolutionIccHcOption.getAdps()); + Assert.assertEquals(Hhphc.A, frameCbemmEvolutionIccHcOption.getHhphc()); + } + } + + @Test + public void testReadNextFrameCbetmEjp1() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("cbetm-ejp-option-1.raw")))) { + Frame frame = in.readNextFrame(); + + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbetmLongEjpOption.class, frame.getClass()); + FrameCbetmLongEjpOption frameCbetmLongEjpOption = (FrameCbetmLongEjpOption) frame; + Assert.assertEquals("XXXXXXXXXX", frameCbetmLongEjpOption.getAdco()); + Assert.assertEquals(30, frameCbetmLongEjpOption.getIsousc()); + Assert.assertEquals(1111111, frameCbetmLongEjpOption.getEjphn()); + Assert.assertEquals(2222222, frameCbetmLongEjpOption.getEjphpm()); + Assert.assertNull(frameCbetmLongEjpOption.getPejp()); + Assert.assertEquals(Ptec.HN, frameCbetmLongEjpOption.getPtec()); + Assert.assertEquals(10, frameCbetmLongEjpOption.getIinst1()); + Assert.assertEquals(5, frameCbetmLongEjpOption.getIinst2()); + Assert.assertEquals(8, frameCbetmLongEjpOption.getIinst3()); + Assert.assertEquals(38, frameCbetmLongEjpOption.getImax1().intValue()); + Assert.assertEquals(42, frameCbetmLongEjpOption.getImax2().intValue()); + Assert.assertEquals(44, frameCbetmLongEjpOption.getImax3().intValue()); + Assert.assertEquals(17480, frameCbetmLongEjpOption.getPmax()); + Assert.assertEquals(5800, frameCbetmLongEjpOption.getPapp()); + Assert.assertEquals("00", frameCbetmLongEjpOption.getPpot()); + } + } + + @Test + public void testReadNextFrameCbemmEvoIccTempo1() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-tempo-option-1.raw")))) { + Frame frame = in.readNextFrame(); + + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbemmEvolutionIccTempoOption.class, frame.getClass()); + FrameCbemmEvolutionIccTempoOption frameCbemmEvolutionIccTempoOption = (FrameCbemmEvolutionIccTempoOption) frame; + Assert.assertEquals("XXXXXXXXXXXX", frameCbemmEvolutionIccTempoOption.getAdco()); + Assert.assertEquals(45, frameCbemmEvolutionIccTempoOption.getIsousc()); + Assert.assertEquals(2697099, frameCbemmEvolutionIccTempoOption.getBbrhcjb()); + Assert.assertEquals(3494559, frameCbemmEvolutionIccTempoOption.getBbrhpjb()); + Assert.assertEquals(41241, frameCbemmEvolutionIccTempoOption.getBbrhcjw()); + Assert.assertEquals(194168, frameCbemmEvolutionIccTempoOption.getBbrhpjw()); + Assert.assertEquals(0, frameCbemmEvolutionIccTempoOption.getBbrhcjr()); + Assert.assertEquals(89736, frameCbemmEvolutionIccTempoOption.getBbrhpjr()); + Assert.assertEquals(Ptec.HPJR, frameCbemmEvolutionIccTempoOption.getPtec()); + Assert.assertNull(frameCbemmEvolutionIccTempoOption.getDemain()); + Assert.assertEquals(3, frameCbemmEvolutionIccTempoOption.getIinst()); + Assert.assertEquals(37, frameCbemmEvolutionIccTempoOption.getImax().intValue()); + Assert.assertEquals(620, frameCbemmEvolutionIccTempoOption.getPapp()); + Assert.assertNull(frameCbemmEvolutionIccTempoOption.getAdps()); + Assert.assertEquals(Hhphc.Y, frameCbemmEvolutionIccTempoOption.getHhphc()); + Assert.assertEquals(ProgrammeCircuit1.B, frameCbemmEvolutionIccTempoOption.getProgrammeCircuit1()); + Assert.assertEquals(ProgrammeCircuit2.P2, frameCbemmEvolutionIccTempoOption.getProgrammeCircuit2()); + } + } + + @Test + public void testReadNextFrameCbemmEvoIccBase1() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-base-option-1.raw")))) { + Frame frame = in.readNextFrame(); + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbemmEvolutionIccBaseOption.class, frame.getClass()); + FrameCbemmEvolutionIccBaseOption frameCbemmEvolutionIccBaseOption = (FrameCbemmEvolutionIccBaseOption) frame; + Assert.assertEquals("031762120162", frameCbemmEvolutionIccBaseOption.getAdco()); + Assert.assertEquals(30, frameCbemmEvolutionIccBaseOption.getIsousc()); + Assert.assertEquals(190575, frameCbemmEvolutionIccBaseOption.getBase()); + Assert.assertEquals(Ptec.TH, frameCbemmEvolutionIccBaseOption.getPtec()); + Assert.assertEquals(1, frameCbemmEvolutionIccBaseOption.getIinst()); + Assert.assertEquals(90, frameCbemmEvolutionIccBaseOption.getImax().intValue()); + Assert.assertEquals(270, frameCbemmEvolutionIccBaseOption.getPapp()); + Assert.assertNull(frameCbemmEvolutionIccBaseOption.getAdps()); + } + } + + @Test + public void testInvalidADPSgrouplineWithAutoRepairActivated() throws Exception { + try (TeleinfoInputStream in = new TeleinfoInputStream( + new FileInputStream(TestUtils.getTestFile("invalid-adps-groupline.raw")), true)) { + Frame frame = in.readNextFrame(); + + Assert.assertNotNull(frame); + Assert.assertEquals(FrameCbemmEvolutionIccBaseOption.class, frame.getClass()); + FrameCbemmEvolutionIccBaseOption frameCbemmEvolutionIccBaseOption = (FrameCbemmEvolutionIccBaseOption) frame; + Assert.assertEquals(37, frameCbemmEvolutionIccBaseOption.getAdps().intValue()); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/util/TestUtils.java b/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/util/TestUtils.java new file mode 100644 index 0000000000000..d4cce254bba96 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/test/java/org/openhab/binding/teleinfo/util/TestUtils.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.teleinfo.util; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * + * @author Nicolas SIBERIL - Initial contribution + */ +@NonNullByDefault +public final class TestUtils { + + private TestUtils() { + // private constructor + } + + public static File getTestFile(String testResourceName) { + URL url = TestUtils.class.getClassLoader().getResource(testResourceName); + try { + return new File(url.toURI()); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-base-option-1.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-base-option-1.raw new file mode 100644 index 0000000000000..f568bba5c73b5 Binary files /dev/null and b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-base-option-1.raw differ diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-hc-option-1.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-hc-option-1.raw new file mode 100644 index 0000000000000..e3d0e625cd82b Binary files /dev/null and b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-hc-option-1.raw differ diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-tempo-option-1.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-tempo-option-1.raw new file mode 100644 index 0000000000000..e258d50e97c37 Binary files /dev/null and b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbemm-evo-icc-tempo-option-1.raw differ diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-base-option-1.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-base-option-1.raw new file mode 100644 index 0000000000000..888d21217de8e --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-base-option-1.raw @@ -0,0 +1,19 @@ +MOTDETAT 000000 B + +ADCO XXXXXXXXXXXX 7 +OPTARIF BASE 0 +ISOUSC 20 8 +BASE 001181243 _ +PTEC TH.. $ +IINST1 000 H +IINST2 002 K +IINST3 000 J +IMAX1 026 8 +IMAX2 018 : +IMAX3 027 ; +PMAX 07990 ? +PAPP 00540 * +MOTDETAT 400000 F +PPOT 00 # + +ADCO XXXXXXXXXXXX 7 \ No newline at end of file diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-ejp-option-1.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-ejp-option-1.raw new file mode 100644 index 0000000000000..6ce7b6c901739 --- /dev/null +++ b/bundles/org.openhab.binding.teleinfo/src/test/resources/cbetm-ejp-option-1.raw @@ -0,0 +1,20 @@ +MOTDETAT 000000 B + +ADCO XXXXXXXXXX G +OPTARIF EJP. " +ISOUSC 30 9 +EJPHN 001111111 , +EJPHPM 002222222 B +PTEC HN.. ^ +IINST1 010 I +IINST2 005 N +IINST3 008 R +IMAX1 038 ; +IMAX2 042 7 +IMAX3 044 : +PMAX 17480 : +PAPP 05800 . +MOTDETAT 000000 B +PPOT 00 # + +ADCO XXXXXXXXXX G \ No newline at end of file diff --git a/bundles/org.openhab.binding.teleinfo/src/test/resources/invalid-adps-groupline.raw b/bundles/org.openhab.binding.teleinfo/src/test/resources/invalid-adps-groupline.raw new file mode 100644 index 0000000000000..c5df712bceddd Binary files /dev/null and b/bundles/org.openhab.binding.teleinfo/src/test/resources/invalid-adps-groupline.raw differ diff --git a/bundles/pom.xml b/bundles/pom.xml index 94826cd278514..dbd95ffbe4339 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -248,6 +248,7 @@ org.openhab.binding.tado org.openhab.binding.tankerkoenig org.openhab.binding.telegram + org.openhab.binding.teleinfo org.openhab.binding.tellstick org.openhab.binding.tesla org.openhab.binding.tibber