Here are my sketches:
The TimeMaster:
#define CHILD_ID_TIME 1
#define CHILD_ID_SIGNAL 2
#define TARGET 27
// #define TARGET 26
MyMessage msgTime(CHILD_ID_TIME, V_CUSTOM);
MyMessage msgSignal(CHILD_ID_SIGNAL, V_STATUS);
#include "DCF77.h"
#include "Time.h"
#define DCF_PIN 2	         // Connection pin to DCF 77 device
#define DCF_INTERRUPT digitalPinToInterrupt(DCF_PIN)		 // Interrupt number associated with pin
time_t time;
bool bPresented = false;
DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT);
void startDCF()
{
  static bool bDCFStarted = false;
  if (!bDCFStarted) {
    DCF.Start();
  
    pinMode(DCF_PIN, INPUT_PULLUP);
    Serial.println("Waiting for DCF77 time ... ");
    Serial.println("It will take at least 2 minutes until a first update can be processed.");
    bDCFStarted = true;
  }
}
void preHwInit()
{
  Serial.begin(MY_BAUD_RATE);
  Serial.println();
  startDCF();  
}
void setup()
{
  msgSignal.setDestination(TARGET);
  msgTime.setDestination(TARGET);
}
void presentation()
{
  present(CHILD_ID_TIME, S_CUSTOM);
  present(CHILD_ID_SIGNAL, S_BINARY);
}
bool bHaveTime = false;
unsigned long lastSentTime = 0;
void loop()
{
  time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime != 0)
  {
    Serial.println("Time is updated");
    setTime(DCFtime);
    bHaveTime = true;
    lastSentTime = minute();
  }
  if (bHaveTime) {
    if (DCFtime != 0) {
      Serial.println("Just obtained time. Send a message!");
      msgTime.set(DCFtime);
      send(msgTime);
    }
    if (minute() != lastSentTime) {
      Serial.println("A minute has passed. Send a message!");
      msgTime.set(now());
      send(msgTime);
      lastSentTime = minute();
    }
  }
}
The night light:
#define MY_RADIO_NRF24
#define MY_DEBUG
// #define MY_NODE_ID 27
// #define MY_GATEWAY_SERIAL
#include <MySensors.h>
#include <SPI.h>
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#include <EEPROM.h>
#include <Time.h>
#define colorNight(s) (s.Color(255,  20, 147))    // Purple
#define colorDay(s)   (s.Color(  0,   0,   0))    // Black
#define colorMorn(s)  (s.Color( 44, 201,  13))    // Green
#define colorError(s) (s.Color(255,   0,   0))
#define colorUp(s)    (s.Color(  0, 255,   0))
#define colorDown(s)  (s.Color(  0,   0, 255))
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
unsigned long colorPixel = 0;
unsigned long colorOld = 0xffff;
bool bHaveTime = false;
bool bEmergencyMode = false;
bool bEmergencyModeChecked = false;
void setPixelColor(unsigned long color)
{
  colorPixel = color;
}
void doSetPixelColor(long color)
{
  if (!bEmergencyMode || color == colorMorn(strip) || color == colorNight(strip)) {
    strip.setPixelColor(0, color);
    strip.show();
  }
}
void doSetPixelColor()
{
  if (colorOld != colorPixel) {
    doSetPixelColor(colorPixel);
    colorOld = colorPixel;
  }
}
void receive(const MyMessage &message)
{
  if (!bHaveTime && message.type == V_STATUS) {
    setPixelColor(message.getBool() ? colorUp(strip) : colorDown(strip));
  } else if (message.type == V_CUSTOM) {
    time_t timeNow = message.getULong();
    setTime(timeNow);
    bHaveTime = true;
  }
}
void presentation()
{
  setPixelColor(colorUp(strip));
  present(0, S_LIGHT);
}
void before()
{
  strip.begin();
  doSetPixelColor(colorDown(strip));
  strip.show(); // Initialize all pixels to 'off'
}
void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // End of trinket special code
  Serial.begin(115200);
  EEPROM.write(300 + 2, EEPROM.read(300 + 1));
  EEPROM.write(300 + 1, EEPROM.read(300 + 0));
  EEPROM.write(300 + 0, 0xff);
}
void loop() {
  static unsigned long int lastLoop = -1;
  if (lastLoop == -1 || millis() < lastLoop || millis() - lastLoop > 60000) {
//    request(0, V_CUSTOM, 42);
    lastLoop = millis();
  }
  if (!bEmergencyModeChecked && millis() < 5000) {
    bEmergencyMode = false;
    bEmergencyModeChecked = true;
    bool bNeedEmergencyMode = true;
    for (int t = 0; t <= 2; ++t) {
      if (EEPROM.read(300 + t) != 0xff) {
        bNeedEmergencyMode = false;
      }
    }
    bEmergencyMode = bNeedEmergencyMode;
    if (bEmergencyMode) {
      setPixelColor(colorNight(strip));
    }
  }
  if (bEmergencyModeChecked && millis() >= 10000) {
    EEPROM.write(300 + 0, 0);
    bEmergencyModeChecked = false;
  }
  if (bEmergencyMode && millis() > 12L * 60 * 60 * 1000) {
    setPixelColor(colorMorn(strip));
  }
  if (bHaveTime) {
    if (hour() >= 19 || hour() < 7) {
      setPixelColor(colorNight(strip));
    } else if (hour() >= 8) {
      setPixelColor(colorDay(strip));
    } else if (hour() >= 7) {
      setPixelColor(colorMorn(strip));
    }
  }
  doSetPixelColor();
}
Emergency mode on the night light is triggered by starting and stopping it three times within 10 seconds each time, so that if it can't find a time source, you can still get 12 hours of 'night light' followed by 'day light'.
In the night light, I commented out the request() call (and I took out the receive() implementation in the TimeMaster) because I ran into the DCF time receiver starting again every time.
Any more info you need right now? Just shout!