Data stored in the EEPROM
- 
					
					
					
					
 Chatting about storing data into the EEPROM with @paqor I got a little bit curious what the mysensors library stores into that EEPROM so I wrote a little function for dumping that data. I tested it with the 1.4 version of the library: void DumpMySensorsEepromData() { Serial.println("Dumping MySensors EEPROM:"); Serial.println(""); Serial.print("Node id: "); Serial.println(EEPROM.read(EEPROM_NODE_ID_ADDRESS)); Serial.print("Parent node id: "); Serial.println(EEPROM.read(EEPROM_PARENT_NODE_ID_ADDRESS)); Serial.print("Distance: "); Serial.println(EEPROM.read(EEPROM_DISTANCE_ADDRESS)); Serial.println(""); // child --> route Serial.println("Routing information: "); for (int route = EEPROM_ROUTES_ADDRESS; route < EEPROM_CONTROLLER_CONFIG_ADDRESS; route++) { int child = route - EEPROM_ROUTES_ADDRESS; uint8_t destination = EEPROM.read(route); if (destination != 0xff) { Serial.print(child); Serial.print(" --> "); Serial.print(destination); Serial.println(""); } } Serial.println(""); // metric imperial Serial.println("Controller config: "); uint8_t isMetric = EEPROM.read(EEPROM_CONTROLLER_CONFIG_ADDRESS); if (isMetric == 0xFF) { Serial.println("is metric"); } else { Serial.println("is imperial"); } Serial.println(""); Serial.println("Controller config raw data: "); for (int config = EEPROM_CONTROLLER_CONFIG_ADDRESS; config < EEPROM_FIRMWARE_TYPE_ADDRESS; config++) { Serial.print(EEPROM.read(config)); Serial.print(", "); if ((config - EEPROM_CONTROLLER_CONFIG_ADDRESS + 1) % 8 == 0) { Serial.println(""); } } Serial.println(""); Serial.print("Firmware Type: "); Serial.print(EEPROM.read(EEPROM_FIRMWARE_TYPE_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_TYPE_ADDRESS + 1)); Serial.print("Firmware Version: "); Serial.print(EEPROM.read(EEPROM_FIRMWARE_BLOCKS_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_BLOCKS_ADDRESS + 1)); Serial.print("Firmware Blocks: "); Serial.print(EEPROM.read(EEPROM_FIRMWARE_VERSION_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_VERSION_ADDRESS + 1)); Serial.print("Firmware CRC: "); Serial.print(EEPROM.read(EEPROM_FIRMWARE_CRC_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_CRC_ADDRESS + 1)); Serial.println(""); Serial.print("Start of local user config is at address: "); Serial.println(EEPROM_LOCAL_CONFIG_ADDRESS); Serial.println(""); Serial.println("Local user data: "); for (int localConfig = EEPROM_LOCAL_CONFIG_ADDRESS; localConfig < EEPROM_LOCAL_CONFIG_ADDRESS + 255; localConfig++) { Serial.print(EEPROM.read(localConfig)); Serial.print(", "); if ((localConfig - EEPROM_LOCAL_CONFIG_ADDRESS + 1) % 8 == 0) { Serial.println(""); } } Serial.println(""); }The output looks as follows: Dumping MySensors EEPROM: Node id: 1 
 Parent node id: 0
 Distance: 1Routing information: 
 0 --> 0
 1 --> 1
 2 --> 100
 5 --> 101
 65 --> 101
 100 --> 100
 101 --> 101
 102 --> 102
 104 --> 100
 105 --> 105
 106 --> 106
 107 --> 107
 108 --> 108
 109 --> 109
 110 --> 110
 111 --> 111
 112 --> 112
 129 --> 101
 243 --> 243Controller config: 
 is imperialController config raw data: 
 1, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,Firmware Type: 255, 255 
 Firmware Version: 255, 255
 Firmware Blocks: 255, 255
 Firmware CRC: 255, 255Start of local user config is at address: 291 Local user data: 
 255, 0, 0, 0, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 1, 1, 1, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 ...The data is from a repeater. Note that the layout may change in upcoming mysensors versions. 
 Your local data is for example stored at offset 291, so be careful when using the native EEPROM functions where you have to provide an offset!
 
- 
					
					
					
					
 
 
- 
					
					
					
					
 Works good! I made a few minor mods just for my taste, and dumped what I think is from an old gateway v1.4 #include <MySensor.h> #include <SPI.h> #include <EEPROM.h> void setup() { Serial.begin(115200); DumpMySensorsEepromData(); } void loop() {} void printByte(uint8_t b) { if (b<100) Serial.print(" "); if (b<10) Serial.print(" "); Serial.print(b); Serial.print(", "); } void DumpMySensorsEepromData() { Serial.println("Dumping MySensors EEPROM:"); Serial.println(""); Serial.print("Node id (");Serial.print(EEPROM_NODE_ID_ADDRESS);Serial.print(") : "); Serial.println(EEPROM.read(EEPROM_NODE_ID_ADDRESS)); Serial.print("Parent node id (");Serial.print(EEPROM_PARENT_NODE_ID_ADDRESS);Serial.print(") : ");; Serial.println(EEPROM.read(EEPROM_PARENT_NODE_ID_ADDRESS)); Serial.print("Distance (");Serial.print(EEPROM_DISTANCE_ADDRESS);Serial.print(") : "); Serial.println(EEPROM.read(EEPROM_DISTANCE_ADDRESS)); Serial.println(""); // child --> route Serial.print("Routing information (adr "); Serial.print(EEPROM_ROUTES_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_CONTROLLER_CONFIG_ADDRESS-1); Serial.println(") :"); for (int route = EEPROM_ROUTES_ADDRESS; route < EEPROM_CONTROLLER_CONFIG_ADDRESS; route++) { int child = route - EEPROM_ROUTES_ADDRESS; uint8_t destination = EEPROM.read(route); if (destination != 0xff) { Serial.print(child); Serial.print(" --> "); Serial.print(destination); Serial.println(""); } } Serial.println(""); // Raw routing data Serial.print("Raw routing information (adr "); Serial.print(EEPROM_ROUTES_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_CONTROLLER_CONFIG_ADDRESS-1); Serial.println(") :"); for (int i = EEPROM_ROUTES_ADDRESS; i < EEPROM_CONTROLLER_CONFIG_ADDRESS; i++) { printByte(EEPROM.read(i)); //Serial.print(", "); if ((i - EEPROM_ROUTES_ADDRESS + 1) % 10 == 0) { Serial.println(""); } } Serial.println(""); Serial.println(""); // metric imperial Serial.print("Controller config (");Serial.print(EEPROM_CONTROLLER_CONFIG_ADDRESS);Serial.println(") : "); uint8_t isMetric = EEPROM.read(EEPROM_CONTROLLER_CONFIG_ADDRESS); if (isMetric == 0xFF) { Serial.println("is metric"); } else { Serial.println("is imperial"); } Serial.println(""); Serial.print("Controller config raw data (adr "); Serial.print(EEPROM_CONTROLLER_CONFIG_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_FIRMWARE_TYPE_ADDRESS-1); Serial.println(") :"); for (int config = EEPROM_CONTROLLER_CONFIG_ADDRESS; config < EEPROM_FIRMWARE_TYPE_ADDRESS; config++) { printByte(EEPROM.read(config)); //Serial.print(", "); if ((config - EEPROM_CONTROLLER_CONFIG_ADDRESS + 1) % 10 == 0) { Serial.println(""); } } Serial.println(""); Serial.println(""); Serial.print("Firmware Type (adr "); Serial.print(EEPROM_FIRMWARE_TYPE_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_FIRMWARE_TYPE_ADDRESS+1); Serial.println(") :"); Serial.print(EEPROM.read(EEPROM_FIRMWARE_TYPE_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_TYPE_ADDRESS + 1)); Serial.print("Firmware Blocks (adr "); Serial.print(EEPROM_FIRMWARE_VERSION_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_FIRMWARE_VERSION_ADDRESS+1); Serial.println(") :"); Serial.print(EEPROM.read(EEPROM_FIRMWARE_VERSION_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_VERSION_ADDRESS + 1)); Serial.print("Firmware Version (adr "); Serial.print(EEPROM_FIRMWARE_BLOCKS_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_FIRMWARE_BLOCKS_ADDRESS+1); Serial.println(") :"); Serial.print(EEPROM.read(EEPROM_FIRMWARE_BLOCKS_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_BLOCKS_ADDRESS + 1)); Serial.print("Firmware CRC (adr "); Serial.print(EEPROM_FIRMWARE_CRC_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_FIRMWARE_CRC_ADDRESS+1); Serial.println(") :"); Serial.print(EEPROM.read(EEPROM_FIRMWARE_CRC_ADDRESS + 0)); Serial.print(", "); Serial.println(EEPROM.read(EEPROM_FIRMWARE_CRC_ADDRESS + 1)); Serial.println(""); Serial.print("Start of local user config is at address: "); Serial.println(EEPROM_LOCAL_CONFIG_ADDRESS); Serial.println(""); Serial.print("Local user data (adr "); Serial.print(EEPROM_LOCAL_CONFIG_ADDRESS); Serial.print(" - "); Serial.print(EEPROM_LOCAL_CONFIG_ADDRESS+255); Serial.println(") :"); for (int localConfig = EEPROM_LOCAL_CONFIG_ADDRESS; localConfig < EEPROM_LOCAL_CONFIG_ADDRESS + 255; localConfig++) { printByte(EEPROM.read(localConfig)); //Serial.print(", "); if ((localConfig - EEPROM_LOCAL_CONFIG_ADDRESS + 1) % 10 == 0) { Serial.println(""); } } Serial.println(""); }Output example: Dumping MySensors EEPROM: Node id (0) : 255 Parent node id (1) : 255 Distance (2) : 255 Routing information (adr 3 - 258) : 16 --> 16 17 --> 50 101 --> 50 102 --> 50 104 --> 50 105 --> 105 106 --> 106 110 --> 110 Raw routing information (adr 3 - 258) : 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 16, 50, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 50, 255, 50, 105, 106, 255, 255, 255, 110, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, Controller config (259) : is metric Controller config raw data (adr 259 - 282) : 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, Firmware Type (adr 283 - 284) : 255, 255 Firmware Blocks (adr 285 - 286) : 255, 255 Firmware Version (adr 287 - 288) : 255, 255 Firmware CRC (adr 289 - 290) : 255, 255 Start of local user config is at address: 323 Local user data (adr 323 - 578) : 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 
- 
					
					
					
					
 Thanks, looks good.