     unsigned long sleepMillis = 1;
     if (systemSleepSeconds * 1000 > systemActive)
       sleepMillis = systemSleepSeconds * 1000 - systemActive;
+    
     Serial.print("Sleeping ");
+    if (shouldSleepNow)
+      Serial.print(" in vain ");
     Serial.println(sleepMillis);
 
     DisplayStateWrapper *displayState = display.getState();


class SystemState : public CrcableData {
public:
  bool externalDataValid = false;
  float lastExternalTemperature = 0;
  float lastExternalHumidity = 0;

  bool shouldSleepNow = millis() - systemStart > systemAwakeSeconds * 1000;

  if (shouldSleepNow && !displayUpdated) {
    boolean internalIsToBeShown = systemState.displayedInternalTemperature == -100;

    if (!internalIsToBeShown) {
      TH lastInternalData;
      lastInternalData.temperature = systemState.displayedInternalTemperature;
      lastInternalData.humidity = systemState.displayedInternalHumidity;
      updateVaporPressure(&lastInternalData);

      if (abs(systemState.displayedInternalTemperature - localData.temperature) > 0.2
          || abs(lastInternalData.vaporPressure - localData.vaporPressure) > 0.29) {
          internalIsToBeShown = true;

          Serial.print("Updating because of difference ");
          Serial.println(abs(systemState.displayedInternalTemperature - localData.temperature));
      } else {
        Serial.println("No update. No external data and no internal change.");
        // NOTE the "update at least every X tries" is handled indirectly by the external source
      }
    }

    if (internalIsToBeShown) {
      if (systemState.externalDataValid) {
        externalData.dataValid = true;
        externalData.temperature = systemState.lastExternalTemperature;
        externalData.humidity = systemState.lastExternalHumidity;
        updateVaporPressure(&externalData);
      }
      
      updateDisplay(&localData, &externalData);
    }
  }

  unsigned long loopEnd = millis();
