use of org.openhab.binding.netatmo.internal.camera.GetHomeDataResponse.Person in project openhab1-addons by openhab.
the class NetatmoCameraBinding method execute.
/**
* Execute the weather binding from Netatmo Binding Class
*
* @param oauthCredentials
* @param providers
* @param eventPublisher
*/
public void execute(OAuthCredentials oauthCredentials, Collection<NetatmoBindingProvider> providers, EventPublisher eventPublisher) {
logger.debug("Querying Netatmo camera API");
try {
oauthCredentials.refreshAccessToken();
configuredHomeKnownPersons.clear();
configuredHomeUnKnownPersons.clear();
configuredHomeMap.clear();
configuredhomeCameras.clear();
processGetHomeData(oauthCredentials, providers, eventPublisher);
for (final NetatmoBindingProvider provider : providers) {
for (final String itemName : provider.getItemNames()) {
final String homeId = provider.getHomeId(itemName);
final NetatmoCameraAttributes attribute = provider.getAttribute(itemName);
State state = null;
if (homeId != null) {
final String personId = provider.getPersonId(itemName);
final String cameraId = provider.getCameraId(itemName);
if (personId != null) {
if ("UNKNOWN".equals(personId)) {
final StringBuilder message = new StringBuilder();
int i = 0;
switch(attribute) {
case HOME_UNKNWOWN_HOME_COUNT:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (!person.getOut_of_sight()) {
i++;
}
}
}
state = new DecimalType(i);
break;
case HOME_UNKNWOWN_AWAY_COUNT:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (person.getOut_of_sight()) {
i++;
}
}
}
state = new DecimalType(i);
break;
case HOME_UNKNWOWN_OUTOFSIGHT_LIST:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (message.length() > 1) {
message.append("#");
}
message.append(person.getOut_of_sight());
}
}
state = new StringType(message.toString());
break;
case HOME_UNKNWOWN_LASTSEEN_LIST:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (message.length() > 1) {
message.append("#");
}
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(person.getLastSeen().getTime() * 1000);
message.append(calendar);
}
}
state = new StringType(message.toString());
break;
case HOME_UNKNWOWN_FACE_ID_LIST:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (message.length() > 1) {
message.append("#");
}
message.append(person.getFace().getId());
}
}
state = new StringType(message.toString());
break;
case HOME_UNKNWOWN_FACE_KEY_LIST:
if (configuredHomeUnKnownPersons.containsKey(homeId)) {
for (Entry<String, Person> entry : configuredHomeUnKnownPersons.get(homeId).entrySet()) {
final Person person = entry.getValue();
if (message.length() > 1) {
message.append("#");
}
message.append(person.getFace().getKey());
}
}
state = new StringType(message.toString());
break;
default:
break;
}
} else {
Person person = null;
if (configuredHomeKnownPersons.containsKey(homeId)) {
person = configuredHomeKnownPersons.get(homeId).get(personId);
}
if (person != null) {
switch(attribute) {
case HOME_PERSON_OUTOFSIGHT:
if (person.getOut_of_sight()) {
state = OnOffType.OFF;
} else {
state = OnOffType.ON;
}
break;
case HOME_PERSON_PSEUDO:
state = new StringType(person.getPseudo());
break;
case HOME_PERSON_LASTSEEN:
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(person.getLastSeen().getTime() * 1000);
state = new DateTimeType(calendar);
break;
case HOME_PERSON_FACE_ID:
state = new StringType(person.getFace().getId());
break;
case HOME_PERSON_FACE_KEY:
state = new StringType(person.getFace().getKey());
break;
default:
break;
}
}
}
} else if (cameraId != null) {
Camera camera = null;
if (configuredhomeCameras.containsKey(homeId)) {
camera = configuredhomeCameras.get(homeId).get(cameraId);
}
if (camera != null) {
switch(attribute) {
case HOME_CAMERA_NAME:
state = new StringType(camera.getName());
break;
case HOME_CAMERA_STATUS:
state = new StringType(camera.getStatus());
break;
case HOME_CAMERA_SD_STATUS:
state = new StringType(camera.getSd_status());
break;
case HOME_CAMERA_ALIM_STATUS:
state = new StringType(camera.getAlim_status());
break;
default:
break;
}
}
} else {
Home home = configuredHomeMap.get(homeId);
if (home != null) {
switch(attribute) {
case HOME_NAME:
state = new StringType(home.getName());
break;
case HOME_PLACE_COUNTRY:
state = new StringType(home.getPlace().getCountry());
break;
case HOME_PLACE_TIMEZONE:
state = new StringType(home.getPlace().getTimezone());
break;
default:
break;
}
}
}
}
if (state != null) {
eventPublisher.postUpdate(itemName, state);
}
}
}
} catch (NetatmoException ne) {
logger.error(ne.getMessage());
}
}
use of org.openhab.binding.netatmo.internal.camera.GetHomeDataResponse.Person in project openhab1-addons by openhab.
the class GetHomeDataTest method testSuccess.
@Test
public void testSuccess() throws Exception {
final GetHomeDataRequestStub request = createRequest("/gethomedata.json");
final GetHomeDataResponse response = request.execute();
assertFalse(response.isError());
assertEquals("access_token=" + ACCESS_TOKEN, request.getContent());
assertEquals("ok", response.getStatus());
List<Home> myHomes = response.getHomes();
assertEquals(1, myHomes.size());
assertEquals(myHomes.get(0).getName(), "Home Tom");
Place myPlace = myHomes.get(0).getPlace();
assertEquals(myPlace.getTimezone(), "Europe/Stockholm");
List<Person> myPersons = myHomes.get(0).getPersons();
assertEquals(4, myPersons.size());
assertEquals("13e843a4-2bcb-4d52-855c-1c5570663f76", myPersons.get(2).getId());
assertEquals("Tom", myPersons.get(3).getPseudo());
Face myFace = myPersons.get(0).getFace();
assertEquals("55e598250a6e6e6170cf7cfb", myFace.getId());
List<Event> myEvents = myHomes.get(0).getEvents();
assertEquals(1, myEvents.size());
assertEquals("70:ee:50:13:8b:35", myEvents.get(0).getCamera_id());
Snapshot mySnapshot = myEvents.get(0).getSnapshot();
assertEquals("8bbbe58c7b4fba061e8c29c2b7a57e6d16956b06c6ebd992e01267e755f7df72", mySnapshot.getKey());
List<Camera> myCameras = myHomes.get(0).getCameras();
assertEquals(2, myCameras.size());
assertEquals("disconnected", myCameras.get(1).getStatus());
User myUsr = response.getUser();
assertEquals("en-US", myUsr.getLang());
}
use of org.openhab.binding.netatmo.internal.camera.GetHomeDataResponse.Person in project openhab1-addons by openhab.
the class NetatmoCameraBinding method processGetHomeDataResponse.
/**
* Camera Home
*
*
* Processes an incoming {@link GetHomeDataResponse}.
* <p>
*
* @param providers
*/
private void processGetHomeDataResponse(final GetHomeDataResponse response, Collection<NetatmoBindingProvider> providers) {
final Map<String, Home> homeMap = new HashMap<String, Home>();
final Map<String, Map<String, Person>> homeKnownPersons = new HashMap<String, Map<String, Person>>();
final Map<String, Map<String, Person>> homeUnKnownPersons = new HashMap<String, Map<String, Person>>();
final Map<String, Set<Event>> homeEvents = new HashMap<String, Set<Event>>();
final Map<String, Map<String, Camera>> homeCameras = new HashMap<String, Map<String, Camera>>();
// Add Homes to a HasMap
for (final Home home : response.getHomes()) {
final String homeId = home.getId();
homeMap.put(homeId, home);
logger.debug("Response Home: ID=" + home.getId() + " NAME=" + home.getName() + " PLACE=" + home.getPlace().toString());
// Add Cameras of this home
for (final Camera camera : home.getCameras()) {
if (!homeCameras.containsKey(homeId)) {
homeCameras.put(homeId, new HashMap<String, Camera>());
}
homeCameras.get(homeId).put(camera.getId(), camera);
logger.debug("Response Camera: ID=" + camera.getId() + " STATUS=" + camera.getStatus() + " SDSTATUS=" + camera.getSd_status() + " ALIMSTATUS=" + camera.getAlim_status());
}
// Add Persons that have been seen in the house
for (final Person person : home.getPersons()) {
if (!homeKnownPersons.containsKey(homeId)) {
homeKnownPersons.put(homeId, new HashMap<String, Person>());
}
if (!homeUnKnownPersons.containsKey(homeId)) {
homeUnKnownPersons.put(homeId, new HashMap<String, Person>());
homeUnKnownPersons.get(homeId).put("UNKNOWN", null);
}
String pseudo = person.getPseudo();
if (pseudo != null) {
homeKnownPersons.get(homeId).put(person.getId(), person);
logger.debug("Response Known Person: ID=" + person.getId() + " (" + pseudo + ") AWAY=" + person.getOut_of_sight().toString() + " LASTSEEN=" + (person.getLastSeen() != null ? person.getLastSeen().toString() : "unknown"));
} else {
homeUnKnownPersons.get(homeId).put(person.getId(), person);
if (!configuredHomeUnKnownPersons.containsKey(homeId)) {
configuredHomeUnKnownPersons.put(homeId, new HashMap<String, Person>());
}
configuredHomeUnKnownPersons.get(homeId).put(person.getId(), person);
logger.debug("Response UnKnown Person: ID=" + person.getId() + " AWAY=" + person.getOut_of_sight().toString() + " LASTSEEN=" + (person.getLastSeen() != null ? person.getLastSeen().toString() : "unknown"));
}
}
// Add Events that happened in this home
for (final Event event : home.getEvents()) {
if (!homeEvents.containsKey(homeId)) {
homeEvents.put(homeId, new HashSet<Event>());
}
homeEvents.get(homeId).add(event);
logger.debug("Response Event: ID=" + event.getId() + " TYPE=" + event.getType() + " MESSAGE=" + event.getMessage() + " TIME=" + (event.getTime() != null ? event.getTime().toString() : "unknown"));
}
}
// Remove all configured items from the maps
for (final NetatmoBindingProvider provider : providers) {
for (final String itemName : provider.getItemNames()) {
final String homeId = provider.getHomeId(itemName);
if (homeId != null) {
final String personId = provider.getPersonId(itemName);
final String cameraId = provider.getCameraId(itemName);
if (personId != null) {
if ("UNKNOWN".equals(personId)) {
if (homeUnKnownPersons.containsKey(homeId) && homeUnKnownPersons.get(homeId).containsKey(personId)) {
homeUnKnownPersons.get(homeId).remove(personId);
}
} else {
if (!configuredHomeKnownPersons.containsKey(homeId)) {
configuredHomeKnownPersons.put(homeId, new HashMap<String, Person>());
}
if (homeKnownPersons.containsKey(homeId) && homeKnownPersons.get(homeId).containsKey(personId)) {
configuredHomeKnownPersons.get(homeId).put(personId, homeKnownPersons.get(homeId).get(personId));
homeKnownPersons.get(homeId).remove(personId);
}
}
} else if (cameraId != null) {
if (!configuredhomeCameras.containsKey(homeId)) {
configuredhomeCameras.put(homeId, new HashMap<String, Camera>());
}
if (homeCameras.containsKey(homeId) && homeCameras.get(homeId).containsKey(cameraId)) {
configuredhomeCameras.get(homeId).put(cameraId, homeCameras.get(homeId).get(cameraId));
homeCameras.get(homeId).remove(cameraId);
}
} else {
// configuredHomeMap.put(homeId, home);
if (homeMap.containsKey(homeId)) {
configuredHomeMap.put(homeId, homeMap.get(homeId));
homeMap.remove(homeId);
}
}
}
}
}
// Log all unconfigured measurements
final StringBuilder message = new StringBuilder();
for (Entry<String, Home> entry : homeMap.entrySet()) {
final String homeId = entry.getKey();
message.append("\t HOME: " + homeId + " (" + entry.getValue().getName() + ")\n");
}
for (Entry<String, Map<String, Person>> entry : homeKnownPersons.entrySet()) {
final String homeId = entry.getKey();
for (Entry<String, Person> entry2 : entry.getValue().entrySet()) {
final String personId = entry2.getKey();
message.append("\t PERSON: " + homeId + "#" + personId + " (" + entry2.getValue().getPseudo() + ")\n");
}
}
for (Entry<String, Map<String, Person>> entry : homeUnKnownPersons.entrySet()) {
final String homeId = entry.getKey();
if (entry.getValue().containsKey("UNKNOWN")) {
message.append("\t PERSON: " + homeId + "#UNKNOWN\n");
}
}
for (Entry<String, Map<String, Camera>> entry : homeCameras.entrySet()) {
final String homeId = entry.getKey();
for (Entry<String, Camera> entry2 : entry.getValue().entrySet()) {
final String cameraId = entry2.getKey();
message.append("\t CAMERA: " + homeId + "#" + cameraId + " (" + entry2.getValue().getName() + ")\n");
}
}
if (message.length() > 0) {
message.insert(0, "The following Items from Netatmo Camera are not yet configured:\n");
logger.info(message.toString());
}
}
Aggregations