// Acurite 609 Temperature and Humidity Sensor // 5 byte messages // II ST TT HH CC // II - ID byte, changes at each power up // S - Status bitmask, normally 0x2, // 0xa - battery low (bit 0x80) // TTT - Temp in Celsius * 10, 12 bit with complement. // HH - Humidity // CC - Checksum // // @todo - see if the 3rd nybble is battery/status // static int acurite_th_callback(bitbuffer_t *bitbuf) { uint8_t *bb = NULL; int cksum, battery_low, valid = 0; float tempc; uint8_t humidity, id, status; data_t *data; local_time_str(0, time_str); for (uint16_t brow = 0; brow < bitbuf->num_rows; ++brow) { if (bitbuf->bits_per_row[brow] != 40) { continue; } bb = bitbuf->bb[brow]; cksum = (bb[0] + bb[1] + bb[2] + bb[3]); if (cksum == 0 || ((cksum & 0xff) != bb[4])) { continue; } tempc = acurite_th_temperature(bb); id = bb[0]; status = (bb[1] & 0xf0) >> 4; battery_low = status & 0x8; humidity = bb[3]; data = data_make( "time", "", DATA_STRING, time_str, "model", "", DATA_STRING, "Acurite 609TXC Sensor", "id", "", DATA_INT, id, "battery", "", DATA_STRING, battery_low ? "LOW" : "OK", "status", "", DATA_INT, status, "temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, tempc, "humidity", "Humidity", DATA_INT, humidity, NULL); data_acquired_handler(data); valid++; } if (valid) return 1; return 0; }
// @tdodo - determine which Acurite temp/humidity // sensors this acutally decodes static int acurite_th_callback(bitbuffer_t *bitbuffer) { bitrow_t *bb = bitbuffer->bb; uint8_t *buf = NULL; int i; for(i = 0; i < BITBUF_ROWS; i++){ if(acurite_th_detect(bb[i])){ buf = bb[i]; break; } } if(buf){ fprintf(stdout, "Temperature event:\n"); fprintf(stdout, "protocol = Acurite Temp&Humidity\n"); fprintf(stdout, "temp = %.1f°C\n", acurite_th_temperature(buf)); fprintf(stdout, "humidity = %d%%\n\n", buf[3]); return 1; } return 0; }