-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[evnotify] Initial contribution: New binding for evnotify online service #11537
Changes from all commits
60a4dcc
f8bd307
70f72de
011aca9
1dc7341
510d411
f917416
cb60330
2e4807b
94e1eaa
22638bc
1b0bdea
24779bf
a65dc3d
0eab096
5302e1d
c4b0c29
51e8d34
98e5378
e18f2f3
0533bf7
6a1dd35
5fcc60c
1e3a38f
3a4840e
67235c1
007a486
2b7454f
6c6fbc8
d26aaae
2abba37
d5d2694
b544e1c
9a33412
cb7c1ff
b02d230
1694571
0bea02f
9c65e24
9eebcca
e9956cd
04c35ea
062d13e
a5360e3
2466d15
1a19f69
13b1ce7
61be0dd
b4d1eaa
56e9bfe
2a435f3
87b658b
7481158
e4faa04
0134bd8
d45b087
637ad1d
4858f95
ce403e7
b457d4d
084fb1f
0a1cd1e
9b8158d
783bca1
f50fc00
8c96306
edbce24
38653e6
6698bb2
fa1cab0
303b8a9
8652633
a628444
173adb3
83a7344
19ab0f9
06bff30
8748a9f
2884d1c
7316182
7ecc9aa
c8a4ccf
a8bab26
c8af87e
8d4ca6a
81efb40
909a40b
e5fb5c6
c0bc19b
784e902
e0bc38a
8092232
5abb0e7
cbb6b51
ea014a1
22acabc
62fa5aa
87fda90
a613618
4a36985
9492ea4
c207173
ff01529
431f0d0
a6534d7
5cc5188
2515e37
fa903fd
954a4fe
0dca259
96174b7
361aa9d
fa6ca6d
e91a70c
5ac44dd
dac3358
ea54112
440da8f
8ad078c
e37a139
0ca49af
3b7bb25
bb215cc
04cb2e6
66fd364
3704808
3b1156f
5df1c3e
037c743
9246993
47c6b6d
e33b011
cdaff53
fd9c3c1
9c97537
8b320dc
479ecd4
5a286f7
8b1171b
3798edb
c992c64
9bb1141
23ab988
4897a40
d227b3a
ef3b4fc
e5c915e
70b5ad4
ee78c14
89db79c
1046f15
4a8fce1
5dee96c
86f893e
f700841
1b1cbb4
613a8e9
632d6db
df4f2a2
2658544
7fbc210
c1c0316
9d2043f
54a7a66
0051d0f
b97c473
cb27a95
25b45b7
a30acce
5b7154a
d099b73
d16b724
97dbf21
3bc0908
d7afcab
c7352a4
d4316be
a5463aa
f6566d0
8db2136
affda82
715096b
62655df
6ece74e
0ab68fb
db77c35
75c19c7
681a440
d8eded1
4fabe9b
277f611
1dd2046
583a354
f3b0a60
3b657e0
5817c14
9075e58
2ee9338
28f495a
c967521
c96c5d1
d14715f
a62a5a9
1a447e6
bd4a656
c14e93c
f40cd13
530d493
48e82da
9d3997b
b707521
8ce86aa
560bdde
5606ec8
e9f7a19
2b64032
8bdb40f
a046159
229cdb2
3d36526
7cb634a
85a5b93
2e68a3f
c2ad80e
4f27f47
85258e7
00e5d9d
6c44d34
4fe506a
39d35b4
50a084a
70e959a
c5dbbc7
47d903d
fa65103
91a7b0f
5a1e558
a409545
f7abe2b
05c21b8
ca0a032
d0b02b2
00cbbb4
7d3a9f2
b2fea3b
9b8aa33
86f572e
8e8a1a1
29fb4c7
b9707b2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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/openhab-addons |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# EVNotify Binding | ||
|
||
This binding can be used to read data for a given electric vehicle from the EVNotify online service (account). Please see [EVNotify](https://evnotify.de/). | ||
|
||
It allows you to monitor different data from your electric vehicle (e.g. state of charge, state of health, etc.). | ||
|
||
The binding was tested with a Hyundai Ioniq electric. | ||
|
||
## Supported Things | ||
|
||
| Thing Type | Description | | ||
| ---------- | ----------- | | ||
| `vehicle` | The vehicle represents a connection to the [EVNotify](https://evnotify.de/) online service (account) | | ||
|
||
## Discovery | ||
|
||
There is no discovery implemented. You have to create your things manually and specify the `AKey` and the `Token` of your [EVNotify](https://evnotify.de/) online service (account). | ||
|
||
## Binding Configuration | ||
|
||
The binding has no configuration options, all configuration is done at `vehicle` level. | ||
|
||
## Thing Configuration | ||
|
||
### Vehicle Thing Configuration | ||
|
||
| Parameter | Description | Required | Default | | ||
| ----------------- | ----------- | :------: | :-----: | | ||
| `AKey` | AKey used for EVNotify API access | yes | - | | ||
| `Token` | Token used for EVNotify API access. It is like a password. Do not share this with people you do not trust! | yes | - | | ||
| `refreshInterval` | Refresh interval for reading data from EVNotify online service (in seconds) | no | 120 | | ||
|
||
## Channels | ||
|
||
### Channels for Vehicle Thing | ||
|
||
| Channel ID | Item Type | Description | | ||
| ------------------------------ | --------- | ---------------------------------------------- | | ||
| `soc_display` | Number | State of Charge (Display) | | ||
| `soc_bms` | Number | State of Charge (BMS) | | ||
| `last_soc` | String | Timestamp of the latest state of charge export | | ||
| `soh` | Number | State of Health | | ||
| `charging` | Switch | ON if charging | | ||
| `rapid_charge_port` | Switch | ON if connected to a rapid charging port | | ||
| `normal_charge_port` | Switch | ON if connected to a normal charging port | | ||
| `slow_charge_port` | Switch | ON if connected to a slow charging port | | ||
Comment on lines
+44
to
+46
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion (not a request for change): you could have defined one unique channel for the type of charging port (rapid, normal, slow). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
You are right, but I just reused the terminology, of the ev notify service. |
||
| `aux_battery_voltage` | Number | Voltage of the aux battery | | ||
| `dc_battery_voltage` | Number | Voltage of the DC battery | | ||
| `dc_battery_current` | Number | Current of the DC battery | | ||
| `dc_battery_power` | Number | Power of the DC battery | | ||
| `cumulative_energy_charged` | Number | Amount of energy that has been charged | | ||
| `cumulative_energy_discharged` | Number | Amount of energy that has been discharged | | ||
| `battery_min_temperature` | Number | The minimum temperature of the battery | | ||
| `battery_max_temperature` | Number | The maximum temperature of the battery | | ||
| `battery_inlet_temperature` | Number | The inlet temperature of the battery | | ||
| `external_temperature` | Number | External temperature | | ||
Comment on lines
+47
to
+56
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could certainly rather used Number with the appropriate dimension in order to let the user define the unit he would like. |
||
| `last_extended` | String | Timestamp of the latest export | | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The channel name is a little strange and if the channel is a timestamps, the item type is not the good one. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above: Just reused terminology of the ev notify service. |
||
|
||
## Full Example | ||
|
||
### evnotify.things | ||
|
||
``` | ||
# Thing evnotify:vehicle:YOUR_VEHICLE_ID "YOUR_VEHICLE_LABEL" @ "YOUR_VEHICLE_LOCATION" [akey="YOUR_AKEY",token="YOUR_TOKEN",refreshInterval=120] | ||
Thing evnotify:vehicle:ioniq "Ioniq" @ "Carport" [akey="YOUR_AKEY",token="YOUR_TOKEN",refreshInterval=120] | ||
``` | ||
|
||
 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am not sure this picture add any value... |
||
|
||
### evnotify.items | ||
|
||
``` | ||
// Equipment representing thing: | ||
// evnotify:vehicle:ioniq | ||
// (Ioniq) | ||
Comment on lines
+73
to
+75
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Probably something not useful. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That are the comments openHAB is exporting, for the example thing. So for the added example image in my opinion it could be useful for the users. |
||
|
||
Group Ioniq "Ioniq" ["Car"] | ||
|
||
// Points: | ||
|
||
Number Ioniq_StateofChargeDisplay "State of Charge (Display)" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:soc_display" } | ||
Number Ioniq_StateofChargeBMS "State of Charge (BMS)" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:soc_bms" } | ||
String Ioniq_Lateststateofcharge "Latest state of charge" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:last_soc" } | ||
Number Ioniq_StateofHealth "State of Health" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:soh" } | ||
Switch Ioniq_Charging "Charging" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:charging" } | ||
Switch Ioniq_RapidChargingPort "Rapid Charging Port" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:rapid_charge_port" } | ||
Switch Ioniq_NormalChargingPort "Normal Charging Port" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:normal_charge_port" } | ||
Switch Ioniq_SlowChargingPort "Slow Charging Port" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:slow_charge_port" } | ||
Number:ElectricPotential Ioniq_AUXBatteryVoltage "AUX Battery Voltage" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:aux_battery_voltage" } | ||
Number:ElectricPotential Ioniq_DCBatteryVoltage "DC Battery Voltage" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:dc_battery_voltage" } | ||
Number:ElectricCurrent Ioniq_DCBatteryCurrent "DC Battery Current" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:dc_battery_current" } | ||
Number:Power Ioniq_DCBatteryPower "DC Battery Power" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:dc_battery_power" } | ||
Number:Energy Ioniq_CumulativeEnergyCharged "Cumulative Energy Charged" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:cumulative_energy_charged" } | ||
Number:Energy Ioniq_CumulativeEnergyDischarged "Cumulative Energy Discharged" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:cumulative_energy_discharged" } | ||
Number:Temperature Ioniq_BatteryMinTemperature "Battery Min Temperature" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:battery_min_temperature" } | ||
Number:Temperature Ioniq_BatteryMaxTemperature "Battery Max Temperature" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:battery_max_temperature" } | ||
Number:Temperature Ioniq_BatteryInletTemperature "Battery Inlet Temperature" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:battery_inlet_temperature" } | ||
Number:Temperature Ioniq_ExternalTemperature "External Temperature" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:external_temperature" } | ||
String Ioniq_Latestexport "Latest export" (Ioniq) ["Point"] { channel="evnotify:vehicle:ioniq:last_extended" } | ||
``` | ||
|
||
 |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,17 @@ | ||||||
<?xml version="1.0" encoding="UTF-8"?> | ||||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" | ||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
See #11833 |
||||||
|
||||||
<modelVersion>4.0.0</modelVersion> | ||||||
|
||||||
<parent> | ||||||
<groupId>org.openhab.addons.bundles</groupId> | ||||||
<artifactId>org.openhab.addons.reactor.bundles</artifactId> | ||||||
<version>3.3.0-SNAPSHOT</version> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
</parent> | ||||||
|
||||||
<artifactId>org.openhab.binding.evnotify</artifactId> | ||||||
|
||||||
<name>openHAB Add-ons :: Bundles :: EVNotify Binding</name> | ||||||
|
||||||
</project> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<features name="org.openhab.binding.evnotify-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"> | ||
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository> | ||
|
||
<feature name="openhab-binding-evnotify" description="EVNotify Binding" version="${project.version}"> | ||
<feature>openhab-runtime-base</feature> | ||
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.evnotify/${project.version}</bundle> | ||
</feature> | ||
</features> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
/** | ||
* Copyright (c) 2010-2022 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.evnotify.api; | ||
|
||
import org.eclipse.jdt.annotation.NonNullByDefault; | ||
|
||
/** | ||
* Class for API error. | ||
* | ||
* @author Michael Schmidt - Initial contribution | ||
*/ | ||
@NonNullByDefault | ||
public class ApiException extends Exception { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed |
||
|
||
public ApiException(String message) { | ||
super(message); | ||
} | ||
|
||
public ApiException(String message, Throwable cause) { | ||
super(message, cause); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/** | ||
* Copyright (c) 2010-2022 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.evnotify.api; | ||
|
||
import org.eclipse.jdt.annotation.NonNullByDefault; | ||
import org.eclipse.jdt.annotation.Nullable; | ||
|
||
/** | ||
* Represents version for the API of the evnotify online service. | ||
* | ||
* @author Michael Schmidt - Initial contribution | ||
*/ | ||
@NonNullByDefault | ||
public enum ApiVersion { | ||
|
||
V2, | ||
V3; | ||
|
||
public static ApiVersion getApiVersion(@Nullable String searchVersion) { | ||
|
||
for (ApiVersion version : ApiVersion.values()) { | ||
if (version.name().equals(searchVersion)) { | ||
return version; | ||
} | ||
} | ||
|
||
throw new IllegalArgumentException(String.format("'%s' is not a valid version", searchVersion)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. NullPointerException if searchVersion is null There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Give String.format("'%s' is not a valid version", null) a try |
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/** | ||
* Copyright (c) 2010-2022 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.evnotify.api; | ||
|
||
import java.time.OffsetDateTime; | ||
|
||
import org.eclipse.jdt.annotation.NonNullByDefault; | ||
|
||
/** | ||
* Interface for the data from the API of the evnotify online service. | ||
* | ||
* @author Michael Schmidt - Initial contribution | ||
*/ | ||
@NonNullByDefault | ||
public interface ChargingData { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed |
||
|
||
Float getStateOfChargeDisplay(); | ||
|
||
Float getStateOfChargeBms(); | ||
|
||
OffsetDateTime getLastStateOfCharge(); | ||
|
||
Boolean isCharging(); | ||
|
||
Boolean isRapidChargePort(); | ||
|
||
Boolean isNormalChargePort(); | ||
|
||
Boolean isSlowChargePort(); | ||
|
||
Float getStateOfHealth(); | ||
|
||
Float getAuxBatteryVoltage(); | ||
|
||
Float getDcBatteryVoltage(); | ||
|
||
Float getDcBatteryCurrent(); | ||
|
||
Float getDcBatteryPower(); | ||
|
||
Float getCumulativeEnergyCharged(); | ||
|
||
Float getCumulativeEnergyDischarged(); | ||
|
||
Float getBatteryMinTemperature(); | ||
|
||
Float getBatteryMaxTemperature(); | ||
|
||
Float getBatteryInletTemperature(); | ||
|
||
Float getExternalTemperature(); | ||
|
||
OffsetDateTime getLastExtended(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/** | ||
* Copyright (c) 2010-2022 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.evnotify.api; | ||
|
||
import java.io.IOException; | ||
|
||
import org.eclipse.jdt.annotation.NonNullByDefault; | ||
|
||
/** | ||
* Interface for the client to get data from the API of the evnotify online service. | ||
* | ||
* @author Michael Schmidt - Initial contribution | ||
*/ | ||
@NonNullByDefault | ||
public interface EVNotifyClient { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed |
||
|
||
/** | ||
* returns a {@link ChargingData} | ||
* | ||
* @return state of a car | ||
*/ | ||
ChargingData getCarChargingData() throws IOException, InterruptedException, ApiException; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/** | ||
* Copyright (c) 2010-2022 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.evnotify.api.v2; | ||
|
||
import java.time.Instant; | ||
import java.time.OffsetDateTime; | ||
import java.time.ZoneId; | ||
|
||
import com.google.gson.annotations.SerializedName; | ||
|
||
/** | ||
* Represents the basic data that is returned by evnotify v2 API. | ||
* | ||
* e.g. | ||
* | ||
* { | ||
* "soc_display": 93, | ||
* "soc_bms": 88.5, | ||
* "last_soc": 1631220014 | ||
* } | ||
* | ||
* @author Michael Schmidt - Initial contribution | ||
*/ | ||
public class BasicChargingDataDTO { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add |
||
|
||
@SerializedName("soc_display") | ||
public Float stateOfChargeDisplay; | ||
|
||
@SerializedName("soc_bms") | ||
public Float stateOfChargeBms; | ||
|
||
@SerializedName("last_soc") | ||
public Integer lastStateOfCharge; | ||
|
||
public Float getStateOfChargeDisplay() { | ||
return stateOfChargeDisplay; | ||
} | ||
|
||
public Float getStateOfChargeBms() { | ||
return stateOfChargeBms; | ||
} | ||
|
||
public OffsetDateTime getLastStateOfCharge() { | ||
return lastStateOfCharge == null ? null | ||
: OffsetDateTime.from(Instant.ofEpochSecond(lastStateOfCharge).atZone(ZoneId.systemDefault())); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the channel is a timestamps, the item type is not the good one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above: Just reused terminology of the ev notify service.