-------------------------------
cprj_hollywood
-------------------------------
2.1.0
===Experimental version===
POEN client added

2.0.0
===Experimental version===
This version includes POEN use case implementation, which is still a draft specification.
No guarantee of backwards compatibility of the POEN implementation in further versions.
The usage of the MPC use case on a submeter to represent aggregated measurement of all
connected flexibilities is also to be considered as experimental.

UC API version: 19.0.141

1.0.1
- Improve example application
  - Consider when onRemoteCemRemoved is called for an unknown id
  - Add comments

1.0.0
- Initial version
- Usecases
    - Generic: LPC, LPP, MPC
    - Grid: MGCP
    - Emobility:  EVSECC, EVCC, EVCEM, OPEV, OSCEV, EVCS, CEVC

-------------------------------
-------------------------------
upstream modules
-------------------------------
-------------------------------

-------------------------------
keo_spine_usecase_engine_generator
-------------------------------
19.0.141
Bug fixes:
- Emobility:
  - CEVC server gets complete description when CEVC client write an incentive table description
- POEN:
  - Store fallback curves properly in server side
  - Allow write actions from client if, and only if, scenarios are already discovered
  - Allow server backend to explicitly accept/reject data written by a client

Dependencies:
- Depend on keo_spine 21.0.141

19.0.140
- Implement UC POEN v1.0.0 draft3
- Depend on XSD EEBus_SPINE_V1.4.0_beta1

Dependencies:
- Depend on keo_cmake_modules 4.6.0
- Depend on keo_spine 21.0.140

Notes:
The UC POEN requires XSD EEBus_SPINE_V1.4.0_beta1. The EEBUS e.V. uses a branch for this
XSD version. This version was only created for KEO. There is no guarantee that any changes from this
branch will become part of any official XSD release. This may cause interoperability issues! Please
note that the UC POEN is in draft state.

18.0.0
Updates and improvements:
  - Create migration guide Emobility

Bug fixes:
  - Unwanted mappings:
    Fix ID creation for list entries representing variance depending UC datapoints (e.g. phase
    specific currents)
  - Extend comparison conditions in NodeInfo::getUsecases to use case discovery with
    version <= 13.0.0

- C++ API
  - Fix use case discovery in onUsecaseDiscovery
    - Acquire an actor's entity number when adding the actor

- JSON API
  - Fix use case discovery in actorAdded

General:
  - Emobility::activateUsecases() was renamed to Emobility::setEvUsecases().

Dependencies:
  - Depend on keo_spine 20.2.0

17.0.1
Bug fixes:
- JSON API
  - Fix actor management for inverter use cases

17.0.0
Bug fixes:
  - Default COB control mode is now PCC
  - Erase MRCSF dependency in MRT server
  - Minor fixes in documentation

- C++ API
  - Client setters now return core::client::Result to indicate success or
    failure of a write
  - Removed *Result callbacks
  - Add version header file

-JSON API
  - Make empty parentId behave as no parentId
  - Check for ScaledNumber overflows
  - Client use cases now send a de.keo-connectivity.ship.remoteResult message to
    indicate success or failure of a write

General:
  - Remove use case COI
  - MGCP usecase is now in generic domain
  - Remove manufacturerInformation scenario from FSWG
  - Number of simultaneous SHIP connections is now configurable
  - ElectricalImmersionHeater actor is now a child of HeatPump
  - COB server is now able to set the own control mode
  - Remove startTime setter in OHPCF server
  - The following use cases have been updated to the latest available specification version:
    - MPC: V1.0.0
    - MGCP: V1.0.0
    - LPP: V1.0.0
    - MOB: V1.0.0 RC4
    - COB: V1.0.0 RC3
    - ITPCM V1.0.0 RC3
  - Documentation improvements

16.1.2
- C++ API
  - Remove value requirement for alternativesCount for OHPCF scenario 1
  - Remove value requirement for totalSequencesCountMax for OHPCF scenario 1

Bug fixes:
  - PODF server is now sending delete filters when updating forecast

16.1.1
- C++ API
  - Make alternatives optional for OHPCF scenario 1

Dependencies:
- Depend on keo_spine 20.0.1

16.1.0
New functionality
- JSON API:
  - Introduce capability to add and remove Inverter actors
    - Inverter
    - Battery
    - PvString
    - BatterySystem
    - PvSystem

16.0.0
Bug fixes:
  - Remove member activeDurationMax from API type FlexibilitySettings for OHPCF
  - Remove member activeDurationSumMin from API type FlexibilitySettings for OHPCF
  - Remove member activeDurationSumMax from API type FlexibilitySettings for OHPCF
  - Add pauseDurationMin[OHPCF-009] field on API type FlexibilitySettings for OHPCF accordingly
  - JSON API now supports 64 bit values in scaled number
  - MOB UsableCapacityNominalMax is now BatteryCapacityNominalMax

15.0.0
New functionality
  - Use case discovery now includes the sub revision of a usecase (e.g. RC1)

General:
  - Adapt to new keo_logging macros
    - Put Logging content in parenthesis
      Example: LOG_INFO() << "foo"; -> LOG_INFO("foo");
    - Reduce the number of verbose levels to one
      Example LOG_VERBOSE(x); << "foo" -> LOG_VERBOSE("foo");
    - Eliminate redundant/ambiguous macros
      DEBUG_INFO -> LOG_DEBUG
      DEBUG_FUNCTION -> DEBUG_FUNC
    - Change logging level's scope
      keo_logging::Logger::Level::<level> -> keo_logging::Level::<level>
    - Introduce a API_* logging macro
      Shall be exclusively used in keo_uc_api files to enforce
      the logger ID "keo_uc_api"

  - The following Inverter use cases have been updated to the latest available specification version:
    - COI: V1.0.0 RC2
    - COB: V1.0.0 RC2
    - MOB: V1.0.0 RC3
    - MPS: V1.0.0 RC3
    - MOI: V1.0.0 RC3

  - The following Generic use cases have been updated to the latest available specification version:
    - LPP: V1.0.0 RC4
    - LPC: V1.0.0

Bug fixes:
  - PvSystem server actor is now created with obligatory parent entity
  - BatterySystem server actor is now created with obligatory parent entity
  - OPEV and OSCEV use cases can now be deactivated independently
  - MOI client now receives the correct operating state
  - ITPCM server now correctly saves its state

Dependencies:
- Depend on keo_spine 20.0.0
- Depend on keo_cmake_modules 4.4.1
- Depend on keo_json_api_transport_base 1.0.4
- Depend on keo_json_api_transport_websocket 1.8.0

14.0.0
New functionality:
- PODF:
  - Support use case "Power Demand Forecast RC2"
- Introduced Shared Datapoints for LPC, LPP, PODF, COI and COB
  - Refer to the documentation for
    - consumptionPowerLimit
    - consumptionPowerLimitExpired
    - productionPowerLimit
    - productionPowerLimitExpired
    - failsafeConsumptionPowerLimit
    - failsafeProductionPowerLimit
    - failsafeDurationMinimum
    - contractualConsumptionNominalMax
    - contractualProductionNominalMax

General:
  - Move Limit data type from keo::usecase::inverter to keo::usecase
  - The following Inverter use cases have been updated to the latest available specification version:
    - COI: V1.0.0 RC1
    - COB: V1.0.0 RC1
    - MOB: V1.0.0 RC2
    - MPS: V1.0.0 RC2
  - Please note that MOI is still based on version V1.0.0 RC1.
  - A complete update of the inverter use cases is planned for the next release.

Bug fixes:
JAPI:
  - SHIP message transformer no longer locks a mutex
    The previous version used a connection independent mutex which can cause unwanted behavior
    in multi connection scenarios combined with an onTrustCertificate() call

API changes:
  - Generic LPC and COI (C++ & JSON API):
    - powerLimit data point changes name to consumptionPowerLimit
    - failsafeConsumptionActivePower data point changes name to failsafeConsumptionPowerLimit
  - Generic LPP and COI (C++ & JSON API):
    - activePowerProductionLimit data point changes name to productionPowerLimit
    - failsafeProductionActivePower data point changes name to failsafeProductionPowerLimit
  - Allow to activate/deactive the use cases COB, COI, MOB and MOI at runtime
  - Emobility (JSON API):
    - A CEVC server can inform clients of its power limitation curve constraints (additive)
    - A CEVC server can inform clients of its incentive table constraints (additive)

Dependencies:
- Depend on keo_spine 19.0.0

Known issues:
- Deactivating OPEV usecase also deactivates OSCEV, and vice versa

13.0.0
General:
- Introduce a distinct reply code(2) for unexpected JSON API messages

Bug fixes:
- Fix a bug which caused reporting of wrong use cases when the remote actor is discovered
- Always communicate the correct address of local actors in "UseCaseDiscovery"
- Handle all specified manufacturer data elements in EVCC and EVSECC JSON API
- Increase the onTrustCertificate timeout to 230 seconds

12.0.0
API changes:
- Emobility (C++ API):
  - A CEVC server can inform clients of its power limitation curve constraints (additive)
  - A CEVC server can inform clients of its incentive table constraints (additive)

Updates and improvements:
- General:
  - Rework documentation
  - Add DomainType typedef and static EntityType to all server actors
- Generic:
  - Add streaming operator to API type generic::Limit
- HVAC:
  - Pass setpoint constraints as const& in CDT, CRCT, CRHT clients

Bug fixes:
- Inverter:
  - Fix the number of supported scenarios in use case discovery data of COB client
- HVAC:
  - Fix CDSF usecase relating incorrect number of operation modes
- Emobility:
  - Notify full ISCBC "energy request" when specialization is satisfied
  - Writes to CEVC power limitation curve and incentive table are rejected automatically if they contain
    more slots than allowed

Known issues:
- If you are using the use cases LPP and LPC in combination in the same actor, the datapoint
  "failsafe duration minimum" is shared between the two use cases. Special care has to be
  taken for this to work. C++ API users have to refer to the documentation of
  Lpc::setFailsafeDurationMinimum()/Lpp::setFailsafeDurationMinimum() as well as
  Lpc::EventListener::onFailsafeDurationMinimum()/Lpp::EventListener::onProductionFailsafeDurationMinimum().
  JSON API users have to refer to the documentation of the message types
  de.keo-connectivity.generic.lpc.failsafeDurationMinimum and
  de.keo-connectivity.generic.lpp.failsafeDurationMinimum.

11.0.0
New functionality:
- Whitegoods:
  - Support server use case "Flexible Start for White Goods RC1" (previously
    only supported client).
API changes:
- C++ API:
  - The type-specific getter methods in child actors (e.g. Ev::getEvseId(),
    Battery::getInverterId()) to get the ID of the parent actor, have been deprecated. The
    generic getParentId() should be used instead (e.g. Ev::getParentId()).
