YOu could make a struct which includes the timestamp etc and store things in binary format, far more efficient
uint32_t Sec; // seconds since startdate of some clock 1-1-2000 or so
uint16_t Temp; // enough for quite some precission
uint16_t RH; // idem
uint16_t CO2; // idem
uint32_t Lights; // 32 boolean flags
uint16_t filler; // for future expansion
This struct is 16 bytes long, so you can address it like an array as record
- has EEPROM address 16 times X which equals x << 4.
Furthermore as most EEPROM pages are a multiple of 16 they fit very nice within page boundaries ==> thats why I added the filler in the first place.
Almost twice as compact as your string, so twice as many records in your EEPROM ..., it needs some pack and unpack code though...
hope this helps.