// Get the whole REST API string for a device, from cache if possible
 public String requestAPI() throws YAPI_Exception {
   if (_cache_expiration > YAPI.GetTickCount()) {
     return _cache_json;
   }
   String yreq = requestHTTPSyncAsString("GET /api.json", null);
   this._cache_expiration = YAPI.GetTickCount() + YAPI.DefaultCacheValidity;
   this._cache_json = yreq;
   return yreq;
 }
 /**
  * Returns the Z component of the magnetic field, as a floating point number.
  *
  * @return a floating point number corresponding to the Z component of the magnetic field, as a
  *     floating point number
  * @throws YAPI_Exception on error
  */
 public double get_zValue() throws YAPI_Exception {
   if (_cacheExpiration <= YAPI.GetTickCount()) {
     if (load(YAPI.DefaultCacheValidity) != YAPI.SUCCESS) {
       return ZVALUE_INVALID;
     }
   }
   return _zValue;
 }
  // Reload a device API (store in cache), and update YAPI function lists accordingly
  // Intended to be called within UpdateDeviceList only
  public int refresh() throws YAPI_Exception {
    String result = this.requestAPI();
    JSONObject loadval;
    Boolean reindex = false;
    try {
      loadval = new JSONObject(result);

      _cache_expiration = YAPI.GetTickCount() + YAPI.DefaultCacheValidity;
      _cache_json = result;

      // parse module and refresh names if needed
      Iterator<?> keys = loadval.keys();
      while (keys.hasNext()) {
        String key = (String) keys.next();
        if (key.equals("module")) {
          JSONObject module = loadval.getJSONObject("module");
          if (!_wpRec.getLogicalName().equals(module.getString("logicalName"))) {
            _wpRec.setLogicalName(module.getString("logicalName"));
            _moduleYPEntry.setLogicalName(_wpRec.getLogicalName());
            reindex = true;
          }
          _wpRec.setBeacon(module.getInt("beacon"));
        } else if (!key.equals("services")) {
          JSONObject func = loadval.getJSONObject(key);
          String name;
          if (func.has("logicalName")) {
            name = func.getString("logicalName");
          } else {
            name = _wpRec.getLogicalName();
          }
          if (func.has("advertisedValue")) {
            String pubval = func.getString("advertisedValue");
            SafeYAPI()._yHash.setFunctionValue(_wpRec.getSerialNumber(), pubval);
          }
          for (int f = 0; f < _ypRecs.size(); f++) {
            if (_ypRecs.get(f).getFuncId().equals(key)) {
              if (!_ypRecs.get(f).getLogicalName().equals(name)) {
                _ypRecs.get(f).setLogicalName(name);
                reindex = true;
              }
              break;
            }
          }
        }
      }
    } catch (JSONException e) {
      throw new YAPI_Exception(YAPI.IO_ERROR, "Request failed, could not parse API result");
    }

    if (reindex) {
      SafeYAPI()._yHash.reindexDevice(this);
    }
    return YAPI.SUCCESS;
  }