- Emobility:
  - The strings identifying use cases in the onScenarioSupport callbacks (or in
    the case of JSON API the message type
    "de.keo-connectivity.discovery.scenarioSupport") have been changed to match
    the corresponding strings in the use case discovery:
      - CEVC: from "coordinatedEVCharging" to "coordinatedEvCharging"
      - EVCEM: from "eVChargingElectricityMeasurement" to
        "measurementOfElectricityDuringEvCharging"
      - EVCS: from "eVChargingSummary" to "evChargingSummary"
      - EVCC: from "eVCommissioningAndConfiguration" to
        "evCommissioningAndConfiguration"
      - EVSECC: from "eVSECommissioningAndConfiguration" to
        "evseCommissioningAndConfiguration"
      - EVSOC: from "eVStateOfCharge" to "evStateOfCharge"
      - OSCEV: from "optimizationOfSelfConsumptionDuringEVCharging" to
        "optimizationOfSelfConsumptionDuringEvCharging"
      - OPEV: from "overloadProtectionByEVChargingCurrentCurtailment" to
        "overloadProtectionByEvChargingCurrentCurtailment"
- Whitegoods:
  - Added server actors Dryer, Washer, Dishwasher
- HVAC:
  - VURA has been removed (use NID instead)
- Simplified thread model w.r.t. incoming datagrams. EventListeners and DiscoveryListeners are
  now called in the same thread context. See chapter "Threading Model > UC API > Outgoing SPINE
  datagram" in the doxygen documentation to find out more.

Updates and improvements:
- SHIP:
  - Support OpenSSL configuration with disabled engine support
- Generic:
  - LPP:
    - Implementation is now based on RC3
  - NID:
    - Implementation is now based on RC1
- Whitegoods:
  - FSWG:
    - Client implementation is now based on RC1
    - Client now offers (optional) "Use Case Discovery"
    - Make JSON API schemas more strict
- JSON API:
  - Any client-side message sent to change a value at a server is now replied to with a NACK
    if the client was not able send a request to the server

Bug fixes:
- General:
  - Fix racing conditions on remote actor objects
- Emobility:
  - Reject setting invalid limit data in OPEV and OSCEV
  - Accept OPEV/OSCEV constraints without a "range" in clients
- Whitegoods:
    - Fix a bug that prevented onSmartApplianceRemoved callbacks from being called
- Generic:
  - Fix a bug related to LPC's client setters and *Result callbacks
  - Reject writes to LPC failsafe power limit and failsafe duration minimum with correct
    errorNumber ("Command rejected")
  - Communicate all errorCodes != OK as a NACK in LPC and LPP
- JSON API:
  - Fix ID in schema file (de.keo-connectivity.ship.addBlacklistEntry.schema.json)
- Mockup:
  - Remove timeout mechanism in websocket transport (this allows to send more than 1/5s messages)
  - Allow to specify custom port in MQTT transport

Dependencies:
- Depend on keo_spine 18.2.0

10.0.0
New functionality:
- General:
  - The server use cases OPEV, OSCEV, MGCP, VAPD, VABD can now be deactivated during runtime. See
    doxygen main page for a general explanation. If you are a C++ API user also refer to chapter
    "Threading Model > UC API > Outgoing SPINE datagram".
- Grid:
  - Support use case "Time of use tariff RC1".

API changes:
- The callbacks onNewScenariosSupported and onScenariosUnsupported are combined together
  as a single callback namingly, onScenarioSupport. Also, a convenience class ScenarioSupport
  is added, which maps the usecase names to scenarios to sub-scenario identifiers.
  Additionally, this functionality is now also exposed via JSON API.
- BatterySystem and PvSystem are no longer modelled as child actors in clients
- JSON API:
  - For ITPCM incentive table description tiers, the required property "inentive" has been
    renamed to "incentive"
  - For ITPCM power plan slots, the required property "start" has been renamed to "startTime"
  - The message type "de.keo-connectivity.usecaseDiscovery" has been renamed to
    "de.keo-connectivity.discovery.usecaseDiscovery"

Updates and improvements:
- General:
  - Synchronization in server actors has been reworked to avoid several data races
- Generic:
  - LPC:
    - Implementation is now based on RC7
  - TOUT:
    - Implementation is now based on RC1
- JSON API:
  - Grid:
    - Remove POEN message types from message.schema.json (the use case is not yet implemented)
  - SHIP:
    - Remove obsolete file de.keo-connectivity.ship.serverEnabled.read.schema.json

Bug fixes:
- General
  - Avoid possible data races when sending requests from a client
  - Allow results/timeouts of sent writes to be delivered to all interested use cases
  - Allow clients to discover child actors even without parent actors
  - Fix URI hostname validation in line with RFC 1123
- HVAC:
  - Set current power sequence state in OHPCF replies
  - Fix the element "function" in CDSF writes
- JSON API:
  - A *Result message that is sent within the timeout will now be replied to with an ACK
  - Generic:
    - Add schema branch for generic.errorState
  - Emobility:
    - Fix documentation of iscbc.activePowerTotalSetpointResult
  - HVAC:
    - Add schema branches for OHPCF and ITPCM
    - Add schema branch for cdsf.supportedOperationModes
    - Require property "incentive" instead of "inentive" in incentiveTableDescriptionTier
    - Change "oneOf" to "anyOf" for ohpcf.flexibilitySettings
  - SHIP:
    - Fix two typos in message.schema.json

Dependencies:
- Depend on keo_spine 18.1.0

Known Issues:
- Deactivating OPEV or OSCEV on an EV (server) does not lead to any sort of indication towards the
  CEM regarding scenario 2 (heartbeat) and 3 (error state). Consequently, the EV will most likely
  continue to receive heartbeats and updated error states from the CEM. Deactivating scenario 2
  (heartbeat) and 3 (error state) currently is not supported.

9.0.0
Updates and improvements:
- Inverter:
  - COB:
    - Some of the COB draft3 requirements were not implemented in Use Case API 7.
      The implementation is now almost fully in line with spec version draft3
      with one exception:
    - Scenario 4.4 (failsafe duration minimum) is currently not supported.
  - COI:
    - Some of the COI draft3 requirements were not implemented in Use Case API 7.
      The implementation is now almost fully in line with spec version draft3
      with one exception:
    - Scenario 4.7 (failsafe duration minimum) is currently not supported.

Bug fixes:
- Add missing includes in use cases using heartbeat functionality
- Avoid crashes when receiving datagrams sent with fake device names

8.1.0
Improvements:
- General:
  - Improve logging and documentation
  - Rework binding management in servers
    - For HVAC use cases (CDSF, CDT, CRCSF, CRCT, CRHSF, CRHT, MCSGRC) no binding is
      required for the client to write data to the server
    - For all use cases using a SmartEnergyManagementPs feature, a binding is required for
      the client to write data to the server, and the binding is exclusive
    - For all other use cases a binding is required to write data to the server, but the
      binding is not exclusive
  - Add "unappend" mechanism to actors and use cases, this is currently used for two
    things:
    - Delete subscriptions/binding of actors that are being removed (i.e. send
      nodeManagementSubscriptionDeleteCall/nodeManagementBindingDeleteCall)
    - Explicitly deregister actors and use cases from lower SPINE layers
- C++ API:
  - Allow to modify the list of supported scenarios of individual use cases in the SPINE
    use case discovery
- Mockup:
  - Make topics configurable when using MQTT transport

Bug fixes:
- General:
  - Avoid concurrent access to several internal members
  - Add entity of an actor to device only when actor the fully initialized
  - Add sanity checks regarding selector types in all client use cases
  - Correctly communicate when a client does not handle a datagram
- JSON API:
  - Fix parsing of IncentiveType (CEVC, ITPCM)
- Mockup:
  - Make parentId optional for MPC commands
- Emobility:
  - Align API type ChargingSummary and EVCS transformer with specification
- HVAC:
  - Fix typo in VHAN use case discovery
  - Allow to use generic use cases with ElectricalImmersionHeater
- Inverter:
  - Fix a potential bug in extracting MOI yields from notifications
  - Update device model when adding/removing PvSystem or BatterySystem

Dependencies:
- Depend on keo_spine 18.0.3

Known Issues:
- nodeManagementSubscriptionDeleteCall/nodeManagementBindingDeleteCall is not handled
  correctly when the receiver of the call is the client in the binding/subscription

8.0.6
- Build system: Fix bug in source package generation

8.0.5
Bug fixes:
- JSON API documentation:
  - Fix the label of the SHIP API page and the link to it on the main page
  - Improve the structure of the SHIP API page

8.0.4
Bug fixes:
- Emobility:
  - Declare dependency between CEVC and API type IncentiveType

8.0.3
Updates and improvements:
- General:
  - Avoid inclusion of unrelated documentation
  - Avoid inclusion of unrelated API types
- Mockup:
  - Improve OHPCF interface
  - Fix MPC commands
- Generic:
  - Implement onProductionPowerLimitResult callback in LPP

Bug fixes:
- HVAC:
  - Correctly parse received power values in OHPCF

New functionality:
- JSON API:
  - Notify received NodeManagementUseCaseData in server applications

Dependencies:
 - Depend on keo_spine 18.0.2

8.0.2
- Build system: Fix Json API documentation verify step

8.0.1
Updates and improvements:
- General:
  - Improve documentation
  - Fix several minor bugs in mockup
- Emobility:
  - Set unit in EVSOC scenario 2 (nominal capacity)
  - Fix identifier allocation in EVSOC electricalConnectionCharacteristicData
  - Allow to explicitly accept/reject ISCBC setpoints in JSON API server
- Inverter:
  - Fix declared version of COB and COB (both are draft3)
- HVAC:
  - Always set pausable and stoppable flag in OHPCF

8.0.0
New functionality:
- Emobility:
  - Support use case "Increase of Self-Consumption by bi-directional EV Charging V1.0.0 RC1".
- Generic:
  - Support use case "Limitation of Power Production V1.0.0 RC1".

Updates and improvements:
- General:
  - Improve documentation and logging
  - Minor refactorings

Dependencies:
- Upgrade to keo_spine 18.0.1

7.0.1
Improvements:
 - Improve documentation

7.0.0
New functionality:
- Emobility:
  - Support use case "EV State of Charge V1.0.0 RC2".
- HVAC:
  - Support use case "Incentive-Table based power consumption management V1.0.0 RC2".

Updates and improvements:
- General:
  - Document the threading model used by the KEO libs (see chapter "Threading Model" in the
    KEO Use Case API documentation)
  - Improve documentation and logging
  - Move emobility API type IncentiveType to core
  - Do not discover remote actors that do not offer real functionality (i.e. do not
    discover a remote actor that only supports "Heartbeat" and nothing else)
  - A client CEM actor is now able to discover remote actors even when it is added after
    the initial discovery of the remote has completed
- Inverter:
  - COI:
    - The implementation is now based on spec version 1.0.0 draft3
    - This use case now must be used with the pseudo use case "Heartbeat"
  - COB:
    - The implementation is now based on spec version 1.0.0 draft3
    - This use case now must be used with the pseudo use case "Heartbeat"
- Emobility:
  - OSCEV:
    - Deny writes containing a limit for a non-existing phase
    - Always notify full limits to API when receiving a write for the limits
- Generic:
  - Do not handle reply datagrams as heartbeats in HeartbeatReceiver when used in server
    actors

