docs: private void init() {
          _minValue                           = 0;
          _maxValue                           = 100;
          value                               = new DoublePropertyBase(_minValue) {
              private void update() {
                  final double VALUE = get();
                  withinSpeedLimit = !(Instant.now().minusMillis(getAnimationDuration()).isBefore(lastCall));
                  lastCall = Instant.now();
                  if (isAnimated() && withinSpeedLimit) {
                      long animationDuration = isReturnToZero() ? (long) (0.2 * getAnimationDuration()) : getAnimationDuration();
                      timeline.stop();
  
                      final KeyValue KEY_VALUE = new KeyValue(currentValue, VALUE, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                      final KeyFrame KEY_FRAME = new KeyFrame(Duration.millis(animationDuration), KEY_VALUE);
                      timeline.getKeyFrames().setAll(KEY_FRAME);
                      timeline.play();
                  } else {
                      currentValue.set(VALUE);
                      fireTileEvent(FINISHED_EVENT);
                  }
                  if (isAveragingEnabled()) { movingAverage.addData(new TimeData(VALUE)); }
              }
              @Override protected void invalidated() { update(); }
              @Override public void set(final double VALUE) {
                  // ATTENTION There is an optimization in the properties so that properties
                  // only get invalid if the the new value is different from the old value
                  if (Helper.equals(VALUE, getFormerValue())) { update(); }
                  super.set(VALUE);
                  fireTileEvent(VALUE_EVENT);
              }
              @Override public Object getBean() { return Tile.this; }
              @Override public String getName() { return "value"; }
          };
          oldValue                            = new SimpleDoubleProperty(Tile.this, "oldValue", value.get());
          currentValue                        = new DoublePropertyBase(value.get()) {
              @Override protected void invalidated() {
                  final double VALUE = get();
                  if (isCheckThreshold()) {
                      double thrshld = getThreshold();
                      if (formerValue.get() < thrshld && VALUE > thrshld) {
                          fireTileEvent(EXCEEDED_EVENT);
                      } else if (formerValue.get() > thrshld && VALUE < thrshld) {
                          fireTileEvent(UNDERRUN_EVENT);
                      }
                  }
                  if (VALUE < getMinMeasuredValue()) {
                      setMinMeasuredValue(VALUE);
                  } else if (VALUE > getMaxMeasuredValue()) {
                      setMaxMeasuredValue(VALUE);
                  }
                  formerValue.set(VALUE);
              }
              @Override public void set(final double VALUE) { super.set(VALUE); }
              @Override public Object getBean() { return Tile.this; }
              @Override public String getName() { return "currentValue";}
          };
          formerValue                         = new SimpleDoubleProperty(Tile.this, "formerValue", value.get());
          _range                              = _maxValue - _minValue;
          _threshold                          = _maxValue;
          _referenceValue                     = _minValue;
          _autoReferenceValue                 = true;
  
          currentTime                         = new LongPropertyBase(getTime().toEpochSecond()) {
              @Override public Object getBean() { return Tile.this; }
              @Override public String getName() { return "currentTime"; }
          };
          _title                              = "";
          _titleAlignment                     = TextAlignment.LEFT;
          _description                        = "";
          _descriptionAlignment               = Pos.TOP_RIGHT;
          _unit                               = "";
          oldFlipText                         = "";
          _flipText                           = "";
          _active                             = false;
          _text                               = "";
          _textAlignment                      = TextAlignment.LEFT;
          _averagingEnabled                   = false;
          _averagingPeriod                    = 10;
          _duration                           = LocalTime.of(1, 0);
          _imageMask                          = ImageMask.NONE;
          _currentLocation                    = new Location(0, 0);
          _trackColor                         = TileColor.BLUE;
          _mapProvider                        = MapProvider.BW;
          flipTimeInMS                        = 500;
  
          _textSize                           = TextSize.NORMAL;
          _roundedCorners                     = true;
          _startFromZero                      = false;
          _returnToZero                       = false;
          _minMeasuredValue                   = _maxValue;
          _maxMeasuredValue                   = _minValue;
          _minMeasuredValueVisible            = false;
          _maxMeasuredValueVisible            = false;
          _oldValueVisible                    = false;
          _valueVisible                       = true;
          _foregroundColor                    = FOREGROUND;
          _backgroundColor                    = BACKGROUND;
          _borderColor                        = Color.TRANSPARENT;
          _borderWidth                        = 1;
          _knobColor                          = FOREGROUND;
          _activeColor                        = BLUE;
          _animated                           = false;
          animationDuration                   = 800;
          _startAngle                         = 0;
          _angleRange                         = 180;
          _angleStep                          = _angleRange / _range;
          _autoScale                          = true;
          _shadowsEnabled                     = false;
          _locale                             = Locale.US;
          _numberFormat                       = NumberFormat.getInstance(_locale);
          _decimals                           = 1;
          _tickLabelDecimals                  = 1;
          _needleColor                        = FOREGROUND;
          _hourColor                          = FOREGROUND;
          _minuteColor                        = FOREGROUND;
          _secondColor                        = FOREGROUND;
          _barColor                           = BLUE;
          _barBackgroundColor                 = BACKGROUND;
          _titleColor                         = FOREGROUND;
          _descriptionColor                   = FOREGROUND;
          _unitColor                          = FOREGROUND;
          _valueColor                         = FOREGROUND;
          _textColor                          = FOREGROUND;
          _dateColor                          = FOREGROUND;
          _hourTickMarkColor                  = FOREGROUND;
          _minuteTickMarkColor                = FOREGROUND;
          _alarmColor                         = FOREGROUND;
          _thresholdColor                     = RED;
          _checkSectionsForValue              = false;
          _checkThreshold                     = false;
          _innerShadowEnabled                 = false;
          _thresholdVisible                   = false;
          _averageVisible                     = false;
          _sectionsVisible                    = false;
          _sectionsAlwaysVisible              = false;
          _sectionTextVisible                 = false;
          _sectionIconsVisible                = false;
          _highlightSections                  = false;
          _orientation                        = Orientation.HORIZONTAL;
          _keepAspect                         = true;
          _customFontEnabled                  = false;
          _customFont                         = Fonts.latoRegular(12);
          _alert                              = false;
          _alertMessage                       = "";
          _smoothing                          = false;
          _secondsVisible                     = false;
          _discreteSeconds                    = true;
          _discreteMinutes                    = true;
          _discreteHours                      = false;
          _textVisible                        = true;
          _dateVisible                        = false;
          _running                            = false;
          _hourTickMarksVisible               = true;
          _minuteTickMarksVisible             = true;
          _alarmsEnabled                      = false;
          _alarmsVisible                      = false;
          _strokeWithGradient                 = false;
          _fillWithGradient                   = false;
          tooltip                             = new Tooltip(null);
          _xAxis                              = new CategoryAxis();
          _yAxis                              = new NumberAxis();
          _radarChartMode                     = Mode.POLYGON;
          _chartGridColor                     = Tile.GRAY;
          _sortedData                         = true;
          _dataPointsVisible                  = false;
          _snapToTicks                        = false;
          _minorTickCount                     = 0;
          _majorTickUnit                      = 1;
          _matrixSize                         = new int[]{ 30, 25 };
          _chartType                          = ChartType.LINE;
          _tooltipTimeout                     = 2000;
          _notifyRegionBackgroundColor        = Tile.YELLOW;
          _notifyRegionForegroundColor        = Tile.BACKGROUND;
          _infoRegionBackgroundColor          = Tile.DARK_BLUE;
          _infoRegionForegroundColor          = Tile.FOREGROUND;
          _infoRegionTooltipText              = "";
          _backgroundImage                    = null;
          _backgroundImageOpacity             = 0.2;
          _backgroundImageKeepAspect          = true;
          _leftText                           = "";
          _middleText                         = "";
          _rightText                          = "";
          _leftValue                          = 0;
          _middleValue                        = 0;
          _rightValue                         = 0;
          _leftGraphics                       = null;
          _middleGraphics                     = null;
          _rightGraphics                      = null;
          updateInterval                      = LONG_INTERVAL;
          increment                           = 1;
          originalMinValue                    = -Double.MAX_VALUE;
          originalMaxValue                    = Double.MAX_VALUE;
          originalThreshold                   = Double.MAX_VALUE;
          lastCall                            = Instant.now();
          timeline                            = new Timeline();
          timeline.setOnFinished(e -> {
              if (isReturnToZero() && !Helper.equals(currentValue.get(), 0.0)) {
                  final KeyValue KEY_VALUE2 = new KeyValue(value, 0, Interpolator.SPLINE(0.5, 0.4, 0.4, 1.0));
                  final KeyFrame KEY_FRAME2 = new KeyFrame(Duration.millis((long) (0.8 * getAnimationDuration())), KEY_VALUE2);
                  timeline.getKeyFrames().setAll(KEY_FRAME2);
                  timeline.play();
              }
              fireTileEvent(FINISHED_EVENT);
          });
      }