**Supported channels for the Room thing:**
-| Channel Group | Channel Id | Item Type | Description |
-|------------------|-----------------------|----------------------|---------------------------------------------------------|
-| room-temperature | value | Number:Temperature | Current temperature in the room |
-| room-properties | window-open | Contact | Windows of the room are opened |
-| room-properties | anticipating | Switch | Anticipates next scheduled setpoint |
-| room-properties | heating-power-request | Number:Dimensionless | Percentage of heating power |
-| setpoint | value | Number:Temperature | Thermostat temperature setpoint |
-| setpoint | mode | String | Chosen thermostat mode (home, frost guard, manual, max) |
-| setpoint | start | DateTime | Start time of the currently applied setpoint |
-| setpoint | end | DateTime | End time of the currently applied setpoint |
+| Channel Group | Channel Id | Item Type | Description |
+|---------------|-----------------------|----------------------|---------------------------------------------------------|
+| temperature | value | Number:Temperature | Current temperature in the room |
+| properties | window-open | Contact | Windows of the room are opened |
+| properties | anticipating | Switch | Anticipates next scheduled setpoint |
+| properties | heating-power-request | Number:Dimensionless | Percentage of heating power |
+| setpoint | value | Number:Temperature | Thermostat temperature setpoint |
+| setpoint | mode | String | Chosen thermostat mode (home, frost guard, manual, max) |
+| setpoint | start | DateTime | Start time of the currently applied setpoint |
+| setpoint | end | DateTime | End time of the currently applied setpoint |
All these channels except setpoint and setpoint-mode are read only.
**Supported channels for the thermostat module:**
-| Channel Group | Channel Id | Item Type | Description |
-|---------------------|--------------------|----------------------|--------------------------------------------------|
-| th-properties | relay-status | Contact | Indicates if the boiler is currently heating |
-| signal | strength | Number | Signal strength (0 for no signal, 1 for weak...) |
-| signal | value | Number:Power | Signal strength in dBm |
-| battery | value | Number | Battery level |
-| battery | low-battery | Switch | Low battery |
-| battery | status | String | Description of the battery status (*) |
+| Channel Group | Channel Id | Item Type | Description |
+|---------------|-------------|--------------|--------------------------------------------------|
+| properties | relay | Contact | Indicates if the boiler is currently heating |
+| signal | strength | Number | Signal strength (0 for no signal, 1 for weak...) |
+| signal | value | Number:Power | Signal strength in dBm |
+| battery | value | Number | Battery level |
+| battery | low-battery | Switch | Low battery |
+| battery | status | String | Description of the battery status (*) |
(*) Can be UNDEF on some modules
| | TAG_UNINSTALLED | Triggered when a tag gets uninstalled |
| | TAG_OPEN | Triggered when an open event of a tag was detected |
-### Welcome and Presence Camera
+### Welcome, Presence and Doorbell Cameras
Warnings:
(*) This channel is configurable : low, poor, high.
+**Supported channels for the Welcome Doorbell thing:**
+
+| Channel Group | Channel ID | Item Type | Read/Write | Description |
+|---------------|-------------------|--------------|------------|---------------------------------------------------------------------------------------------------------------------------------------------|
+| status | sd-card | String | Read-only | State of the SD card |
+| status | alim | String | Read-only | State of the power connector |
+| live | picture | Image | Read-only | Camera Live Snapshot |
+| live | local-picture-url | String | Read-only | Local Url of the live snapshot for this camera |
+| live | vpn-picture-url | String | Read-only | Url of the live snapshot for this camera through Netatmo VPN. |
+| signal | strength | Number | Read-only | Signal strength (0 for no signal, 1 for weak...) |
+| signal | value | Number:Power | Read-only | Signal strength in dBm |
+| last-event | type | String | Read-only | Type of event |
+| last-event | video-status | String | Read-only | Status of the video (recording, deleted or available) |
+| last-event | time | DateTime | Read-only | Time of occurrence of event |
+| last-event | local-video-url | String | Read-only | If the last event (depending upon event type) in the home lead a snapshot picture, the corresponding local video URL will be available here |
+| last-event | vpn-video-url | String | Read-only | If the last event (depending upon event type) in the home lead a snapshot picture, the corresponding VPN video URL will be available here |
+| sub-event | type | String | Read-only | Type of sub-event |
+| sub-event | time | DateTime | Read-only | Time of occurrence of sub-event |
+| sub-event | message | String | Read-only | Message sent by Netatmo corresponding to given sub-event |
+| sub-event | snapshot-url | String | Read-only | Depending upon event type in the home, a snapshot picture of the corresponding local video URL will be available here |
+| sub-event | vignette-url | String | Read-only | A vignette representing the snapshot |
+| sub-event | snapshot | Image | Read-only | picture of the snapshot |
+| sub-event | vignet | Image | Read-only | picture of the vignette |
+
+
+Note: live feeds either locally or via VPN are not available in Netatmo API.
+
### Welcome Person
**Supported channels for the Person thing:**
-| Channel Group | Channel ID | Item Type | Description |
-|----------------|----------------|--------------|--------------------------------------------------------|
-| person | avatar-url | String | URL for the avatar of this person |
-| person | avatar | Image | Avatar of this person |
-| person | at-home | Switch | Indicates if this person is known to be at home or not |
-| person | last-seen | DateTime | Moment when this person was last seen |
-| person-event | subtype | String | Sub-type of event |
-| person-event | message | String | Last event message from this person |
-| person-event | time | DateTime | Moment of the last event for this person |
-| person-event | snapshot | Image | Picture of the last event for this person |
-| person-event | snapshot-url | String | URL for the picture of the last event for this person |
-| person-event | camera-id | String | ID of the camera that triggered the event |
+| Channel Group | Channel ID | Item Type | Description |
+|---------------|--------------|-----------|--------------------------------------------------------|
+| person | avatar-url | String | URL for the avatar of this person |
+| person | avatar | Image | Avatar of this person |
+| person | at-home | Switch | Indicates if this person is known to be at home or not |
+| person | last-seen | DateTime | Moment when this person was last seen |
+| last-event | subtype | String | Sub-type of event |
+| last-event | message | String | Last event message from this person |
+| last-event | time | DateTime | Moment of the last event for this person |
+| last-event | snapshot | Image | Picture of the last event for this person |
+| last-event | snapshot-url | String | URL for the picture of the last event for this person |
+| last-event | camera-id | String | ID of the camera that triggered the event |
All these channels except at-home are read only.
*/
package org.openhab.binding.netatmo.internal;
+import java.util.Set;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
// Channel group ids
public static final String GROUP_LAST_EVENT = "last-event";
+ public static final String GROUP_SUB_EVENT = "sub-event";
public static final String GROUP_TEMPERATURE = "temperature";
public static final String GROUP_HUMIDITY = "humidity";
public static final String GROUP_AIR_QUALITY = "airquality";
public static final String GROUP_CAM_LIVE = "live";
public static final String GROUP_PRESENCE = "presence";
public static final String GROUP_PERSON = "person";
- public static final String GROUP_PERSON_EVENT = "person-event";
- public static final String GROUP_ROOM_TEMPERATURE = "room-temperature";
- public static final String GROUP_ROOM_PROPERTIES = "room-properties";
- public static final String GROUP_TH_PROPERTIES = "th-properties";
- public static final String GROUP_TH_SETPOINT = "setpoint";
+ public static final String GROUP_PROPERTIES = "properties";
+ public static final String GROUP_SETPOINT = "setpoint";
public static final String GROUP_LOCATION = "location";
// Alternative extended groups
public static final String OPTION_EXTENDED = "-extended";
public static final String OPTION_OUTSIDE = "-outside";
+ public static final String OPTION_DOORBELL = "-doorbell";
+ public static final String OPTION_PERSON = "-person";
+ public static final String OPTION_ROOM = "-room";
+ public static final String OPTION_THERMOSTAT = "-thermostat";
+ public static final Set<String> GROUP_VARIATIONS = Set.of(OPTION_EXTENDED, OPTION_OUTSIDE, OPTION_DOORBELL,
+ OPTION_PERSON, OPTION_ROOM, OPTION_THERMOSTAT);
public static final String GROUP_TYPE_TIMESTAMP_EXTENDED = GROUP_TIMESTAMP + OPTION_EXTENDED;
public static final String GROUP_TYPE_BATTERY_EXTENDED = GROUP_BATTERY + OPTION_EXTENDED;
public static final String GROUP_TYPE_PRESSURE_EXTENDED = GROUP_PRESSURE + OPTION_EXTENDED;
public static final String GROUP_TYPE_TEMPERATURE_EXTENDED = GROUP_TEMPERATURE + OPTION_EXTENDED;
public static final String GROUP_TYPE_AIR_QUALITY_EXTENDED = GROUP_AIR_QUALITY + OPTION_EXTENDED;
public static final String GROUP_TYPE_TEMPERATURE_OUTSIDE = GROUP_TEMPERATURE + OPTION_OUTSIDE;
+ public static final String GROUP_DOORBELL_STATUS = GROUP_CAM_STATUS + OPTION_DOORBELL;
+ public static final String GROUP_DOORBELL_LIVE = GROUP_CAM_LIVE + OPTION_DOORBELL;
+ public static final String GROUP_DOORBELL_LAST_EVENT = GROUP_LAST_EVENT + OPTION_DOORBELL;
+ public static final String GROUP_DOORBELL_SUB_EVENT = GROUP_SUB_EVENT + OPTION_DOORBELL;
+ public static final String GROUP_PERSON_LAST_EVENT = GROUP_LAST_EVENT + OPTION_PERSON;
+ public static final String GROUP_TYPE_ROOM_TEMPERATURE = GROUP_TEMPERATURE + OPTION_ROOM;
+ public static final String GROUP_TYPE_ROOM_PROPERTIES = GROUP_PROPERTIES + OPTION_ROOM;
+ public static final String GROUP_TYPE_TH_PROPERTIES = GROUP_PROPERTIES + OPTION_THERMOSTAT;
// Channel ids
public static final String CHANNEL_VALUE = "value";
public static final String CHANNEL_SETPOINT_MODE = "mode";
public static final String CHANNEL_SETPOINT_START_TIME = "start";
public static final String CHANNEL_SETPOINT_END_TIME = "end";
- public static final String CHANNEL_THERM_RELAY = "relay-status";
+ public static final String CHANNEL_THERM_RELAY = "relay";
public static final String CHANNEL_ANTICIPATING = "anticipating";
public static final String CHANNEL_ROOM_WINDOW_OPEN = "window-open";
public static final String CHANNEL_ROOM_HEATING_POWER = "heating-power-request";
public static final String CHANNEL_EVENT_TIME = "time";
public static final String CHANNEL_EVENT_SNAPSHOT = "snapshot";
public static final String CHANNEL_EVENT_SNAPSHOT_URL = "snapshot-url";
+ public static final String CHANNEL_EVENT_VIGNETTE = "vignette";
+ public static final String CHANNEL_EVENT_VIGNETTE_URL = "vignette-url";
public static final String CHANNEL_EVENT_VIDEO_VPN_URL = "vpn-video-url";
public static final String CHANNEL_EVENT_VIDEO_LOCAL_URL = "local-video-url";
public static final String CHANNEL_EVENT_PERSON_ID = "person-id";
* @throws NetatmoException If fail to call the API, e.g. server error or deserializing
*/
public StationDataResponse getHomeCoachData(@Nullable String deviceId) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMECOACH, PARAM_DEVICEID, deviceId);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMECOACH, PARAM_DEVICE_ID, deviceId);
return get(uriBuilder, StationDataResponse.class);
}
* response body
*/
public void switchSchedule(String homeId, String scheduleId) throws NetatmoException {
- UriBuilder uriBuilder = getAppUriBuilder(SUB_PATH_SWITCHSCHEDULE, PARAM_HOMEID, homeId, PARAM_SCHEDULEID,
+ UriBuilder uriBuilder = getAppUriBuilder(SUB_PATH_SWITCH_SCHEDULE, PARAM_HOME_ID, homeId, PARAM_SCHEDULE_ID,
scheduleId);
post(uriBuilder, ApiResponse.Ok.class, null, null);
}
* @throws NetatmoCommunicationException when call failed, e.g. server error or cannot deserialize
*/
public void setThermMode(String homeId, String mode) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_SETTHERMMODE, PARAM_HOMEID, homeId, PARAM_MODE, mode);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_SET_THERM_MODE, PARAM_HOME_ID, homeId, PARAM_MODE, mode);
post(uriBuilder, ApiResponse.Ok.class, null, null);
}
*/
public void setThermpoint(String homeId, String roomId, SetpointMode mode, long endtime, double temp)
throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_SETROOMTHERMPOINT, PARAM_HOMEID, homeId, PARAM_ROOMID, roomId,
- PARAM_MODE, mode.apiDescriptor);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_SET_ROOM_THERMPOINT, PARAM_HOME_ID, homeId, PARAM_ROOM_ID,
+ roomId, PARAM_MODE, mode.apiDescriptor);
if (mode == SetpointMode.MANUAL || mode == SetpointMode.MAX) {
uriBuilder.queryParam("endtime", endtime);
if (mode == SetpointMode.MANUAL) {
}
public @Nullable HomeStatus getHomeStatus(String homeId) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMESTATUS, PARAM_HOMEID, homeId);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMESTATUS, PARAM_HOME_ID, homeId);
NAHomeStatusResponse response = get(uriBuilder, NAHomeStatusResponse.class);
NAHomeStatus body = response.getBody();
public Collection<HomeData> getHomesData(@Nullable String homeId, @Nullable ModuleType type)
throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMES_DATA, PARAM_HOMEID, homeId);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_HOMES_DATA, PARAM_HOME_ID, homeId);
if (type != null) {
- uriBuilder.queryParam(PARAM_GATEWAYTYPE, type.name());
+ uriBuilder.queryParam(PARAM_GATEWAY_TYPE, type.name());
}
HomeData.HomesDataResponse response = get(uriBuilder, HomeData.HomesDataResponse.class);
* @throws NetatmoException If fail to call the API, e.g. server error or deserializing
*/
public void dropWebhook() throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_DROPWEBHOOK);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_DROP_WEBHOOK);
post(uriBuilder, ApiResponse.Ok.class, null, null);
}
* @throws NetatmoException If fail to call the API, e.g. server error or deserializing
*/
public boolean addwebhook(URI uri) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_ADDWEBHOOK, PARAM_URL, uri.toString());
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_ADD_WEBHOOK, PARAM_URL, uri.toString());
post(uriBuilder, ApiResponse.Ok.class, null, null);
return true;
}
public Collection<HomeEvent> getPersonEvents(String homeId, String personId) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GETEVENTS, PARAM_HOMEID, homeId, PARAM_PERSONID, personId,
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_EVENTS, PARAM_HOME_ID, homeId, PARAM_PERSON_ID, personId,
PARAM_OFFSET, 1);
NAEventsDataResponse response = get(uriBuilder, NAEventsDataResponse.class);
BodyResponse<Home> body = response.getBody();
throw new NetatmoException("home should not be null");
}
- public Collection<HomeEvent> getCameraEvents(String homeId, String cameraId) throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GETEVENTS, PARAM_HOMEID, homeId, PARAM_DEVICEID, cameraId);
- NAEventsDataResponse response = get(uriBuilder, NAEventsDataResponse.class);
- BodyResponse<Home> body = response.getBody();
+ public Collection<HomeEvent> getCameraEvents(String homeId, String deviceId, String deviceType)
+ throws NetatmoException {
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_EVENTS, PARAM_HOME_ID, homeId, PARAM_DEVICE_ID, deviceId,
+ PARAM_DEVICES_TYPE, deviceType);
+ BodyResponse<Home> body = get(uriBuilder, NAEventsDataResponse.class).getBody();
if (body != null) {
Home home = body.getElement();
if (home != null) {
*/
private StationDataResponse getStationsData(@Nullable String deviceId, boolean getFavorites)
throws NetatmoException {
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GETSTATION, PARAM_DEVICEID, deviceId, //
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_STATION, PARAM_DEVICE_ID, deviceId, //
PARAM_FAVORITES, getFavorites);
StationDataResponse response = get(uriBuilder, StationDataResponse.class);
return response;
private MeasureBodyElem<?> getMeasure(String deviceId, @Nullable String moduleId, @Nullable String scale,
String measureType) throws NetatmoException {
// NAMeasuresResponse is not designed for optimize=false
- UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GETMEASURE, PARAM_DEVICEID, deviceId, "real_time", true,
- "date_end", "last", "optimize", true, "type", measureType.toLowerCase(), PARAM_MODULEID, moduleId);
+ UriBuilder uriBuilder = getApiUriBuilder(SUB_PATH_GET_MEASURE, PARAM_DEVICE_ID, deviceId, "real_time", true,
+ "date_end", "last", "optimize", true, "type", measureType.toLowerCase(), PARAM_MODULE_ID, moduleId);
if (scale != null) {
uriBuilder.queryParam("scale", scale.toLowerCase());
@SerializedName("movement") // When the Indoor Camera detects motion
MOVEMENT(ModuleType.WELCOME),
- @SerializedName("human") // When the Indoor Camera detects human motion
- HUMAN(ModuleType.WELCOME),
+ @SerializedName("human") // When the camera detects human motion
+ HUMAN(ModuleType.WELCOME, ModuleType.OUTDOOR, ModuleType.DOORBELL),
- @SerializedName("animal") // When the Indoor Camera detects animal motion
- ANIMAL(ModuleType.WELCOME),
+ @SerializedName("animal") // When the camera detects animal motion
+ ANIMAL(ModuleType.WELCOME, ModuleType.OUTDOOR),
+
+ @SerializedName("vehicle") // When the Outdoor Camera detects a car
+ VEHICLE(ModuleType.OUTDOOR),
@SerializedName("new_module") // A new Module has been paired with the Indoor Camera
NEW_MODULE(ModuleType.WELCOME),
@SerializedName("module_end_update") // Module's firmware update is over
MODULE_END_UPDATE(ModuleType.WELCOME),
- @SerializedName("connection") // When the Camera connects to Netatmo servers
+ @SerializedName("connection") // When the camera connects to Netatmo servers
CONNECTION(ModuleType.WELCOME, ModuleType.PRESENCE),
- @SerializedName("disconnection") // When the Camera loses connection with Netatmo servers
+ @SerializedName("disconnection") // When the camera loses connection with Netatmo servers
DISCONNECTION(ModuleType.WELCOME, ModuleType.PRESENCE),
@SerializedName("on") // When Camera Monitoring is resumed
SD(ModuleType.WELCOME, ModuleType.PRESENCE),
@SerializedName("alim") // When Camera power supply status changes
- ALIM(ModuleType.WELCOME, ModuleType.PRESENCE);
+ ALIM(ModuleType.WELCOME, ModuleType.PRESENCE),
+
+ @SerializedName("accepted_call") // When a call is incoming
+ ACCEPTED_CALL(ModuleType.DOORBELL),
+
+ @SerializedName("incoming_call") // When a call as been answered by a user
+ INCOMING_CALL(ModuleType.DOORBELL),
+
+ @SerializedName("missed_call") // When a call has not been answered by anyone
+ MISSED_CALL(ModuleType.DOORBELL);
private final Set<ModuleType> appliesTo;
return name().toLowerCase();
}
- public boolean appliesOn(ModuleType searched) {
+ public boolean validFor(ModuleType searched) {
return appliesTo.contains(searched);
}
}
import org.openhab.binding.netatmo.internal.handler.channelhelper.BatteryExtChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.CameraChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.ChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.DoorbellChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.EventChannelHelper;
+import org.openhab.binding.netatmo.internal.handler.channelhelper.EventDoorbellChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.EventPersonChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.HomeEnergyChannelHelper;
import org.openhab.binding.netatmo.internal.handler.channelhelper.HomeSecurityChannelHelper;
*/
@NonNullByDefault
public enum ModuleType {
- UNKNOWN(FeatureArea.NONE, null, null, List.of(), List.of()),
- ACCOUNT(FeatureArea.NONE, null, null, List.of(), List.of()),
+ UNKNOWN(FeatureArea.NONE, "", null, List.of(), List.of()),
+ ACCOUNT(FeatureArea.NONE, "", null, List.of(), List.of()),
@SerializedName("NAHome")
HOME(FeatureArea.NONE, "NAHome", ACCOUNT,
List.of(DeviceCapability.class, EventCapability.class, HomeCapability.class, ChannelHelperCapability.class),
@SerializedName("NOC")
PRESENCE(FeatureArea.SECURITY, "NOC", HOME,
List.of(EventCapability.class, PresenceCapability.class, ChannelHelperCapability.class),
- List.of(CameraChannelHelper.class, PresenceChannelHelper.class, SignalChannelHelper.class,
- EventChannelHelper.class)),
+ List.of(PresenceChannelHelper.class, SignalChannelHelper.class, EventChannelHelper.class)),
@SerializedName("NIS")
SIREN(FeatureArea.SECURITY, "NIS", HOME, List.of(ChannelHelperCapability.class),
List.of(BatteryChannelHelper.class, TimestampChannelHelper.class, SignalChannelHelper.class)),
@SerializedName("NDB")
- DOORBELL(FeatureArea.SECURITY, "NDB", HOME, List.of(ChannelHelperCapability.class),
- List.of(SignalChannelHelper.class)),
+ DOORBELL(FeatureArea.SECURITY, "NDB", HOME,
+ List.of(EventCapability.class, CameraCapability.class, ChannelHelperCapability.class),
+ List.of(DoorbellChannelHelper.class, SignalChannelHelper.class, EventDoorbellChannelHelper.class)),
@SerializedName("NAMain")
WEATHER_STATION(FeatureArea.WEATHER, "NAMain", ACCOUNT,
List.of(DeviceCapability.class, WeatherCapability.class, MeasureCapability.class,
public final List<Class<? extends Capability>> capabilities;
public final ThingTypeUID thingTypeUID;
public final FeatureArea feature;
- public final @Nullable String apiName;
+ public final String apiName;
- ModuleType(FeatureArea feature, @Nullable String apiName, @Nullable ModuleType bridge,
+ ModuleType(FeatureArea feature, String apiName, @Nullable ModuleType bridge,
List<Class<? extends Capability>> capabilities, List<Class<? extends ChannelHelper>> helpers) {
this.channelHelpers = helpers;
this.bridgeType = bridge;
public static final String SUB_PATH_PERSON_AWAY = "setpersonsaway";
public static final String SUB_PATH_PERSON_HOME = "setpersonshome";
public static final String SUB_PATH_HOMES_DATA = "homesdata";
- public static final String SUB_PATH_ADDWEBHOOK = "addwebhook";
- public static final String SUB_PATH_DROPWEBHOOK = "dropwebhook";
- public static final String SUB_PATH_SETROOMTHERMPOINT = "setroomthermpoint";
- public static final String SUB_PATH_SETTHERMMODE = "setthermmode";
- public static final String SUB_PATH_SWITCHSCHEDULE = "switchschedule";
- public static final String SUB_PATH_GETSTATION = "getstationsdata";
- public static final String SUB_PATH_GETMEASURE = "getmeasure";
+ public static final String SUB_PATH_ADD_WEBHOOK = "addwebhook";
+ public static final String SUB_PATH_DROP_WEBHOOK = "dropwebhook";
+ public static final String SUB_PATH_SET_ROOM_THERMPOINT = "setroomthermpoint";
+ public static final String SUB_PATH_SET_THERM_MODE = "setthermmode";
+ public static final String SUB_PATH_SWITCH_SCHEDULE = "switchschedule";
+ public static final String SUB_PATH_GET_STATION = "getstationsdata";
+ public static final String SUB_PATH_GET_MEASURE = "getmeasure";
public static final String SUB_PATH_HOMESTATUS = "homestatus";
public static final String SUB_PATH_HOMECOACH = "gethomecoachsdata";
- public static final String SUB_PATH_GETEVENTS = "getevents";
+ public static final String SUB_PATH_GET_EVENTS = "getevents";
public static final String SUB_PATH_PING = "ping";
public static final String SUB_PATH_CHANGESTATUS = "changestatus";
- public static final String PARAM_DEVICEID = "device_id";
- public static final String PARAM_MODULEID = "module_id";
- public static final String PARAM_HOMEID = "home_id";
- public static final String PARAM_ROOMID = "room_id";
- public static final String PARAM_PERSONID = "person_id";
- public static final String PARAM_SCHEDULEID = "schedule_id";
+ public static final String PARAM_DEVICE_ID = "device_id";
+ public static final String PARAM_MODULE_ID = "module_id";
+ public static final String PARAM_HOME_ID = "home_id";
+ public static final String PARAM_ROOM_ID = "room_id";
+ public static final String PARAM_PERSON_ID = "person_id";
+ public static final String PARAM_SCHEDULE_ID = "schedule_id";
public static final String PARAM_OFFSET = "offset";
- public static final String PARAM_GATEWAYTYPE = "gateway_types";
+ public static final String PARAM_GATEWAY_TYPE = "gateway_types";
public static final String PARAM_MODE = "mode";
public static final String PARAM_URL = "url";
public static final String PARAM_FAVORITES = "get_favorites";
public static final String PARAM_STATUS = "status";
+ public static final String PARAM_DEVICES_TYPE = "device_types";
// Autentication process params
public static final String PARAM_ERROR = "error";
package org.openhab.binding.netatmo.internal.api.dto;
import java.time.ZonedDateTime;
+import java.util.List;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
private @Nullable String personId;
private EventCategory category = EventCategory.UNKNOWN;
private @Nullable Snapshot snapshot;
+ private @Nullable Snapshot vignette;
private @Nullable String videoId;
private VideoStatus videoStatus = VideoStatus.UNKNOWN;
private boolean isArrival;
+ private List<HomeEvent> subevents = List.of();
@Override
public ZonedDateTime getTime() {
@Override
public @Nullable String getSnapshotUrl() {
- Snapshot localSnap = snapshot;
- return localSnap != null ? localSnap.getUrl() : null;
+ Snapshot image = snapshot;
+ return image != null ? image.getUrl() : null;
+ }
+
+ public @Nullable String getVignetteUrl() {
+ Snapshot image = vignette;
+ return image != null ? image.getUrl() : null;
+ }
+
+ public List<HomeEvent> getSubevents() {
+ return subevents;
+ }
+
+ public @Nullable Snapshot getVignette() {
+ return vignette;
}
}
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.data.ModuleType;
import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.AlimentationStatus;
import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.BatteryState;
import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.FloodLightMode;
public State getMonitoring() {
OnOffType localStatus = monitoring;
- return localStatus != null ? localStatus : UnDefType.NULL;
+ return localStatus != null ? localStatus // Monitoring is always active on Doorbell
+ : getType().equals(ModuleType.DOORBELL) ? OnOffType.ON : UnDefType.NULL;
}
public FloodLightMode getFloodlight() {
public List<NAObject> updateReadings() {
List<NAObject> result = new ArrayList<>();
securityCapability.ifPresent(cap -> {
- Collection<HomeEvent> events = cap.getCameraEvents(handler.getId());
+ Collection<HomeEvent> events = cap.getCameraEvents(handler.getId(), moduleType.apiName);
if (!events.isEmpty()) {
- result.add(events.iterator().next());
+ HomeEvent event = events.iterator().next();
+ result.add(event);
+ result.addAll(event.getSubevents());
}
});
return result;
public PersonCapability(CommonInterface handler, NetatmoDescriptionProvider descriptionProvider,
List<ChannelHelper> channelHelpers) {
super(handler, descriptionProvider, channelHelpers);
- this.cameraChannelUID = new ChannelUID(thing.getUID(), GROUP_PERSON_EVENT, CHANNEL_EVENT_CAMERA_ID);
+ this.cameraChannelUID = new ChannelUID(thing.getUID(), GROUP_PERSON_LAST_EVENT, CHANNEL_EVENT_CAMERA_ID);
}
@Override
EventType eventType = event.getEventType();
ZonedDateTime localLast = lastEventTime;
ZonedDateTime eventTime = event.getTime();
- if ((localLast != null && !eventTime.isAfter(localLast)) || !eventType.appliesOn(ModuleType.PERSON)) {
+ if ((localLast != null && !eventTime.isAfter(localLast)) || !eventType.validFor(ModuleType.PERSON)) {
return; // ignore incoming events if they are deprecated
}
lastEventTime = eventTime;
});
}
- public Collection<HomeEvent> getCameraEvents(String cameraId) {
+ public Collection<HomeEvent> getCameraEvents(String cameraId, String deviceType) {
return getApi().map(api -> {
try {
- return api.getCameraEvents(handler.getId(), cameraId);
+ return api.getCameraEvents(handler.getId(), cameraId, deviceType);
} catch (NetatmoException e) {
logger.warn("Error retrieving last events of camera '{}' : {}", cameraId, e.getMessage());
return null;
private @Nullable String localUrl;
public CameraChannelHelper() {
- super(GROUP_CAM_STATUS, GROUP_CAM_LIVE);
+ this(GROUP_CAM_STATUS, GROUP_CAM_LIVE);
+ }
+
+ protected CameraChannelHelper(String... providedGroups) {
+ super(providedGroups);
}
public void setUrls(String vpnUrl, @Nullable String localUrl) {
import org.openhab.binding.netatmo.internal.api.data.NetatmoConstants.MeasureClass;
import org.openhab.binding.netatmo.internal.api.dto.Dashboard;
import org.openhab.binding.netatmo.internal.api.dto.Event;
+import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
import org.openhab.binding.netatmo.internal.api.dto.NAObject;
import org.openhab.binding.netatmo.internal.api.dto.NAThing;
import org.openhab.binding.netatmo.internal.providers.NetatmoThingTypeProvider;
State result = null;
if (channelGroups.isEmpty() || (groupId != null && channelGroups.contains(groupId))) {
NAObject localData = data;
+ if (localData instanceof HomeEvent) {
+ result = internalGetHomeEvent(channelId, groupId, (HomeEvent) localData);
+ if (result != null) {
+ return result;
+ }
+ }
if (localData instanceof Event) {
result = internalGetEvent(channelId, (Event) localData);
if (result != null) {
return null;
}
+ protected @Nullable State internalGetHomeEvent(String channelId, @Nullable String groupId, HomeEvent event) {
+ return null;
+ }
+
public Set<String> getChannelGroupTypes() {
return channelGroupTypes;
}
--- /dev/null
+/**
+ * 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.netatmo.internal.handler.channelhelper;
+
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * The {@link DoorbellChannelHelper} handles specific channels of doorbells
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class DoorbellChannelHelper extends CameraChannelHelper {
+
+ public DoorbellChannelHelper() {
+ super(GROUP_DOORBELL_STATUS, GROUP_DOORBELL_LIVE);
+ }
+}
public class EventChannelHelper extends ChannelHelper {
private boolean isLocal;
private @Nullable String vpnUrl, localUrl;
- private ModuleType moduleType = ModuleType.UNKNOWN;
+ protected ModuleType moduleType = ModuleType.UNKNOWN;
public EventChannelHelper() {
this(GROUP_LAST_EVENT);
}
- protected EventChannelHelper(String groupName) {
- super(groupName);
+ protected EventChannelHelper(String... providedGroups) {
+ super(providedGroups);
}
public void setModuleType(ModuleType moduleType) {
public void setNewData(@Nullable NAObject data) {
if (data instanceof Event) {
Event event = (Event) data;
- if (!event.getEventType().appliesOn(moduleType)) {
+ if (!event.getEventType().validFor(moduleType)) {
return;
}
}
case CHANNEL_EVENT_SNAPSHOT_URL:
return toStringType(event.getSnapshotUrl());
}
- if (event instanceof HomeEvent) {
- HomeEvent homeEvent = (HomeEvent) event;
- switch (channelId) {
- case CHANNEL_EVENT_VIDEO_STATUS:
- return homeEvent.getVideoId() != null ? toStringType(homeEvent.getVideoStatus()) : UnDefType.NULL;
- case CHANNEL_EVENT_VIDEO_LOCAL_URL:
- return getStreamURL(true, homeEvent.getVideoId(), homeEvent.getVideoStatus());
- case CHANNEL_EVENT_VIDEO_VPN_URL:
- return getStreamURL(false, homeEvent.getVideoId(), homeEvent.getVideoStatus());
- }
+ return null;
+ }
+
+ @Override
+ protected @Nullable State internalGetHomeEvent(String channelId, @Nullable String groupId, HomeEvent event) {
+ switch (channelId) {
+ case CHANNEL_EVENT_VIDEO_STATUS:
+ return event.getVideoId() != null ? toStringType(event.getVideoStatus()) : UnDefType.NULL;
+ case CHANNEL_EVENT_VIDEO_LOCAL_URL:
+ return getStreamURL(true, event.getVideoId(), event.getVideoStatus());
+ case CHANNEL_EVENT_VIDEO_VPN_URL:
+ return getStreamURL(false, event.getVideoId(), event.getVideoStatus());
}
return null;
}
--- /dev/null
+/**
+ * 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.netatmo.internal.handler.channelhelper;
+
+import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import static org.openhab.binding.netatmo.internal.utils.ChannelTypeUtils.*;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.netatmo.internal.api.dto.HomeEvent;
+import org.openhab.core.library.types.DateTimeType;
+import org.openhab.core.types.State;
+
+/**
+ * The {@link EventDoorbellChannelHelper} handles specific channels of doorbell events
+ *
+ * @author Gaël L'hopital - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class EventDoorbellChannelHelper extends EventChannelHelper {
+
+ public EventDoorbellChannelHelper() {
+ super(GROUP_DOORBELL_LAST_EVENT, GROUP_DOORBELL_SUB_EVENT);
+ }
+
+ @Override
+ protected @Nullable State internalGetHomeEvent(String channelId, @Nullable String groupId, HomeEvent event) {
+ if (groupId != null && GROUP_DOORBELL_SUB_EVENT.startsWith(groupId)) {
+ switch (channelId) {
+ case CHANNEL_EVENT_TYPE:
+ return toStringType(event.getEventType());
+ case CHANNEL_EVENT_TIME:
+ return new DateTimeType(event.getTime());
+ case CHANNEL_EVENT_MESSAGE:
+ return toStringType(event.getName());
+ case CHANNEL_EVENT_SNAPSHOT:
+ return toRawType(event.getSnapshotUrl());
+ case CHANNEL_EVENT_SNAPSHOT_URL:
+ return toStringType(event.getSnapshotUrl());
+ case CHANNEL_EVENT_VIGNETTE:
+ return toRawType(event.getVignetteUrl());
+ case CHANNEL_EVENT_VIGNETTE_URL:
+ return toStringType(event.getVignetteUrl());
+ }
+ }
+ return super.internalGetHomeEvent(channelId, groupId, event);
+ }
+}
import static org.openhab.binding.netatmo.internal.NetatmoBindingConstants.*;
+import java.util.Set;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.netatmo.internal.api.data.EventType;
-import org.openhab.binding.netatmo.internal.api.data.ModuleType;
import org.openhab.binding.netatmo.internal.api.dto.Event;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.types.State;
*/
@NonNullByDefault
public class EventPersonChannelHelper extends EventChannelHelper {
+
public EventPersonChannelHelper() {
- super(GROUP_PERSON_EVENT);
+ super(GROUP_PERSON_LAST_EVENT);
}
@Override
protected @Nullable State internalGetEvent(String channelId, Event event) {
EventType eventType = event.getEventType();
- if (eventType.appliesOn(ModuleType.PERSON) && CHANNEL_PERSON_AT_HOME.equals(channelId)) {
- return OnOffType.from(EventType.PERSON.equals(eventType) || EventType.PERSON_HOME.equals(eventType));
- }
- return super.internalGetEvent(channelId, event);
+ return eventType.validFor(moduleType) && CHANNEL_PERSON_AT_HOME.equals(channelId)
+ ? OnOffType.from(Set.of(EventType.PERSON, EventType.PERSON_HOME).contains(eventType))
+ : super.internalGetEvent(channelId, event);
}
}
*
*/
@NonNullByDefault
-public class PresenceChannelHelper extends ChannelHelper {
+public class PresenceChannelHelper extends CameraChannelHelper {
+
public PresenceChannelHelper() {
- super(GROUP_PRESENCE);
+ super(GROUP_CAM_STATUS, GROUP_CAM_LIVE, GROUP_PRESENCE);
}
@Override
public class RoomChannelHelper extends ChannelHelper {
public RoomChannelHelper() {
- super(GROUP_ROOM_PROPERTIES, GROUP_ROOM_TEMPERATURE);
+ super(GROUP_TYPE_ROOM_TEMPERATURE, GROUP_TYPE_ROOM_PROPERTIES);
}
@Override
public class SetpointChannelHelper extends ChannelHelper {
public SetpointChannelHelper() {
- super(GROUP_TH_SETPOINT);
+ super(GROUP_SETPOINT);
}
@Override
public class Therm1ChannelHelper extends ChannelHelper {
public Therm1ChannelHelper() {
- super(GROUP_TH_PROPERTIES);
+ super(GROUP_TYPE_TH_PROPERTIES);
}
@Override
}
public static String toGroupName(String groupeTypeName) {
- return groupeTypeName.replace(OPTION_EXTENDED, "").replace(OPTION_OUTSIDE, "");
+ String result = groupeTypeName;
+ for (String variation : GROUP_VARIATIONS) {
+ result = result.replace(variation, "");
+ }
+ return result;
}
}
channel-group-type.netatmo.energy.channel.end.label = Mode End
channel-group-type.netatmo.energy.channel.end.description = End time of the currently applied setpoint.
channel-group-type.netatmo.humidity.label = Humidity
+channel-group-type.netatmo.last-event-doorbell.label = Last Event
+channel-group-type.netatmo.last-event-doorbell.channel.local-video-url.label = Video Local URL
+channel-group-type.netatmo.last-event-doorbell.channel.local-video-url.description = Local URL of the event recording.
+channel-group-type.netatmo.last-event-doorbell.channel.time.label = Event Timestamp
+channel-group-type.netatmo.last-event-doorbell.channel.time.description = Moment when event occurred.
+channel-group-type.netatmo.last-event-doorbell.channel.vpn-video-url.label = Video VPN URL
+channel-group-type.netatmo.last-event-doorbell.channel.vpn-video-url.description = URL of the event recording through Netatmo VPN.
+channel-group-type.netatmo.last-event-person.label = Last Event
+channel-group-type.netatmo.last-event-person.channel.message.description = Last event message from this person.
+channel-group-type.netatmo.last-event-person.channel.snapshot.description = Picture of the last event for this person.
+channel-group-type.netatmo.last-event-person.channel.snapshot-url.description = URL for the picture of the last event for this person.
+channel-group-type.netatmo.last-event-person.channel.time.label = Person Timestamp
+channel-group-type.netatmo.last-event-person.channel.time.description = Moment of the last event for this person.
channel-group-type.netatmo.last-event.label = Last Event
channel-group-type.netatmo.last-event.channel.local-video-url.label = Video Local URL
channel-group-type.netatmo.last-event.channel.local-video-url.description = Local URL of the event recording.
channel-group-type.netatmo.last-event.channel.time.description = Moment when event occurred.
channel-group-type.netatmo.last-event.channel.vpn-video-url.label = Video VPN URL
channel-group-type.netatmo.last-event.channel.vpn-video-url.description = URL of the event recording through Netatmo VPN.
+channel-group-type.netatmo.live-doorbell.label = Live Monitoring
+channel-group-type.netatmo.live-doorbell.channel.local-picture-url.label = Live Snapshot Local URL
+channel-group-type.netatmo.live-doorbell.channel.local-picture-url.description = Local URL of the live snapshot for this camera.
channel-group-type.netatmo.live.label = Live Monitoring
channel-group-type.netatmo.live.channel.local-picture-url.label = Live Snapshot Local URL
channel-group-type.netatmo.live.channel.local-picture-url.description = Local URL of the live snapshot for this camera.
channel-group-type.netatmo.live.channel.vpn-stream-url.description = URL of the live stream for this camera through Netatmo VPN.
channel-group-type.netatmo.location.label = Location
channel-group-type.netatmo.noise.label = Noise
-channel-group-type.netatmo.person-event.label = Last Event
-channel-group-type.netatmo.person-event.channel.message.description = Last event message from this person.
-channel-group-type.netatmo.person-event.channel.snapshot.description = Picture of the last event for this person.
-channel-group-type.netatmo.person-event.channel.snapshot-url.description = URL for the picture of the last event for this person.
-channel-group-type.netatmo.person-event.channel.time.label = Person Timestamp
-channel-group-type.netatmo.person-event.channel.time.description = Moment of the last event for this person.
channel-group-type.netatmo.person.label = Person
channel-group-type.netatmo.person.channel.last-seen.label = Last Seen
channel-group-type.netatmo.person.channel.last-seen.description = Moment when this person was last seen.
channel-group-type.netatmo.rain.channel.sum-1.description = Quantity of water over last hour.
channel-group-type.netatmo.rain.channel.sum-24.label = Rain 24h
channel-group-type.netatmo.rain.channel.sum-24.description = Quantity of water during the current day.
-channel-group-type.netatmo.room-properties.label = Room Status
-channel-group-type.netatmo.room-temperature.label = Room Temperature
+channel-group-type.netatmo.properties-room.label = Room Status
+channel-group-type.netatmo.temperature-room.label = Room Temperature
channel-group-type.netatmo.security.label = Home Security
channel-group-type.netatmo.setpoint.label = Setpoint
channel-group-type.netatmo.setpoint.channel.end.label = Setpoint End
channel-group-type.netatmo.setpoint.channel.start.label = Setpoint Start
channel-group-type.netatmo.setpoint.channel.start.description = Start time of the currently applied setpoint.
channel-group-type.netatmo.signal.label = Signal
+channel-group-type.netatmo.status-doorbell.label = Camera Status
channel-group-type.netatmo.status.label = Camera Status
+channel-group-type.netatmo.sub-event-doorbell.label = Sub Event
+channel-group-type.netatmo.sub-event-doorbell.channel.time.label = Sub-Event Timestamp
+channel-group-type.netatmo.sub-event-doorbell.channel.time.description = Moment when then sub-event occurred.
+channel-group-type.netatmo.sub-event-doorbell.channel.vignette.label = Vignette
+channel-group-type.netatmo.sub-event-doorbell.channel.vignette.description = Vignette of the Snapshot.
+channel-group-type.netatmo.sub-event-doorbell.channel.vignette-url.label = Vignette URL
+channel-group-type.netatmo.sub-event-doorbell.channel.vignette-url.description = URL of the vignette.
channel-group-type.netatmo.temperature-extended.label = Temperature
channel-group-type.netatmo.temperature-extended.channel.max-time.label = Today Max Timestamp
channel-group-type.netatmo.temperature-extended.channel.max-time.description = Moment when temperature was measured at its maximum today.
channel-group-type.netatmo.temperature.channel.max-time.description = Moment when temperature was measured at its maximum today.
channel-group-type.netatmo.temperature.channel.min-time.label = Today Min Timestamp
channel-group-type.netatmo.temperature.channel.min-time.description = Moment when temperature was measured at its minimum today.
-channel-group-type.netatmo.th-properties.label = Thermostat
+channel-group-type.netatmo.properties-thermostat.label = Thermostat
channel-group-type.netatmo.timestamp-extended.label = Timestamp
channel-group-type.netatmo.timestamp-extended.channel.last-seen.label = Last Seen
channel-group-type.netatmo.timestamp-extended.channel.last-seen.description = Last time the module reported its presence.
channel-type.netatmo.event-type.state.option.PERSON = Face detected
channel-type.netatmo.event-type.state.option.PERSON_AWAY = Person has left home
channel-type.netatmo.event-type.state.option.PERSON_HOME = Person is at home
-channel-type.netatmo.event-type.state.option.OUTDOOR = Motion detected by Presence
+channel-type.netatmo.event-type.state.option.OUTDOOR = Motion detected by Outdoor Camera
channel-type.netatmo.event-type.state.option.MOVEMENT = Motion detected
channel-type.netatmo.event-type.state.option.HUMAN = Human seen
channel-type.netatmo.event-type.state.option.ANIMAL = Animal seen
+channel-type.netatmo.event-type.state.option.VEHICLE = Car seen
channel-type.netatmo.event-type.state.option.NEW_MODULE = New Module has been paired
channel-type.netatmo.event-type.state.option.MODULE_CONNECT = Module is connected with the Indoor Camera
channel-type.netatmo.event-type.state.option.MODULE_DISCONNECT = Module lost its connection with the Indoor Camera
channel-type.netatmo.event-type.state.option.BOOT = Camera booting
channel-type.netatmo.event-type.state.option.SD = SD card status changed
channel-type.netatmo.event-type.state.option.ALIM = Power status changed
+channel-type.netatmo.event-type.state.option.ACCEPTED_CALL = Call is incoming
+channel-type.netatmo.event-type.state.option.INCOMING_CALL = Call has been answered by a user
+channel-type.netatmo.event-type.state.option.MISSED_CALL = Call has not been answered by anyone
channel-type.netatmo.floodlight-mode.label = Floodlight
channel-type.netatmo.floodlight-mode.description = State of the floodlight (On/Off/Auto)
channel-type.netatmo.floodlight-mode.state.option.ON = On
channel-group-type.netatmo.rain.channel.sum-1.description = Quantità di acqua nell'ultima ora.
channel-group-type.netatmo.rain.channel.sum-24.label = Pioggia 24h
channel-group-type.netatmo.rain.channel.sum-24.description = Quantità di acqua durante il giorno corrente.
-channel-group-type.netatmo.room-properties.label = Stato Stanza
-channel-group-type.netatmo.room-temperature.label = Temperatura Stanza
+channel-group-type.netatmo.properties-room.label = Stato Stanza
+channel-group-type.netatmo.temperature-room.label = Temperatura Stanza
channel-group-type.netatmo.security.label = Sicurezza Domestica
channel-group-type.netatmo.setpoint.label = Valore Impostato
channel-group-type.netatmo.setpoint.channel.end.label = Fine Setpoint
channel-group-type.netatmo.temperature.channel.max-time.description = Momento quando oggi la temperatura è stata misurata al suo massimo.
channel-group-type.netatmo.temperature.channel.min-time.label = Ora Temperatura Minima Oggi
channel-group-type.netatmo.temperature.channel.min-time.description = Momento in cui la temperatura è stata misurata al suo minimo oggi.
-channel-group-type.netatmo.th-properties.label = Termostato
+channel-group-type.netatmo.properties-thermostat.label = Termostato
channel-group-type.netatmo.timestamp-extended.label = Data/Ora
channel-group-type.netatmo.timestamp-extended.channel.last-seen.label = Visto per l'ultima volta
channel-group-type.netatmo.timestamp-extended.channel.last-seen.description = L'ultima volta che il modulo ha segnalato la sua presenza.
<option value="PERSON">Face detected</option>
<option value="PERSON_AWAY">Person has left home</option>
<option value="PERSON_HOME">Person is at home</option>
- <option value="OUTDOOR">Motion detected by Presence</option>
+ <option value="OUTDOOR">Motion detected by Outdoor Camera</option>
<option value="MOVEMENT">Motion detected</option>
<option value="HUMAN">Human seen</option>
<option value="ANIMAL">Animal seen</option>
+ <option value="VEHICLE">Car seen</option>
<option value="NEW_MODULE">New Module has been paired</option>
<option value="MODULE_CONNECT">Module is connected with the Indoor Camera</option>
<option value="MODULE_DISCONNECT">Module lost its connection with the Indoor Camera</option>
<option value="BOOT">Camera booting</option>
<option value="SD">SD card status changed</option>
<option value="ALIM">Power status changed</option>
+ <option value="ACCEPTED_CALL">Call is incoming</option>
+ <option value="INCOMING_CALL">Call has been answered by a user</option>
+ <option value="MISSED_CALL">Call has not been answered by anyone</option>
</options>
</state>
</channel-type>
<option value="MOVEMENT"/>
<option value="HUMAN"/>
<option value="ANIMAL"/>
+ <option value="VEHICLE"/>
<option value="NEW_MODULE"/>
<option value="MODULE_CONNECT"/>
<option value="MODULE_DISCONNECT"/>
<option value="BOOT"/>
<option value="SD"/>
<option value="ALIM"/>
+ <option value="ACCEPTED_CALL"/>
+ <option value="INCOMING_CALL"/>
+ <option value="MISSED_CALL"/>
</options>
</event>
</channel-type>
</channels>
</channel-group-type>
- <channel-group-type id="room-temperature">
+ <channel-group-type id="temperature-room">
<label>Room Temperature</label>
<channels>
<channel id="value" typeId="system.indoor-temperature"/>
</channels>
</channel-group-type>
- <channel-group-type id="room-properties">
+ <channel-group-type id="properties-room">
<label>Room Status</label>
<channels>
<channel id="window-open" typeId="window-open"/>
</channels>
</channel-group-type>
- <channel-group-type id="th-properties">
+ <channel-group-type id="properties-thermostat">
<label>Thermostat</label>
<channels>
- <channel id="relay-status" typeId="heating-status"/>
+ <channel id="relay" typeId="heating-status"/>
</channels>
</channel-group-type>
</channels>
</channel-group-type>
+ <channel-group-type id="status-doorbell">
+ <label>Camera Status</label>
+ <channels>
+ <channel id="sd-card" typeId="sd-card-status"/>
+ <channel id="alim" typeId="alim-status"/>
+ </channels>
+ </channel-group-type>
+
<channel-group-type id="live">
<label>Live Monitoring</label>
<channels>
</channels>
</channel-group-type>
+ <channel-group-type id="live-doorbell">
+ <label>Live Monitoring</label>
+ <channels>
+ <channel id="picture" typeId="live-picture"/>
+ <channel id="local-picture-url" typeId="live-picture-url">
+ <label>Live Snapshot Local URL</label>
+ <description>Local URL of the live snapshot for this camera.</description>
+ </channel>
+ </channels>
+ </channel-group-type>
+
<channel-group-type id="last-event">
<label>Last Event</label>
<channels>
</channels>
</channel-group-type>
- <channel-group-type id="person-event">
+ <channel-group-type id="sub-event-doorbell">
+ <label>Sub Event</label>
+ <channels>
+ <channel id="type" typeId="event-type"/>
+ <channel id="time" typeId="timestamp">
+ <label>Sub-Event Timestamp</label>
+ <description>Moment when then sub-event occurred.</description>
+ </channel>
+ <channel id="message" typeId="message"/>
+ <channel id="snapshot" typeId="event-picture"/>
+ <channel id="snapshot-url" typeId="event-picture-url"/>
+ <channel id="vignette" typeId="event-picture">
+ <label>Vignette</label>
+ <description>Vignette of the Snapshot.</description>
+ </channel>
+ <channel id="vignette-url" typeId="event-picture-url">
+ <label>Vignette URL</label>
+ <description>URL of the vignette.</description>
+ </channel>
+ </channels>
+ </channel-group-type>
+
+ <channel-group-type id="last-event-doorbell">
+ <label>Last Event</label>
+ <channels>
+ <channel id="type" typeId="event-type"/>
+ <channel id="video-status" typeId="video-status"/>
+ <channel id="time" typeId="timestamp">
+ <label>Event Timestamp</label>
+ <description>Moment when event occurred.</description>
+ </channel>
+ <channel id="local-video-url" typeId="video-url">
+ <label>Video Local URL</label>
+ <description>Local URL of the event recording.</description>
+ </channel>
+ <channel id="vpn-video-url" typeId="video-url">
+ <label>Video VPN URL</label>
+ <description>URL of the event recording through Netatmo VPN.</description>
+ </channel>
+ </channels>
+ </channel-group-type>
+
+ <channel-group-type id="last-event-person">
<label>Last Event</label>
<channels>
<channel id="subtype" typeId="event-subtype"/>