Bug fixes:
- C++ API:
  - Fix a segmentation fault caused by trying to send on a transport connection that is
    currently being closed
  - Fix segmentation faults caused by uninitialized pointers in OPEV, OSCEV and Compressor

Dependencies:
- Upgrade to keo_spine 18.0.0

6.1.1
Dependencies:
- Upgrade to keo_spine 17.0.2

6.1.0
Updates and improvements:
- UCCOM:
  - Support connecting to a peer by ShipService information
  - Improve documentation for connectTo()
- General:
  - Provide a client's NodeManagementUseCaseData information to a server-side UC API user
- HVAC:
  - MCSGRC:
    - The implementation is now based on spec version 1.0.0_RC1_7280_20210608. There are no
      technical changes in comparison to the previous spec version 1.0.0_draft2_6218_20200306.

Bug fixes:
- C++ API:
  - Remove an obsolete std::function wrapper which could throw an exception
  - Fix a potential segmentation fault caused by accessing an iterator of an empty container

6.0.1
Dependencies:
- Upgrade to keo_spine 17.0.1

6.0.0
Breaking changes have been made to the use cases MPC, LPC, MGCP, and MOI. Applications must be
adapted accordingly. This applies to the C++ API as well as the JSON API.

Updates and improvements:
- Generic:
  - MPC:
    - The implementation is now based on spec version 1.0.0_RC2_7219_20210519
    - Use type Measurement instead of Number to communicate valueState
    - Do not initialize values as (value=0, valueState=error). Values not set by the server are
      now empty.
  - LPC:
    - The implementation is now based on spec version 1.0.0_RC5_7274_20210602
    - Reject negative limits in scenario 1
    - Reject negative failsafe consumption limits in scenario 2.1
    - Reject negative nominal max values in scenario 4
    - Remove production-related functionality
  - Remove timestamp in heartbeat from the JSON API. From now on it is not possible to set the
    timestamp or receive it.
- Grid:
  - MGCP:
    - The implementation is now based on spec version 1.0.0_RC7_7219_20210519
    - Use type Measurement instead of Number to communicate valueState
    - Do not initialize values as (value=0, valueState=error). Values not set by the server are
      now empty.
    - Align presence indications of API types and schemas with specification
  - Accept Submeter and DSO use cases in grid::Cem
- HVAC:
  - OHPCF
    - The implementation is now based on spec version 1.0.0_RC2_7207_20210518
  - Add new actor ElectricalImmersionHeater
- Inverter:
  - MOI:
    - Use type Measurement instead of Number to communicate valueState
    - Do not initialize values as (value=0, valueState=error). Values not set by the server are
      now empty.
- General:
  - Improve logging
  - Minor refactorings
  - Only include API types required by the activated use cases. Previously, domains always included
    all of their API types.
  - Allow to call setters on all server actors that have not been added to a device
  - Disallow MPC for grid::server::Cem
  - When defining a client CEM it is now possible to specify which generic use case is to be
    executed with which remote actor. Where previously Cem<Lpc> was enough, it is now required to
    specify it as Cem<ForSubmeter<Lpc>::usecase> or Cem<ForAny<Lpc>::usecase>, depending on your
    implementation. Refer to generic/client/usecase/lpc/Lpc.h or generic/client/usecase/mpc/Mpc.h.
  - The KEO stack will now always set the element "scale" in ScaledNumbers
  - Add information about implemented use case specification versions and implemented scenarios
    - In the documentation package (human readable)
    - As JSON file "UseCaseVersions.json" (machine readable)
- Mockup:
  - Allow to automatically send periodic heartbeats
  - Allow to send evcs.chargingSessionSummary

Bug fixes:
- C++ API:
  - Only discover an actor if it has features to satisfy a specialization
  - Fix a deadlock when setting LPC power limit
  - Fix a bug where the initial actor discovery failed when the remote answered too fast
  - Fix a bug in CDT, CRCT, CRHT where setters could not be called even though the corresponding
    specialization was satisfied
  - Use IDs >= 1 in Emobility incentive tables. This is to ensure compatibility with devices in the
    field that are not spec-compliant.
- JSON API:
  - Remove obsolete schema evsecc.errorState

Dependencies:
- Upgrade to keo_spine 17.0.0

5.1.1
Bug fixes:
- JSON API:
  - Fix path validation in class URI

Dependencies:
- Upgrade to keo_spine 16.6.1

5.1.0
New functionality:
- Add OpenSSL cryptographic engine support

Bug fixes:
- C++ API:
  - Catch uncaught exceptions
  - Allow limitation of a single phase in OPEV/OSCEV at all times
  - Fix construction of write datagrams in COB client
  - Fix a deadlock that could hapen when receiving multiple detailed discoveries during actor discovery
- JSON API:
  - Remove child actors when removing a parent

Improvements:
- General:
  - Extend unit tests
  - Update logging and documentation
  - Allow to specify an SNI server name in connectTo()
  - Make CRCSF and CRHSF client behave the same as CDSF client
- C++ API:
  - Make transport IDs in UcComConnector unique
  - Discover HVAC actor Compressor as a child of HeatPump
  - Refactor class Uri
  - Handle SHIP initialization errors
  - Copy less objects in actor discovery
  - Do not add redundant, human-readable description to CEM entity
  - Add sanity checks in all client setters
- JSON API:
  - Set server name when connecting via addPreTrustEntry

Dependencies:
- Upgrade to keo_spine 16.6.0

5.0.1
New functionality:
- HVAC:
  - Support use case "Visualization of Human Readable Appliance Data". This is not an official EEBUS
    use case yet. It is based partly on "Optimization for optional Heat Pump Electrical Power
    Consumption" in EEBus_UC_TS_HighLevelUseCaseSpecification_3961_20180123, partly on a proposal of
    an EEBUS member.

Bug fixes:
- C++ API:
  - Fix a bug where MGCP client crashed on incorrect datagrams

5.0.0
New functionality:
- HVAC:
  - Support actor Compressor
  - Support VHAN for servers. The implementation is based on spec version 1.0.0_RC1_6025_20191210.
  - Support OHPCF. The implementation is based on spec version 1.0.0_RC2_WIP_7150_20210504.
- Inverter:
  - Support MPS, VABD, VAPD, COB, and COI in JSON API
- Grid:
  - Support actor CEM-as-server

Improvements:
- General:
  - Improve documentation and logging
  - Extend unit tests
  - Allow to set and receive MeasurementConstraints in MOT, MDT, MRT, MPC
  - Allow to set and receive MeasurementValueState in VABD, VAPD, MGCP, MOT, MDT, MRT
  - Restructure whitegoods CEM
- JSON API:
  - When parent not found throw with helpful message
  - Make child actor IDs reusable
  - Use only lower case phase names
  - Rename mps.internal to mps.internalTemperature
- Mockup:
  - Allow to send powerLimitResult and powerLimitExpired
  - Allow to reply to lpc.powerLimit messages automatically
  - Add "grid" prefix to MGCP commands
  - Rename fs to fswg
  - Finish implementing COB and COI

Bug fixes:
- C++ API:
  - Correctly mark MeasurementValueState in VABD as "recommended", not "mandatory"
  - Set required element MeasurementValueState in VAPD
  - Fix return value of setters in LPC server
  - Catch exceptions in client::Mgcp
  - Fix a bug where a missing heartbeat listener crashed applications
  - Always set all identifiers in partial updates in MDT and MRT
  - Correct entity structure for HvacRoom server actor
  - Fix scheduling of azimuth values in MPS server
  - Fix notifying yield in VAPD
  - Update "Use Case Discovery" when adding a sub-actor
  - Rework partial/delete handling
    - Clients now send writes containing delete filters (LPC, CEVC, EVCS), servers can handle them
    - Servers now send notifications containing delete filters (EVCC, CEVC, MOI, COI), clients can handle them
  - Send non-list data (e.g. DeviceClassificationManufacturereData) as full notification
  - Do not allow to recursively add Heatpumps as child actors of Heatpumps
  - Use correct use case versions in use case discovery
- JSON API:
  - Allow TTL of 0 for LPC limits
- Mockup:
  - Fix parsing of errorState message args
  - Reply to onValidatePin messages with a relation id

Dependencies:
- Upgrade to keo_spine 16.5.0

4.19.0
Improvements:
- Set the useCaseAvailable flag to true in E-Mobility, Generic, Grid, HVAC, and Inverter clients
  instead of omitting it. This eases interpretation of the use case support data.
- Fully qualify members of the namespace std::placeholders in std::bind calls. This prevents
  ambiguous reference errors in environments where additional libraries like Boost are used.

4.18.0
Important notice: it is no longer required by the API to set LPC failsafe limits before adding the
respective actor to the device. Nonetheless, it is vital for the server to set at least one
failsafe limit to stay compliant with the use case. Therefore, please set the failsafe limit
immediately after adding the actor.

Bug fixes:
- Fix a bug where detailed discovery updates and partial notifications could interfere with the
  initial discovery process of an actor (i.e. binding/subscription requests and initial reads).
  This bug could make the client skip required binding requests, leaving it unable to write.
- Fix a bug where CEVC writes contained incorrect IDs
- Fix message type in LPC client transformer
- Make the client correctly consider sub-identifiers

Improvements:
- Update Documentation and logging
- Do not have the server require CEVC updates by default
- State that slotIds are used in CEVC descriptions
- Make child actor IDs reusable in the JSON API
- Allow LPC/MPC to be used with EVSEs
- Remove scenario 2 (ErrorState) from EVSECC. Use generic/Heartbeat instead.

Dependencies:
- Upgrade to keo_spine 16.4.0

4.17.2
Bug fixes:
  - Consider useIP flag during adding pre trust handling
  - Fix definition of ShipService::getIpAddress()

4.17.1
Bug fixes:
  - Send proper partial replies
  - Do not throw when no specialization is configured for a discovered actor
  - Correctly assign active flag in the UCA Limit class
  - Fix requireBillUpdate command in the mockup

Improvements:
  - Improved performance (optimization of JSON handling)

4.17.0
New functionality:
- Grid:
  - MGCP:
    - The implementation is now based on spec version V1.0.0_RC6_6454_20200820

Bug fixes:
- Inverter:
  - Fix a bug where MOI client failed to notify "identifications"
  - Fix a bug where MOI client notified unrelated data when the "battery availability"
    changed
  - Fix bugs in validation of MOI data
  - Fix default supported phases in actor Submeter
- HVAC:
  - Allow CRCT and CRHT to be used in the same actor
- E-Mobility:
  - Fix a bug where EVCS client did not notify a received "charging summary"

Improvements:
  - Fix typos in documentation
  - Add paho-mqtt to mockup requirements

Known issues:
  - MOB client may notify battery's nominal maximum charge power (onDcChargePowerNominalMax,
    de.keo-connectivity.inverter.mob.dcChargePowerNominalMax) and battery's nominal maximum
    discharge power (onDcDischargePowerNominalMax,
    de.keo-connectivity.inverter.mob.dcDischargePowerNominalMax) multiple times

4.16.2
New functionality:
- Implement inverter server transformers for MOB and MOI

Bug fixes:
- Fix a wrong element in MOB client transformer
- Fix historical yields and acBatteryTimes in mockup

Improvements:
- Fix typos in COI/MOI JSON docs

Dependencies:
- Upgrade to keo_spine 16.2.1

Known issues:
- MOI client may notify different capabilities than the ones received
- MOI client may fail to notify received "identifications"
- MOB client may invoke certain callbacks twice

4.16.1
Bug fixes:
- Set isSetpointChangeable on read in COI scenario 3
- Fix inverter.coi.reactivePower message creation in mockup
- Fix key id to match in COI scenario 5.2

JSON API:
- Allow and require parentId in MPS schemas
- Allow and require parentId in MOB schemas

4.16.0
New functionality:
- HVAC:
  - Implemented all "System Function" and all "Temperature" use cases
    - This includes
        - MRT (Monitoring Of Room Temperature)
        - MRCSF (Monitoring Of Room Cooling System Function)
        - MRHSF (Monitoring Of Room Heating System Function)
        - CRCT (Configuration Of Room Cooling Temperature)
        - CRHT (Configuration Of Room Heating Temperature)
        - CRCSF (Configuration Of Room Cooling System Function)
        - CRHSF (Configuration Of Room Heating System Function)
        - MDT (Monitoring Of DHW Temperature)
        - MDSF (Monitoring Of DHW System Function)
        - CDT (Configuration Of DHW Temperature)
        - CDSF (Configuration Of DHW System Function)
        - MOT (Monitoring Of Outdoor Temperature)
    - Client and server are implemented in the C++ API, JSON API and mockup
    - The implementations are based on spec versions V1.0.0 RC1
- Inverter:
    - Update COI to draft 2 (V1.0.0_draft2_6390_20200711)

Bugfixes:
- Fix several use case clients that could treat unrelated data offered by a server as relevant
- Fix use case version in nodeManagementUseCaseData of several use cases
- Allow bidirectional heartbeat to be used with all HVAC actors
- Fix CEVC slot length in mockup's incentive table

Improvements:
- Avoid unnecessary copies of shared_ptr
- Extend log messages when validating specializations
- Remove JobRunner from RemoteEngineActor

JSON API:
- Update documentation
- Fix MCSGRC transformer to match schema

Dependencies:
- Upgrade to keo_spine 16.2.0

Known issues:
- Only one of CRCT and CRHT can be used at the server simultaneously
- Based on the data offered by a CDSF server it is not possible to differentiate scenario 2
  and 3. Consequently, a client cannot tell whether a server supports one or both scenarios.
  Our implementation always assumes that scenario 2 is supported. This should be considered
  in the onNewScenariosSupported/onScenariosUnsupported callbacks. This is not an issue with
  the implementation but the specification.

4.15.4
Fix parsing of EvCommunicationStandard from a string

4.15.3
Fix tiers in CEVC use case

4.15.2
API changes:
- Add callback onIncentiveTableWriteable in CEVC
- Consistently model errorState as a boolean flag (EVSECC)

Bugfixes:
- Fix start and end times in CEVC, EVCS
- Set timeSeriesSlotIds in TimeTables
- Interpret omitted timeSeriesSlotIds as zero
- Invoke callback onIncentiveTableDescription in CEVC
- Catch exception when converting incentive table to API type
- Mark SKI in message trustedNodes as required
- Detach removed toplevel actors from the domain on actorRemove
- Allow to send generic heartbeat and errorState in mockup

Known issues:
- After a CEM has written a charging summary to an EVSE, the CEM may miss
  notifications that the EVSE has accepted the charging summary.

4.15.1
Document the generic heartbeat use case

4.15.0
TL;DR:
This release serves three main purposes:

1. Improve the overall consistency and quality of the UC API
2. Improve the quality of e-mobility use case implementations
3. Provide some new HVAC functionality

New functionality:
- HVAC:
  - CRCSF (Controlling of Room Cooling System Function)
    - Client and server are implemented in the C++ API.
    - The implementation is based on spec version V1.0.0_RC1.
  - MDT (Monitoring of DHW Temperature)
    - MDT is now supported in the JSON API mockup.
  - MRT (Monitoring of Room Temperature)
    - The client is now implemented in the C++ and the JSON API.
    - The implementation is based on spec version V1.0.0_RC1.
- Generic: Add server actor submeter

API changes:
- Make the spelling of pMin and pMax consistent in the JSON API
- Use seconds instead of milliseconds for timestamps in emob JSON API
- Return significand as a long long integer in class core::Number
- Add SKI to JSON message ship.trustedNodes
- Do not invert EVSECC error flag in JSON API
- Change JSON message type for generic heartbeat usecase
  Note: This affects e-mobility and generic use cases.
- Make SecurityInterface::setTrustLevel and ::revokeTrust return bool
- Make TrustLevel::operator== const
- Return bool from sendHeartbeat
- Remove unused API type grid::Limit
- Throw invalid_argument instead of logic_error in core::AcDetails

JSON API:
- Fix do_emobility_cevc_powerLimitationCurve in the mockup
- Allow leaving out actors in server transformers
- Remove emob.cem.heartbeat and ...errorState functions from the mockup
- Correctly construct PowerLimitationCurve in CEVC server transformer
- Check if optional values are set in CEVC client transformer
- Only set values when they are in the message in CEVC
- Implement numerous e-mobility callbacks that are optional in the C++ API
- Refactor mockup tool
- Document that destUri is empty for the SHIP server node
- Enable notifying parentId for emobility and inverter client transformers
- Do not use random values in JSON API example's SHIP announcements
- Simplify emob manufacturer information schemas
- Fix removePreTrustEntry schema and example
- Remove exception handling from Emob CEM transformer
- Align emob manufacturer information schemas with API types
- Test and fix payload handler for IncentiveTable
- Test and fix payload handler for PowerLimitationCurve
- Restructure E-Mobility client transformers
- Do not catch out_of_range in client transformers
- Fix Removing of actors
- Port grid server transformer to the new system
- Reply NACK consistently for erroneous messages
- Allow registering multiple handlers for the same type
- Nack when EVCC communication standard could not be set
- Do not ack failed attempts to add a JSON API actor
- Port grid transformer to the new JSON API format
- Fix messenger in FswgClientTransformer

Bug fixes:
- Schedule correct data in CEVC server
- Fix conversion of start time in TimeTable
- Remove incentiveTableConstraints from E-Mob JSON server documentation
- Fix do_command and extend its documentation in the JSON API mockup
- Fix log-info on data exchange enabled
- Fix removing of bindings
- Fix MOT client
- Simplify and fix pre trust handling
- Catch invalid_argument of API type in LPC server
- Add pre trust before establishing the connection
- Don't dispatch a heartbeat data with unset HeartbeatTimeout
- Correctly merge static use case information in emobility
- Fix connection handling in UC COM
- Allow loops to continue on exception in EVCEM client adapter
- Close the SHIP connection in case of a dd-read failure
- Fix scenario function type for OPEV limits
- Fix EVCC asymmetric charging support notifications
- Fix operating state for EV sleep mode
- Fix return value evaluation of LPC client setters
- Fix conversion of KeoDuration to seconds in LPC
- Fix filter handling for BillData in EvseProvider
- Fix scaled number transformation in EVCEM server transformer
- Set position IDs in BillData for EVCS

Improvements:
- Notify scenario functions of a common list together
- Use asLargestUInt for time related numbers in transformers
- Make BatterySystem, PvSystem top level actors
- Log message when no suitable feature could be found for a specialization
- Use keo_datagram's selects method instead of lambda
- Consistently specify use case version as "RC1" in hvac clients
- Do not mark implementation of example SecurityInterface private
- Extend documentation of SecurityInterface
- Make JsonTrustStore::setTrustLevel deny invalid trust values
- Check certificate validity in UcComShipSecurity::setTrustNode()
- State remote actor in client use cases and use it in UC discovery
- Fully fill out use case data in use case
- Get rid of std::regex for UUID validation
- Reduce scope of exception handling in client adapters
- Catch API type exceptions in HVAC client adapters
- Refactor UC-COM
- Restructure EMobility CEM
- Update logs in specialization classes
- Add conversion to and from strings to Number
- Add exception handling in MPC client adapter
- Handle potential exception for ChargingSummary conversion
- Document that ChargingSummary conversion might throw

Dependencies:
- Upgrade to keo_spine 16.0.0

4.14.0
New functionality:
- Generic:
    - LPC:
        - The implementation is now based on spec version V1.0.0_RC1_6453_20200820
        - Introduce pseudo use cases HeartbeatSender and HeartbeatReceiver to
          implement bidirectional heartbeats

JSON API:
- Extend logging in emobility transformers
- Check weak pointers after calling lock()

Note: applications using the JSON API require at least release 1.13.0
      of the schemas.

Bug fixes:
- Fix version of customer projects
- Fix conversion of absolute to relative times in SmartEnergyManagementPs

Improvements:
- Extend logging
- Do not use string constructors of keo_datagram enums
- Generalize and reuse CemAdapters

4.13.0
New functionality:
- Generic:
  - LPC (Limitation of Power Consumption)
    - The implementation is now based on spec version V1.0.0_RC1_6453_20200820
    - The server now denotes the denial of an incoming power limit value with
      error number "7" (command rejected) as required by the specification
    Known issues:
    - The implementation of heartbeat functionality (scenario 3) is work in progress

JSON API:
- Add support for LPC
- Add JSON API example applications for E-Mobility and HVAC

Note: applications using the JSON API require at least release 1.13.0
      of the schemas.

Bug fixes:
- Handle DHW circuits and OTS in HVAC transformer's attach()
- Fix range conversion in emobility::Constraints
- Handle power measurements correctly in EVCEM
- Fix EVCEM use case support information

Improvements:
- Clarify documentation in UcComConnector
- Simplify connector shutdown in all examples

Dependencies:
- Upgrade to keo_spine 15.1.0

4.12.0
Disabled / removed functionality:
- Disable use case COI temporarily due to a conflict between XSD and specification
- Remove use case GPCL which will be superseded by LPC

New functionality:
- Generic:
  - LPC (Limitation of Power Consumption)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_draft2_6370_20200629.
    Known issues:
    - Scenario 1: The server denotes the denial of an incoming power limit value
      with error number "1" (general error) instead of "7" (command rejected).
  - MPC (Monitoring of Power Consumption)
    - The implementation is now based on spec version V1.0.0_draft5_6346_20200612.
- HVAC:
  - MCSGRC (Monitoring and Control of Smart Grid Ready Conditions)
    - The server-side JSON API is now implemented.
  - MDSF (Monitoring of DHW System Function)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_RC1.
  - MDT (Monitoring of DHW Temperature)
    - The server is implemented.
    - The implementation is based on spec version V1.0.0_RC1.
  - MOT (Monitoring of Outdoor Temperature)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_RC1.
  - MRT (Monitoring of Room Temperature)
    - The server is implemented.
    - The implementation is based on spec version V1.0.0_RC1.
  - MRCSF (Monitoring of Room Cooling System Function)
    - The client- and the server-side JSON API are now implemented.
  - MRHSF (Monitoring of Room Heating System Function)
    - The client- and the server-side JSON API are now implemented.
  - CRCT, CRHT (Controlling of Room Cooling / Heating Temperature)
    - Work in progress, planned for a future release.

- Treat Heartbeat scenario as a pseudo use case
  A generic solution for heartbeat scenarios is provided for server and client.
  Hearbeat comes as a stand alone pseudo use case which can be added to the list
  of supported use cases of any actor.

- Add actor Submeter to domain grid to be used with generic use cases MPC and
  LPC. Note that currently nodeManagementUseCaseData of the MPC and LPC server
  cannot be related to the actor Submeter. Consequently, the use case infos
  contained in the actor object will always be empty.

- Add a grid example that demonstrates generic usecases

JSON API:
- Handle incentiveTable(Description) messages
- Remove the trust level from preTrust JSON messages
- Extend JSON API message tests
- Use cloud events spec version 1.0
- Refactor a number of JSON transformers
- Consistently use "nodeId" instead of "shipId" in SHIP JSON transformer
- Call SmartGridReady conditions "condition" instead of "state"
- The element 'scale' of 'scalednumber' now must be set. No default value of 0 is
  assumed anymore.

Note: applications using the JSON API require at least release 1.12.0
      of the schemas.

Bug fixes:
- Fix actor type in PvStringContainer
- Notify scheduled voltage data in MPC server
- Forget detailed discovery and supported use cases of removed devices
- Make the "User Input" trust level static
- Fix apparentPowerProductionNominalMax optional value check in MOI server
- Fix DC voltage notifications in MOB server
- Fix usable capacity notifications in MOB server
- Fix internal temperature notifications in MPS server
- Fix voltage and energy notifications in MPS server
- Use "GridConnectionPoint" instead of "GCP" as actor name
- Correctly set AcBatteryDischargePowerNominalMax in MOI server
- Fix MPC client use case support data

Dependencies:
- Upgrade to keo_spine 15.0.0

Note: the upgrade to keo_spine 15.0.0 contains an API change because
      the logger implementation was extracted into a separate library.
      Logging-related headers must now be included via "keo_logging"
      instead of "keo_util".

Improvements:
- Refactor remote actor discovery in clients
- Document what the "PreTrust" methods do
- Add missing doxygen group for DHW circuit use cases
- Match setter and callback names for CEVC, EVCS
- Match setter and callback names for VABD, VAPD
- Match setter and callback names for MOB
- Clean mock CEMs in unit tests
- Fix mappping of use case names to discovered remote actors
- Clean the emobility examples

4.11.3
Bug fixes:
- Fix EVCEM use case support information

Dependencies:
- Upgrade to keo_spine 14.4.1

4.11.2
Bug fixes:
- Fix the handling of measurement values in EVCEM server

4.11.1
Bug fixes:
- Fix apparentPowerProductionNominalMax optional value check in MOI server
- Fix DC voltage notifications in MOB server
- Fix usable capacity notifications in MOB server
- Fix internal temperature notifications in MPS server
- Fix voltage and energy notifications in MPS server

4.11.0
New functionality:
- Include general information about remote actors (SHIP ID, SKI, SPINE device name
  and list of supported use cases) in RemoteActor objects (see
  RemoteActor::getNodeInfo())
- Add scenarios 2, 3, and 4 to MPC client and server for both C++ and the JSON API
  Please note that MPC server functionality is still limited to HeatPump actors.
- Update MPC to draft 3 (V1.0.0_draft3_6249_20200324)

JSON API:
- Use designated discovery messages for actors (de.keo-connectivity.actorAdded and
  de.keo-connectivity.actorRemoved) in all domains
- Actor discovery messages now contain general information about the discovered
  actor (SHIP ID, SKI, SPINE device name and list of supported use cases)
- Implement JSON transformers for MPC server

Note: applications using the JSON API require at least release 1.11.0
      of the schemas.

Bug fixes:
- Fix a clash in MOI between battery AC discharge power max and battery AC discharge
  nominal power max
- Check if manufacturerInfo is empty before firing callback in MOB client
- Pass filters to the merge method for non-list datagram classes
- Make valueSource mandatory for MPC scenario 2
- Correct handling of relative end time in grid limit
- Correctly handle "full write" datagrams
- Fix validation of ManufacturerInformation in MOI and MOB
- Set default values that are explicitly specified in COI server

Dependencies:
- Upgrade to keo_spine 14.4.0

Improvements:
- Use "LocalGridControl" instead of "LGC" as actor name
- Log debug messages while handling notify datagrams
- Convert Hvac client transformers to new schema
- Convert inverter client transformers to modular concept
- RemoteActors are now only discovered if NodeManagementUseCaseData has been received
  from them, or they do not offer NodeManagementUseCaseData at all
- Consistently use keo::Optional in API types
- Extend documentation of onServiceAdded
- Improve documentation regarding start/stopServiceDiscovery
- Improve exception handling in COB server

4.10.1
JSON API:
- Generic:
  - Implemented the server-side JSON API for MPC scenario 1

Please note that MPC server functionality is still limited to HeatPump actors.

4.10.0
New functionality:
- Inverter:
  - COB (Control of Battery)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_pre-draft_6251_20200330.
  - COI (Control of Inverter)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_pre-draft_6248_20200323.

    Known Limitations:
        - COI and COB both define DeviceConfiguration_MinimumTimeToLive and
          DeviceConfiguration_MaximumTimeToLive for the actor Inverter. When using
          these two use cases simultaneously only the setters of the use case that
          has been specified last in the list of supported use cases will work.
          E.g. if your Inverter is defined as:

              inverter::server::HybridInverter<inverter::server::Coi, inverter::server::Cob>;

          use only inverter::server::Cob::setBatteryMinimumTtl and
          inverter::server::Cob::setBatteryMaximumTtl.
        - The COI server initializes the active power setpoint P of scenario 1,
          the failsafe active power of scenario 4, and the minimum and maximum
          time to life of scenario 5 to 0. If these values do not suit your device
          you need to overwrite the default values using the appropriate setters
          in inverter::server::Cob.
        - Currently, the COB server initializes the max. AC charge power, max. AC
          discharge power, max. DC charge power and max. DC discharge power to 0.
          If these values do not suit your device you need to overwrite the
          default values using the appropriate setters in inverter::server::Coi.
        - Full write datagrams (as used by the COB/COI implementation in the
          KEO playback tool) are currently not supported by the COB/COI server
          implementations. In case of full writes not all written list entries
          are accepted by the server. However, partial writes (as used by the
          COB/COI client implementations of the KEO UC API) are supported.

NOTE: COB and COI are implemented based on a pre-draft specification and a
      snapshot of the SPINE XSD. Additionally, these amendments have been
      made to the use cases in working group calls and via other communication
      channels and have been implemented:
          - In COI scenario 5 an additional maximum TTL can be communicated
          - The specialization Setpoint_CosPhi in COI scenario 3 requires the
            following elements to be set
                * Setpoint. setpointListData. setpointData. isSetpointActive
                * Setpoint. setpointListData. setpointData. timePeriod. endTime
          - The specialization LoadControlLimit_ReactivePowerProductionLimit
            in COI scenario 2 requires the following element to be set
            "LoadControl. loadControlLimitListData. loadControlLimitData. timePeriod. endTime"
      Therefore, the current implementation diverges to some extent from
      the pre-draft documents. It leans towards a future version of the use case
      specifications. Please act responsibly when using this software.

JSON API:
- Inverter:
  - Implement transformers and payload handlers for COB and COI

Note: applications using the JSON API require at least release 1.10.0
      of the schemas.

Bug fixes:
- Fix scope type for MOI scenario 5.3 (total apparent power)
- Fix scope type for MOI scenario 5.5 (total reactive power)
- Ensure that affectedSystemFunctionId is set in MCSGRC server
- Fix a typo in MOI client documentation
- Set MOI acMeasuredPhases based on the value of
  inverter::server::Inverter::setSupportedPhases

Dependencies:
- Upgrade to keo_spine 14.3.0

Improvements:
- Clarify log message regarding supported scenarios
- Change log level of scenario checks to TRACE
- Clean the code in a number of places

4.9.3
JSON API:
- E-Mobility:
  - Fix transformation of energy measurements in EVCEM

4.9.2
JSON API:
- E-Mobility:
  - Implement incentiveTable(Description) JSON transformers for CEVC

Note: applications using the JSON API require at least release 1.9.3
      of the schemas.

4.9.1
JSON API:
- Adapt to new phase elements in schemas (MPC)
- Adapt to new phase elements in schemas (EVCEM, OPEV, OSCEV)

Note: applications using the JSON API require at least release 1.9.2
      of the schemas.

Bug fixes:
- Cast integers to jsoncpp::Int64 to avoid ambiguity
- Fix keo::json_api::emobility::server::Transformer::attach

4.9.0
New functionality:
- HVAC:
  - MRCSF (Monitoring of Room Cooling System Function)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_RC1_public.
  - MRHSF (Monitoring of Room Heating System Function)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_RC1_public.
  - MDSF: work in progress, planned for the next major release.

API changes:
- Remove optional element 'changeable' from HVAC client API
- Remove actor name from HVAC client callbacks
- Refactor mpc callbacks

JSON API:
- Unify identifiers across JSON transformers (move to actorId, parentId)
- Restructure emobility server transformers
- Add MPC client transformer
- Add client:MOI:detailedInformation transformer
- Add MCSGRC transformers / payload handlers

Note: applications using the JSON API require release 1.9.0 of the schemas.

Bug fixes / improvements:
- Avoid sending empty constraints as json
- Fix missing override specifier
- Prevent copying of loop variable
- Remove unused class ActorHandler
- Adapt FSWG to spec version V1.0.0 draft 1
- Adapt MOI to specification version 1.0.0_RC1
- Fix namespace of MpcClientTransformer
- Fix log messages in ProviderServerFeature::notify
- Remove TODO comments in public API
- Document MCSGRC server
- Update MCSGRC client documentation
- Ensure listeners are de-registered from or outlive actors in examples
- Fix subscription and binding result debug messages
- Add virtual destructors to HVAC client UCs
- Add virtual destructors to HVAC remote actors

4.8.1
Bug fixes:
- Upgrade to keo_spine 14.2.1 to fix builds from source packages

4.8.0
New functionality:
- HVAC:
  - MCSGRC (Monitoring and Control of Smart Grid Ready Conditions)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_draft2_6218_20200306.
  - MPC (Monitoring of Power Consumption)
    - Client and server are implemented.
    - The implementation is based on spec version V1.0.0_draft2_6214_20200306.
    - Only scenario 1 (Monitor power consumption) is currently supported.
    - The server part of the use case is currently only usable with a HeatPump actor.
  - MDSF, MRCSF, MRHSF: work in progress, planned for the next major release.

API changes:
- E-Mobility:
  - Introduce separate type "PowerLimits" for EVCC permitted values
  - Model API type "Constraints" more closely to specification
- General:
  - Add virtual dtor to class UsecaseHost::EventListener
  - Add virtual destructor to keo::eebus::Device

JSON API:
- Rename insulation to insulationResistance in MPS
- Match JSON names to Use Case API names for the following use cases:
  - E-Mobility: EVCEM
  - Grid: GPCL, MGCP
  - Inverter: MOB, MOI, MPS, VABD, VAPD
  - White Goods: FS

Bug fixes / improvements:
- Notify the vendor state code correctly in MOI scenario 2
- Only consider the two states "failure" and "normalOperation" in
  E-Mobility CEM operating state (fixed since 4.7.3)
- Fix bug in stopShipServer/startShipServer which prevents a clean restart
  (fixed since 4.7.3)
- Correctly remove all remote actor objects when the corresponding SHIP
  connection is closed
- Enable comparison of ManufacturerInformation
- Default the copy ctor of ByteArray
- Adapt to explicit constructors in keo_datagram
- Fix memory leak in RemoteEngineActor
- Read and handle heartbeat data in HeartbeatClient
- Fix message counter for notifications
- Fix memory leak in ProviderServerFeature
- Send OSCEV constraints in EmobilityTransformer
- Fix precedence evaluation in PowerSequences
- Fix removal of remote actors
- Communicate removal of inverter after all its sub-actors
- Only try to remove actors when there is at least one candidate
- Do not overwrite existing remote actor objects
- Reduce log level of message that contains complete JSON of a datagram
- Use set instead of vector when removing remote actors
- Also remove PvSystems when device disconnects
- Improve setRegisterFlag docs and remove calls from examples
- Move AcDetails to core datatypes
- Remove obsolete P0 payload handler
- Set mandatory valueType and valueSource in MGCP (fixed since 4.7.3)
- Add and handle binding/subscription failed in client states
- Reject duplicate subactors
- Improve log messages in a number of places
- Improve documentation in a number of places
- Clean the code, for example by removing unused includes

4.7.0
- No longer require idEv in client-side JSON heartbeat commands
- Allow reading of heartbeat data from the heartbeat server feature
- Adapt inverter JSON transformers to updated schemas
- Implement client and server for VABD and VAPD
- Implement MOI scenario 2.5 (detailed status information)
- Adapt MGCP to specification version 1.0.0 RC4
- Fix GPCL server handling of time period
- Disconnect actors from domains and subactors from superactors upon
  deletion
- Improve the documentation

Note: applications using the JSON API require release 1.7.0 of the schemas.

4.6.0
- Buildsystem: Create shared and static use case-/JSON API libraries
- Reply to READ datagrams in heartbeat server feature
- Add inverter::server::vapd
- Implement a new concept for client in Inverter domain
- Add client actors for inverter:client
- Catch exceptions thrown from getEv/getEvse in transformers
- Reply proper nack when power limit could not be set in CEVC
- Correct AcPhase and add test
- Adapt grid server documentation to emobility documentation
- Remove explicit namespace references
- Handle errors in conversion to API types in MoiAdapter
- Adapt to KeoByteArray being removed from keo_datagram
- Update interface for OPEV and OSCEV
- Customize whitegoods client files similar to emobility files
- Add client remote BatterySystem
- Handle invalid values gracefully in inverter clients

4.5.0
- Do not use Phases/PhaseSpecific
- Depend on keo_spine 14.0.2
- Fix cem.errorState
- Adapt to MGCP schema changes
- Change server structure
- Generate whitegoods client JSON API
- Add whitegoods client transformers
- Fix type check for mgcp.plfPv transformer
- Integrate core Optional ManufacturerInformation in inverter
- Use keo::Optional in ManufacturerInformation

4.4.0
- Fix a lot of bugs across the use case engine
- Implement white goods use case "FS" (client)
- Implement inverter use cases MOB, MOI, MPS JSON transformers
- Implement missing scenarios from MOB, MOI, MPS

4.3.0
- Fix a lot of bugs across the use case engine
- Implement grid use cases "MGCP" and "GPCL" (server)
- Implement inverter use cases MOB, MOI, MPS (client)
- Implement inverter use case MOB (server)

Note: the MOI server implementation does not yet support
      scenario 2.6 (detailed state) as well as 6.2b, 6.3b,
      6.4b (historical values).

4.2.0
- Update to KEO SPINE library version 14.0.1

4.0.0
Reject write requests from clients which are not bound

2.1.1
-Change callback relevance to ids

2.1.0
- Update to KEO SPINE library version 13.0.0
- Add partial handling in client
- Correct binding and complex class handling for client

2.0.2
- Update to KEO SPINE library version 12.0.2
- Update EMobility usecases according to most recent usecase specification

2.0.1
- Fix identifier calculation

2.0.0
- Update to KEO SPINE library version 12.0.1
- Update CoordinatedEVCharging usecase
- Update Electricitysupply usecases
- Create examples for client

1.5.2
- Correct self-consumption usecase
- Correct timeout handling
- Update finish process

1.5.1
- Add server generator

1.5.0
- Change interface names
- Add usescases for whitegoods
- Add missing usecases for hvac

1.4.1
- Correct limitId for writing limits

1.4.0
- Refactor core library
- Add functions for scenario support

1.3.0
- Add ElectricitySupply usecase RemoteMonitoringOfElectricityGridConnectionPoint

1.2.1
- CMake changes to build src package

1.2.0
- Add E-Mobility usecase Coordinated EV Charging
- Add E-Mobility usecase Final EV charging-session summary
- Add HVAC usecases
- Refactor core library

1.1.0
- Add E-Mobility usecase OptimizationOfSelfConsumptionDuringEVCharging
- Extract the usecase client library into different libraries for each use case

1.0.0
- Add python generator to generate sources for the use case library
- Add a cmake run to create an E-Mobility client use case library
-------------------------------
keo_spine
-------------------------------
21.0.141
- Depend on keo_spine_datagram 18.0.141

21.0.140
- Depend on keo_spine_datagram 18.0.140

20.1.0
- Do not overwrite existing entities
- Do not overwrite existing features
- Depend on keo_cmake_modules 4.5.0
- Depend on keo_spine_datagram 17.1.0

20.0.1
- SHIP connection is now closed if a SHIP node is physically disconnected from the network
- Fix a memory usage issue
- Depend on keo_logging 2.1.0
- Depend on KEO SHIP DATABINDER library version 6.7.0

20.0.0
- Adapt to keo_logging 2.0.1
  Change logging macro calls
- Depend on KEO SPINE datagram library version 17.0.0

19.0.1
- Depend on KEO Logging version 1.1.1
- Fix buildsystem issues for source package

19.0.0
- Fix internal timer implementation
  This timer is used for SME, ShipSocket (ping/pong), and SocketConnectionHandler (double connection)
- Avoid multiple socket connections of the same role to the same peer
- Honor the 'ConnectionHost' configuration value for the own SHIP service announcement
  - the previous implementation unconditionally announced all IP addresses on all interfaces
- Improved logging messages with regards to the own SHIP server instantiation
- Enforce the definition of a 'host' for own SHIP service announcement
  To avoid connection issues, the listening SHIP socket server's host and the announced SHIP
  service's content w.r.t. IP address(es) shall be in sync. Hence, registerService() requires
  a host, the overloaded interface method is removed.
- Depend on KEO SPINE datagram library version 16.3.0
- Depend on KEO SHIP DATABINDER library version 6.5.0

18.3.0
- Increase robustness of SHIP parser
- Use idiomatic singleton instead of global static instance for ShipTimerController
- Depend on KEO SPINE datagram library version 16.2.0
- Introduce cmake option to build shared/static libs

18.2.0
- All datagram-related callbacks are now called in the same thread context.
  This avoids situations where datagrams were handled in a different order than
  they were received in. This applies to the following methods:
    - Feature::handleDatagram()
    - Feature::handlePendingDatagramResponse()
    - DeviceCallbackInterface::onNewDevices()
    - DeviceCallbackInterface::onRemovedDevices()
    - DeviceCallbackInterface::onDetailedDiscovery()
    - DeviceCallbackInterface::onDetailedDiscoveryPartial()
    - DeviceCallbackInterface::onUseCaseDiscovery()
    - DeviceCallbackInterface::onDetailedDiscoveryFailed()

18.1.0
- Mark some methods in class Feature const
- Fix potential data races in class Feature (w.r.t. the feature's description)
- Refactor the initial SPINE message exchange ("handshake")
  The SPINE functions NodeManagementDestinationList and NodeManagementUseCaseData
  are considered to be part of the handshake. This means the onDetailedDiscovery()
  callback is invoked after DestinationList and UseCaseData have been read (if
  offered).
- Avoid sending/handling of datagrams when SmartDevice is already closed. This
  could lead to unwanted exceptions being thrown.
- Fix URI hostname validation in line with RFC 1123
- Do not throw when uninitialized device is used for communication
- Support OpenSSL configuration with disabled engine support

18.0.4
- Reduce a critical section in Avahi callback handling
- Fix a bug in the SPINE handshake which lead to received datagrams being
  delivered to local entities/features before the sender was announced via
  onDetailedDiscovery
- Fix bugs in connect/disconnect scenarios which may cause timing dependent
  issues which show up as an std::system_error ("invalid argument"), a deadlock,
  or undefined behavior by accessing an already destroyed object.
- Fix potentially growing number of threads
  In a specific scenario the ShipSocket's JobRunner process was not joined.
- WebSocket related logging messages contain the WebSocket object's address
  (this) to ease evaluation of connection/disconnection issues

18.0.3
- Improve documentation
- Refactor creation of docs
- Fix synchronization between datagram handling and modifications of the device
  model
 
18.0.2
- Fix deadlock in websocket handling during ship stack shutdown
- Depend on KEO SPINE datagram library version 16.0.2

18.0.1
- Depend on KEO SPINE datagram library version 16.0.1

18.0.0
- Depend on KEO SPINE datagram library version 16.0.0
- Reduce critical sections in KEO discovery
- In a double connection scenario which has to be resolved by
  the peer, only the latest double connection remains pending,
  all others are closed unconditionally.

17.0.2
- Only call ENGINE_load_dynamic() in TPM example code when OpenSSL API
  compatibility settings allow to do so

17.0.1
- Avoid dangling reference in PrimaryNodeManagementFeature::timeoutHandler()

17.0.0
- Depend on KEO SPINE datagram library version 15.0.0
- Do not respond to datagrams that do not require/allow it, e.g. do not ACK a
  notify without ackRequest=true
- Read NodeManagementDetailedDiscoveryData again after subscription to
  NodeManagement has been replied to or timed out. This is to not lose changes
  a peer does to its device model in between the initial read for
  NodeManagementDetailedDiscoveryData and the subscription for NodeManagement.
  The complete "handshake" a node tries to run through now is as follows:
    1. read DetailedDiscovery on new connection
    2. receive DetailedDiscovery reply (1), but do not do not distribute the
       received DetailedDiscovery to all features
    3. subscribe to remote's NodeManagement feature
    4. receive subscription result (accept or reject) or timeout (3)
    5. read DetailedDiscovery again (and DestinationList and
       UseCaseData if required)
    6. ignore incoming partial DetailedDiscovery updates
    7. receive DetailedDiscovery reply (5) and distribute it to all features
    8. the remote is now considered to be known and the connection to be
       established
- Improve logging
- Minor refactorings
- Fix path validation in class URI
- Check URI validity before a connection attempt
- Reduce the number of SSL info callbacks using poll() during SSL handshake

16.6.0
- Use a given server name as SNI extension in connectTo()
- Refactor class URI
- Improve logging
- Fix several typos and spelling in documentation
- Remove calls to exit() function
- Fix potential deadlock in entity handler shutdown
- Add OpenSSL engine support for private key handling

16.5.0
- Fix conversion of enumeration PinState to PinRequirement
- Extend the lifetime of the timer handler set
- Depend on KEO SPINE datagram library version 14.12.0

16.4.0
- Depend on KEO SPINE datagram library version 14.11.0

16.3.0
- Improve JSON conversion
- Remove costly and unnecessary logging
- Cleanup (remove redundant or unused variables and asserts)
- Replace NULL with nullptr

16.2.0
- Add keo_ship namespace to jsoncpp types
- Update to KEO SPINE datagram library version 14.8.1

16.1.0
- Fix compile issues with gcc >= 10
- Update to KEO SPINE datagram library version 14.8.0

16.0.0
- Forget discovered services when discovery gets stopped
- Convert the SKI of a discovered service to lower case
- Make JsonTrustStore::setTrustLevel deny invalid trust values
- Make ShipSecurityHandler::setTrustLevel and ::revokeTrust return bool

- Update to KEO SPINE datagram library version 14.7.0
- Update to KEO logging library version 1.1.0

15.1.0
- Remove deprecated methods from classes DatagramRecord and Feature
- Update to KEO SPINE datagram library version 14.6.0
- Fix possible starving TLS handshake

15.0.0
- Fix double connection prevention when the old double connection has gone stale
- Move logging functions to separate library and namespace
- Update to KEO SPINE datagram library version 14.5.0

14.4.0
- Buildsystem: update build system modules

14.3.0
- Erase removed SHIP services from list of discovered services before announcing their removal
- Update to KEO SPINE datagram library version 14.3.0
- Fix re-starting discovery in ShipTransportConnector
- Fix potential memory leak when jobs could not be scheduled

14.2.0
- Check the SSL context before setting options
- Allow precisely TLS 1.2
- Remove deprecated headers from the keo_util library
- Fix potential crash in SHIP OpenSSL connection handling
- Fix potential buffer overflow in logger
- Update to KEO SPINE datagram library version 14.2.0
- Improve a number of log messages

14.1.1
- Enable compatibility with OpenSSL >= 1.1.0
- Avoid potential segmentation faults when asynchronous jobs are being executed during shutdown
- Unset the SHIP register flag by default

14.1.0
- Buildsystem: Create shared and static libraries
- Update to KEO SPINE datagram library version 14.1.0
- Improve documentation

14.0.2
- Fix websocket frame starvation if the receive buffer contains more than a single frame

14.0.1
- Update to KEO SPINE datagram library version 14.0.1

14.0.0
- Refactor Logger
    - Rename file and class LoggerConsoleConsumer to SimpleLoggerConsumer
    - Fix some doxygen documentation issues
    - Ownership of a LoggerConsumer is always transferred to the Logger by sink idiom.
      This provides a defined startup and shutdown order independent from the order of
      cpp modules in CMakeLists.txt
    - Change shutdown handling to avoid potential memory leaks and to make sleep and
      yield commands obsolete
    - std::localtime may not be thread-safe. Use localtime_r instead of localtime to avoid
      possible data races
- Log message on SSL_ERROR_ZERO_RETURN
- Update to KEO SPINE datagram library version 14.0.0

13.0.2
- Fix potential deadlock when sending pending datagrams from ServerFeature::allowBinding or
  ServerFeature::allowSubscription

13.0.1
- Extend ShipNode to retrieve destination URI for client connections
- Extend ShipMessageExchangeListener with onQueueThreshold method. Will be called if the queue
  length exceeds the limit set by setQueueThreshold().

13.0.0
- Extend ShipStack API with setters and getters for SME "Access Methods" message elements
  (see SHIP 1.0.0 Specification Section 13.4.6.2). The EEBus SPINE specification requires
  this to be set according to whether mDNS discovery is used or not.
- Explicitly log an error when Avahi client initialization fails
- Fix a bug that caused incorrect source addresses in some error datagrams
- Refactor keo_util library.
    Renamed Classes:
    - KEIniReader             -> IniReader
    - KELogger                -> Logger
    - KELoggerConsoleConsumer -> LoggerConsoleConsumer
    - KEVersion               -> Version

    Renamed Header:
    - KETimer.h               -> Timer.h
    - KETimer_posix.h         -> Timer_posix.h
    - KELogging.h             -> Logging.h
- Fix a bug that could lead to incorrect DatagramMemos being passed to
  Feature's timeout handlers
- Remove PrimaryNodeManagementFeature::createBasicNodeManagementFeature() and
  DeviceClassificationFeature::createBasicDeviceClassificationFeature() static methods.
  Both classes can now be created via constructors.
- Avoid unlocking an unlocked mutex in some circumstances
- Only send result for subscription delete request when ackRequest=true

12.0.3
- Explicitly log an error when Avahi client initialization fails
- Fix ::poll timeout handling in class websocket. Test if websocket is in state closing and close
  connection.
- Fix a bug that caused incorrect source addresses in some error datagrams
- Fix a bug that could lead to incorrect DatagramMemos being passed to Feature's timeout handlers

12.0.2
- Update to KEO SPINE datagram library version 12.0.2

12.0.1
- Update to KEO SPINE datagram library version 12.0.1
- Fix Detailed Discovery reply to use the correct SPINE specification version

12.0.0
- Update to KEO SPINE datagram library version 12.0.0
- The logger implementation provided by KEO does not write colour escape sequences into log
  files any more. Log messages printed to the console are still coloured.  This can be disabled
  by adding "use_colors=false" to the logging config file. This config entry is optional and the
  value defaults to true.
- Default transport connector: Remove configuration file handling.
- KEO-Util: KEJson removed.
- Fix potential deadlock in class Feature
- Handle NodeManagementUseCaseData notifications in PrimaryNodeManagementFeature
- A new callback (onUseCaseDiscovery) has been added to the classes DeviceCallbackInterface and
  Feature to receive information on supported use cases of remote devices
- Add method to retrieve the SHIP id and IP port to class ShipConnection of
  keo_default_ship_transport
- Add method to retrieve all currently discovered SHIP services to keo_default_ship_transport
- Delete obsolete utility classes
- Fix bug in PrimaryNodeManagementFeature where subscription requests could be misunderstood
- Fix return value in ClientFeature::timeoutHandler(...)
- When an uninitialized SmartDevice is used for communication an exception (std::logic_error) is
  thrown. This exception is not meant to be caught and handled, but to detect and fix this common
  error more easily.
- Fix a bug where subsequent calls to SmartDevice::initialize() did not change the initialization
  state correctly
- Fix SIGABRT if ShipStack::startServer() is called multiple times
- Remove setSpineDevice(...) and getSpineDevice() from
  keo_default_ship_transport::ShipTransportConfiguration

11.1.3
- Update to KEO SPINE datagram library version 11.1.4
- Fix the handling of the return value of an internal SHIP stack method as to avoid a potential
  infinite loop
- Implement a workaround for a bug in glibc versions prior to 2.27 (glibc bug report:
  https://sourceware.org/bugzilla/show_bug.cgi?id=20532) that can cause getaddrinfo to fail if errno
  was previously set by some other function
- Fix the return value of an internal SHIP stack method
- Improve log messages inside the SHIP stack
- Fix return value of KELoggerConsoleConsumer::loadConfig

11.1.2
- Update to KEO SPINE datagram library version 11.1.3

11.1.1
- Update to KEO SPINE datagram library version 11.1.2
- Handle NodeManagementUseCaseData notifications in PrimaryNodeManagementFeature so that no error
  result ("command not supported") is sent
- A new callback (onUseCaseDiscovery) has been added to the classes DeviceCallbackInterface and
  Feature to receive information on supported use cases of remote devices
- Add method to retrieve the SHIP id and IP port to class ShipConnection of
  keo_default_ship_transport
- Add method to retrieve all currently discovered SHIP services to keo_default_ship_transport

11.1.0
- Update to KEO SPINE datagram library version 11.1.0

11.0.0
- Adapted to KEO SPINE datagram library version 11.0.0 (check the release notes of KEO SPINE
  datagram library for further details)
- The class DatagramUtilities has been removed (use keo_datagram::Datagram::createResult(...)
  or keo_datagram::Datagram::createReply(...) instead)
- DeviceClassificationFeature::createDeviceClassificationRequest(...) now returns a const
  reference instead of a shared pointer
- The device classification feature of an entity 0 now must be set using the designated
  setter PrimaryDeviceInformationEntity::setDeviceClassificationFeature(...). A device can
  only be initialized successfully if that setter was used.
- Add PrimaryNodeManagementFeature::setUseCaseData(...) which will automatically send notifications
  to subscription partners
- The default PrimaryNodeManagementFeature now handles READs on NODE_MANAGEMENT_USE_CASE_DATA with
  data that has been set previously using PrimaryNodeManagementFeature::setUseCaseData(...)
- Datagram, DatagramRecord and DatagramMemo objects are now passed as const references to
  Feature::handlePendingDatagram(...) and Feature::handlePendingDatagramResponse(...) to reduce the
  number of shared_ptr copies
- The send methods (Feature::sendDatagram(...), etc.) now expect a (const) reference to a
  Datagram or DatagramRecord in order to reduce the number of shared_ptr copies. Methods to send
  shared_ptr<Datagram> and shared_ptr<DatagramRecord> are kept for backwards-compatibility reaons,
  but are considered deprecated.
- ServerFeature::getSubscriptions(), ServerFeature::getBindings(), SmartDevice::getEntities(),
  Entity::getFeatures() and SmartDevice::getSubDevices() now return std::vector instead of
  std::list to reduce the memory usage
- Methods regarding destination list updates (e.g. DeviceCallbackInterface::onNewDevices(...),
  DeviceCallbackInterface::onRemovedDevices(...), etc.) now get a std::vector instead of a
  std::list to reduce the memory usage

- SHIP:
    - Correctly echo the WebSocket ping "application data" in the corresponding pong message
    - Removed obsolete reverse DNS lookups and local IP address determination

- KEO-Util:
    - KEAtomic removed. Use std::atomic<T> directly.
    - KEShared removed. Use std::shared_ptr<T> directly.
    - KEString removed. Use std::string directly.
    - KEThread (PThread) removed. Use std::thread directly.
    - KEFile removed. Use stat (sys/stat.h) system call directly.

10.4.6
- Clear device part from entity addresses in outgoing detailed discovery data
- Accept certificate if root CA is not marked as trusted for the specified purpose

10.4.5
- Add methods for validating the temporal validity of a certificate to class X509Certificate
- Only send partial detailed discovery NOTIFICATIONS when an entity or feature has been
  added/modified/removed (i.e. the detailed discovery has changed)
- Use one OpenSSL context for all connections
- Fix minor problems with the source package
- Fix bug that could lead to failing initial detailed discovery reads when closing a
  double connection
- Fix  potential race condition when the initial detailed discovery read was answered very
  quickly

10.4.4
- Add compatibility for OpenSSL version 1.1.0f
- Remove definition GLIBCXX_USE_CXX11_ABI from examples

10.4.3
- Change SHIP CMI timeout from 10 seconds to 30 seconds
- Change SHIP Pin State timeout from 30 seconds to 120 seconds

10.4.2
- Consider maxResponseDelay updates from partial detailed discoveries
- Consider updates to remote primary node management features
- Only send subscription/binding responses if it is not empty
- Fix potentially racing in SSL read/write
- Buildsystem: Do not build packages depending on Avahi if not found

10.4.1
- Fix bug in PrimaryNodeManagementFeature::onRemovedDevices()
- Fix boundary checks in datagram enum classes

10.4.0
- Fix bug in entity validation
- Fix bug in double connection handling (when the remote end failed to close connection in time)
- Fix possible conditional jump on uninitialized variable
- Fix possible racing for condition variable wait/notify
- Update to KEO Spine Datagram 10.4.0 containing XSD EEBus_SPINE_V1.1.0_beta1_snapshot_3853_20170907

10.3.0
- Make onConnect() and onClose() methods pure virtual (ShipNode)
- SHIP specific WebSocket reworked
    - Close handling streamlined.
    - Connecting to peers is now syncronized. This includes the TLS handshake and
      WebSocket upgrade request. Timeout is set to 10 seconds.
    - Send function is synchronized.

10.2.0
- Rename class ShipDiscoveredService to ShipService
- Fix avahi multithread issue
- Move examples to dev-package

10.1.0
- Consider "Delayed Acknowledgement" messages
- The default timeout for datagrams has been changed to 10 seconds
- Add convenience method for adding supported functions to ServerFeatures
- Add partial detailed discovery support
    - PrimaryNodeManagementFeature automatically notifies partial detailed discovery when possible
    - Applications must implement onDetailedDiscoveryPartial() callback
      Note: See ReleaseNotes of keo_datagram_10.1.0

10.0.0
- A bug has been fixed that caused message timeouts to expire to late or never
- Several single-argument constructors have been marked explicit
- Added constructors to Feature, ClientFeature and ServerFeature that do not expect
  NetworkManagementFeatureDescriptionData
- The initialization of entities now fails, when no entity type is set
- The initialization of features now fails, when no feature role or feature type is set
- KeoUtil: Move Util-Classes to KeoDatagram-Library
  keo_util::KEByteArray -> keo_datagram::KeoByteArray
  keo_util::KEDate -> keo_datagram::KeoDate
  keo_util::KETime -> keo_datagram::KeoTime
  keo_util::KEDateTime -> keo_datagram::KeoDateTime
  keo_util::KEDuration -> keo_datagram::KeoDuration
  keo_util::KEDeviceAddress -> keo_datagram::KeoSpineDeviceAddress
  keo_util::KEScaledNumberType -> keo_datagram::KeoScaledNumber
- ShipDiscovery has been moved to own shared library and namespace (keo::ship_discovery)
- ShipDriver has been removed to drop dependcy to ShipDiscovery (and Avahi)
- Fix the OpenSSL verify callback so that it handles issued certificates correctly
- Remove extra DeviceDescription elements for NodeManagementDestinationData
- Pending datagrams are now identified by its msgCounter and not by a ticketId
- The SHIP stack and default SHIP discovery (based on Avahi) now respect IP address
  configuration parameters (refer to ShipStack#initializeServer() and
  ShipDiscovery#registerService() for more information)
- Fix misleading error messages when closing the websocket server
- Incoming datagrams are buffered until are detailed discovery is received on a
  connection. Then they are delivered.
- Use std classes instead of KEMutex and KELockGuard
- Implement methods to get IP address and port of remote connection
- When detecting a double connection, the new connection is kept alive. Previously, the
  new connection has been terminated. This means, that when two nodes try to connect to
  each other at the same time, the first connection to be established is terminated as
  soon as the second connection is established.
- Allow to configure the SHIP protocol (e.g. timeouts) via
  ShipStackConfiguration::setProtocolConfig()
- Allow re-registering of zeroconf services without unregistering first
- ShipTransportConnector::startDiscovery() returns only true on success of
  ShipDiscovery::registerService() and ShipDiscovery::startServiceResolver()
- Move SPINE datagram library to a separate module

9.2.2
- Add arithmetic helper methods to keo_util::KEScaledNumberType
- Fix KeoTime::toString() method. In case of 0 seconds the string shall contain ":00".
- Automatically send NOTIFY datagrams to subscribers of the PrimaryNodeManagementFeature.

9.2.1
- Send NOTIFY datagrams to subscribers of the PrimaryNodeManagementFeature. This
  is triggered by setting a new DetailedDiscovery (i.e. initializing a device)

9.2.0
- Switch to new XSD version (EEBus SPINE v1.0.0 beta1 SVN revision 3514)
- KEDateTime: Fix duration calculation
- Fix an issue with symbol visibility
- Add getter and setter methods for the instance name in ShipDiscoveredService
- The default primary node management feature propagates NODE_MANAGEMENT_BINDING_REQUEST_CALL and
  NODE_MANAGEMENT_BINDING_DELETE_CALL in its supported functions

9.1.0
- Our implementation of the ShipTransportConnector has been moved to an own library in the namespace
  "keo_default_ship_transport"
- Our implementation of the ExampleSecurityHandler has been moved to an own library in the namespace
  "keo_json_security_handler" and has been renamed to JsonSecurityHandler

Known issues:
- The default implementation of the PrimaryNodeManagementFeature subscribes to other
PrimaryNodeManagementFeatures it discovers. However, it will not handle the result datagram
(accept/reject) sent by other devices. If a custom UnhandledDatagramInterface is set, this
datagram will show up there but can safely be ignored.

9.0.2
- Fix shutdown double free corruption
- Fix 64/32Bit problem with scaled numbers
- Optimize ShipDiscovery for IPv6

9.0.1
- Fix fragmented websocket upgrade responses
- Add missing websocket CONTINUATION opcode
- Subscription and Bindings Ids are now chosen globally (i.e. a device will now only have one subscription with the id 1.

9.0.0

- Transport connection API change:
      - Use std::weak_ptr instead of raw pointer
      - Closing status and reason parameter removed
- Fix an infinite loop that occured when removing mappings between SHIP transport ids and SPINE device names
- Implement SHIP PIN handling
- Change the method onTrustCertificate to return an `unsigned short` that represents the current user trust level
- Bugfixes in ship_stack:
    - Fix several deadlocks in case of very short lived connections
    - Fix several memoryleaks
- Replace KESharedPointer with std::shared_ptr
- Set the default number of maximum concurrent connections in ShipTransportConnector to 0 (unlimited)

8.0.1
- Update easylogging to version 9.84
- Introduce logger ID keo_spine_transport
- Introduce logger ID keo_zeroconf

8.0.0

- Bugfixes
- Introduce PrimaryDeviceInformationEntity that has to be used as Entity /0
- SmartDevice::initialize() does not take an argument anymore. The PrimaryDeviceInformationEntity is
  set via the method SmartDevice::setPrimaryDeviceInformationEntity().
- To add a PrimaryNodeManagementFeature, the method
  PrimaryDeviceEntity::setPrimaryNodeManagementFeature has to be used
- In order to add a sub device to another device, both devices have to be initialized.
- The detailed discovery of a device is created when it is initialized. After changing the SPINE
  model of a device it has to be initialized again.
- It is now recommended to never intercept an incoming datagram in a feature when the feature does
  not support that datagram, e.g. by sending a DATAGRAM_NOT_SUPPORTED reply. Such a
  DATAGRAM_NOT_SUPPORTED reply is sent automatically when a datagram is not handled.
- SmartDevice::setUnhandledDatagramInterface() allows to handle incoming datagrams that have not
  been handled by any feature
- It is not neccessary anymore to manually setup mappings between transport ids and SPINE device
  names (neither via a Distributor, nor via the SpineLink). The framework automatically creates
  appropriate mappings.
- Features can now be tested completely in isolation. Simply, instantiate a feature and use
  Feature::setSendService to set a send service. Pass in datagrams via Feature::handleDatagram and
  check your feature's replies via the send service.
- Add getSki() to ShipDriver

7.0.1

- Add callbacks for onConnect, onClose and onDataExchangeEnabled
- Enable subscriptions on primary node management features
- Bugfixes
- Known issues:
  Possible racings on shutdown

- Rename classes to ensure consistent naming in keo_util:
  Condition        -> KECondition
  DeviceAddress    -> KEDeviceAddress
  Event            -> KEEvent
  EventLoop        -> KEEventLoop
  LockGuard        -> KELockGuard
  Queue            -> KEQueue
  ScaledNumberType -> KEScaledNumberType
  Semaphore        -> KESemaphore
  Singleton        -> KESingleton
  Thread           -> KEThread
  Timestamp        -> KETimestamp
  XMLUtils         -> KEXMLUtils

7.0.0
Rework Zeroconf implementation
Add ShipDiscovery
Add percent-encoding to KEUri util class

Add new ship-stack implementation

6.0.3
Implement Distributor::sendDetailedDiscoveryRequest
Add the possibility to create a spine_datagram library with a reduced feature set.

6.0.2
Method addDestinationListSelection added
Add missing disconnected callback
Add trust center

6.0.1
Add getConnectedDevices() to Distributor Class

6.0.0
Add binary en/decoder. Rewrite EEBusDataClass with function for decoder and encoder.
Rewrite Json en/decode. Delete EEBusClassifier -> CmdClassifier
Update time, datetime and duration to calculating classes
Correct Header members for time

5.0.7
Increased websocket buffer sizes from 64 to 8192 bytes in order to achieve better performance.

5.0.6
Refactor KEByteArray
Increase max line size for INI Reader

5.0.5
Added ActuatorSwitch example
Disconnect reason is passed to application on SHIP-disconnect. SME info element is passed to application on SHIP-connect.
Access-Methods reply contains DNS (if available).
Added element 'Ip' to DeviceListEntry.
Added element 'Ip' to SmeInfo.
Removed obsolete NvSerialize dependencies.
Added element 'Ip' to ConnectionInfo.
Added element 'Hostname' to SmeInfo.
Added element 'Path' to ShipConnectionData
Added keo_tools::DeviceAddress
Added keo_tools::Uri.
Added jsoncpp

5.0.4
Enhanced keo_device application by DataTunneling application
(application flavour can be selected by  compile switch).

5.0.3
Initial version
