int send_xmpp_power(char *event_node, XMPP_POWER_T pwr ) { char sensor_raw_str[32]; char sensor_adj_str[32]; char sensor_type_str[32]; char reg_name[32]; char time_str[100]; char reg_id[100]; int ret = 0, val; uint32_t c_mac; SOXMessage *msg = NULL; time_t timestamp; time (×tamp); strftime (time_str, 100, "%Y-%m-%dT%X", localtime (×tamp)); check_and_create_node (event_node); val = reg_id_get (event_node, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg = create_sox_message (); msg_add_device_installation (msg, event_node, reg_id, "JigaWatt", "A Firefly Node with Power", time_str); sprintf (reg_name, "%s_VOLTAGE_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "Voltage%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0001", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.adc_rms_voltage); sprintf (sensor_adj_str, "%f", pwr.rms_voltage); msg_add_value_to_transducer (msg, event_node, "0001", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_CURRENT_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "Current%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0002", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.adc_rms_current); sprintf (sensor_adj_str, "%f", pwr.rms_current); msg_add_value_to_transducer (msg, event_node, "0002", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_POWER_%d", event_node,pwr.socket ); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "TruePower%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0003", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.adc_true_power); sprintf (sensor_adj_str, "%f", true_power); msg_add_value_to_transducer (msg, event_node, "0003", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_APOWER_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "ApparentPower%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0004", reg_id, FALSE); sprintf (sensor_raw_str, "%f", pwr.apparent_power); sprintf (sensor_adj_str, "%f", pwr.apparent_power); msg_add_value_to_transducer (msg, event_node, "0004", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_POWER_FACTOR_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "PowerFactor%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0005", reg_id, FALSE); sprintf (sensor_raw_str, "%f", pwr.power_factor); sprintf (sensor_adj_str, "%f", pwr.power_factor); msg_add_value_to_transducer (msg, event_node, "0005", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_ENERGY_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "Energy%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0006", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.adc_energy); sprintf (sensor_adj_str, "%f", pwr.energy); msg_add_value_to_transducer (msg, event_node, "0006", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_STATE_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "State%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0007", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.state); sprintf (sensor_adj_str, "%d", pwr.state); msg_add_value_to_transducer (msg, event_node, "0007", sensor_adj_str, sensor_raw_str, time_str); sprintf (reg_name, "%s_FREQ_%d", event_node,pwr.socket); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "Freq%d", pwr.socket); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0008", reg_id, FALSE); sprintf (sensor_raw_str, "%d", pwr.freq); sprintf (sensor_adj_str, "%d", pwr.freq); msg_add_value_to_transducer (msg, event_node, "0008", sensor_adj_str, sensor_raw_str, time_str); if(xmpp_flag) { ret = publish_sox_message (connection, event_node, msg); delete_sox_message (msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "Could not publish JigaWatt data to %s: %s", event_node, ERROR_MESSAGE (ret)); log_write (global_error_msg); return -1; } } else delete_sox_message (msg); return 1; }
int main(int argc, char **argv) { DATASTREAM stream; MYSQL mysql; unsigned int i; unsigned int j; char time_str[50]; XMPPConnection *connection = NULL; SOXMessage *msg = NULL; /* Check for command line arguments */ if(argc<2) { printf("Missing arguments!\n"); printf("Proper usage is: %s config.xml\n", argv[0]); return(EXIT_FAILURE); } /* Parse the configuration into the DATASTREAM struct*/ if ( parseXML(argv[1], &stream) ) return (EXIT_FAILURE); if (VERBOSE) { printf("event_node: %s\n", stream.event_node_id); printf("username: %s\n", stream.jid_username); printf("password: %s\n", stream.jid_password); printf("xmpp_server: %s\n", stream.xmpp_server); printf("xmpp_server_port: %s\n", stream.xmpp_server_port); printf("xmpp_ssl_fingerprint: %s\n", stream.xmpp_ssl_fingerprint); printf("pusbub_server: %s\n", stream.pubsub_server); } /* Initialize a MYSQL* handle */ if(mysql_init(&mysql)==NULL) { printf("\nFailed to initate MySQL connection"); exit(1); } /* Create a connection to the database server */ if (!mysql_real_connect(&mysql,stream.database.server, stream.database.username, stream.database.password, NULL,0,NULL,0)) { printf( "Failed to connect to %s: Error: %s\n", stream.database.server, mysql_error(&mysql)); exit(1); } /* Then select the appropriate database */ if(mysql_select_db(&mysql,stream.database.name)==0) { if (VERBOSE) printf( "Database %s Selected\n",stream.database.name); } else printf( "Failed to connect to Database %s: Error: %s\n", stream.database.name, mysql_error(&mysql)); /* Connect to the XMPP server */ connection = start_xmpp_client (stream.jid_username, stream.jid_password, stream.xmpp_server, atoi(stream.xmpp_server_port), stream.xmpp_ssl_fingerprint, stream.pubsub_server, NULL); if (connection == NULL) { g_printerr ("No connection present\n"); } else if(VERBOSE) g_print("XMPP connection initialized\n"); /* pseudo-code: * * for each table: * for each sensor: * if !sensor.lasttime * sensor.lasttime = get max timestamp * sensor.value = get sensor value with timestamp > lasttime * form <sensor-id, value> pairs in a struct only if sensor.value != NULL * publish_xmpp(connection, sensor_value_pairs) * */ while(1) { for(i=0; i<stream.database.tables; i++) { for(j=0; j<stream.database.table[i].sensors; j++) { if (!stream.database.table[i].sensor[j].lasttime) putMaxTimestamp(&mysql, &(stream.database.table[i]), j); putSensorValue(&mysql, &(stream.database.table[i]), j); printf("New sensor value for sensor-id %s: [%s] - [%s]\n", stream.database.table[i].sensor[j].sensor_id, stream.database.table[i].sensor[j].lasttime, stream.database.table[i].sensor[j].value); } } /* * We will assume that the first sensor's timestamp * is the device installation timestamp */ convert_time(time_str, stream.database.table[0].sensor[0].lasttime, stream.database.table[0].time_field_type); msg = create_sox_message(); msg_add_device(msg, (gchar *) stream.device_id, (gchar *) stream.device_reg_id, (gchar *) stream.device_type, "Obtained with mysql_leech", (gchar *) time_str); for(i=0; i<stream.database.tables; i++) { for(j=0; j<stream.database.table[i].sensors; j++) { /* Get the sensor time-stamp */ /* TO DO: Add case structure to select between different date formats */ convert_time(time_str, stream.database.table[i].sensor[j].lasttime, stream.database.table[i].time_field_type); msg_add_transducer(msg, (gchar *) stream.device_id, (gchar *) stream.database.table[i].sensor[j].name, (gchar *) stream.database.table[i].sensor[j].sensor_id, (gchar *) stream.database.table[i].sensor[j].sensor_reg_id, FALSE); if(stream.database.table[i].sensor[j].value) { printf("Publishing sensor-id %s: [%s] - [%s]\n", stream.database.table[i].sensor[j].sensor_id, time_str, stream.database.table[i].sensor[j].value); msg_add_value_to_transducer(msg, (gchar *) stream.device_id, (gchar *) stream.database.table[i].sensor[j].sensor_id, (gchar *) stream.database.table[i].sensor[j].value, (gchar *) stream.database.table[i].sensor[j].value, (gchar *) time_str); } } } publish_sox_message(connection, (gchar *) stream.event_node_id, msg); delete_sox_message(msg); printf("Waiting %d seconds...\n", stream.interval); sleep(stream.interval); } mysql_close(&mysql); close_xmpp_client(connection); freeData(&stream); return(0); }
void publish_xmpp_transducer_pkt (SAMPL_GATEWAY_PKT_T * gw_pkt) { uint8_t i; int8_t v; XMPP_POWER_T xmpp_pwr; FF_SENSOR_SHORT_PKT_T sensor_short; ACK_PKT_T ack; NLIST_TRAN_PKT nlist; TRANSDUCER_PKT_T tp; TRANSDUCER_MSG_T tm; FF_POWER_SENSE_PKT ps; FF_POWER_DEBUG_PKT pd; SOXMessage *msg = NULL; char sensor_raw_str[32]; char sensor_adj_str[32]; char sensor_type_str[32]; char event_node[32]; char reg_name[32]; char rssiStr[5]; char neighbor_name[32]; char time_str[100]; char data_str[255]; char reg_id[100]; int ret = 0, val,j; float temp_cal, battery_cal; uint16_t light_cal; uint32_t c_mac; time_t timestamp; uint8_t tran_ack; if (gw_pkt->pkt_type != TRANSDUCER_PKT) return 0; // GW reply packets do not include the tran_pkt header // since this information can be captured in the gw // packet header info. So fill out a dummy packet v = transducer_pkt_unpack (&tp, gw_pkt->payload); if (v != 1) { printf ("Transducer checksum failed!\n"); } for (i = 0; i < tp.num_msgs; i++) { v = transducer_msg_get (&tp, &tm, i); switch (tm.type) { case TRAN_BINARY_SENSOR: { uint8_t binary_sensor_type, binary_sensor_value; time (×tamp); strftime (time_str, 100, "%Y-%m-%dT%X", localtime (×tamp)); printf ("Binary Sensor from 0x%x\n", tm.mac_addr); binary_sensor_type=tm.payload[0]&0x7f; binary_sensor_value=tm.payload[0]>>7; printf( " binary sensor type: %d value: %d\n", binary_sensor_type, binary_sensor_value ); c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt->subnet_mac[1] << 16 | gw_pkt-> subnet_mac[0] << 8 | tm.mac_addr; sprintf (event_node, "%02x%02x%02x%02x", gw_pkt->subnet_mac[2], gw_pkt->subnet_mac[1], gw_pkt->subnet_mac[0], tm.mac_addr); check_and_create_node (event_node); val = reg_id_get (event_node, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg = create_sox_message (); msg_add_device_installation (msg, event_node, reg_id, "FIREFLY", "A Firefly Node", time_str); if(binary_sensor_type==BINARY_SENSOR_MOTION) sprintf (sensor_type_str, "Motion"); if(binary_sensor_type==BINARY_SENSOR_GPIO) sprintf (sensor_type_str, "GPIO"); if(binary_sensor_type==BINARY_SENSOR_LEAK) sprintf (sensor_type_str, "Water"); if(binary_sensor_value==1) strcpy(sensor_raw_str,"true"); else strcpy(sensor_raw_str,"false"); sprintf (sensor_adj_str, "%d", binary_sensor_value); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0001", reg_id, FALSE); msg_add_value_to_transducer (msg, event_node, "0001", sensor_adj_str, sensor_raw_str, time_str); if(xmpp_flag) { ret = publish_sox_message (connection, event_node, msg); delete_sox_message (msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "Could not publish Jiga Watt to %s: %s", event_node, ERROR_MESSAGE (ret)); log_write (global_error_msg); return -1; } } } break; case TRAN_BINARY_BLOB: c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt->subnet_mac[1] << 16 | gw_pkt-> subnet_mac[0] << 8 | tm.mac_addr; printf( " from: 0x%08x\n",c_mac); printf( " size: %u\n 0x",tm.len ); data_str[0]='\0'; for(j=0; j<tm.len; j++ ) { sprintf( data_str,"%s%02x",data_str,tm.payload[j] ); } printf( "\n" ); sprintf( event_node,"%08x",c_mac ); check_and_create_node (event_node); time (×tamp); strftime (time_str, 100, "%Y-%m-%d %X", localtime (×tamp)); msg = create_sox_message(); msg_add_device_installation(msg,event_node,event_node,"FIREFLY","A Firefly Node",time_str); if(debug_txt_flag) printf( "Binary Blob from: %s\n",event_node ); msg_add_transducer_installation (msg, event_node, "HexData", "0001", "unknown", FALSE); msg_add_value_to_transducer (msg, event_node, "0001", "n/a", data_str, time_str); if(debug_txt_flag) printf( " hex data: %s\n",data_str); ret = publish_sox_message (connection, event_node, msg); delete_sox_message(msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "XMPP Error Extended nList: %s", ERROR_MESSAGE (ret)); log_write (global_error_msg); sprintf (global_error_msg, "-> event_node=%s",event_node); log_write (global_error_msg); return -1; } break; case TRAN_NLIST: nlist_tran_unpack (&tm, &nlist); if(debug_txt_flag) printf( "Neighbor List Transducer Pkt!\n" ); c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt->subnet_mac[1] << 16 | gw_pkt-> subnet_mac[0] << 8 | tm.mac_addr; sprintf( event_node,"%08x",c_mac ); check_and_create_node (event_node); time (×tamp); strftime (time_str, 100, "%Y-%m-%d %X", localtime (×tamp)); msg = create_sox_message(); msg_add_device_installation(msg,event_node,event_node,"FIREFLY","A Firefly Node",time_str); if(debug_txt_flag) printf( "%s Neighbors:\n",event_node ); for(j=0; j<nlist.num_neighbors; j++ ) { uint32_t nmac; sprintf( rssiStr,"%d",nlist.neighbor[j].rssi ); nmac= nlist.neighbor[j].mac[3]<<24 | nlist.neighbor[j].mac[2]<<16 | nlist.neighbor[j].mac[1]<<8 | nlist.neighbor[j].mac[0]; sprintf(neighbor_name,"%08x",nmac ); msg_add_device_connection(msg,event_node,"unknown",neighbor_name,rssiStr); if(debug_txt_flag) printf( " node: %s rssi: %s\n",neighbor_name,rssiStr ); } ret = publish_sox_message (connection, event_node, msg); delete_sox_message(msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "XMPP Error Extended nList: %s", ERROR_MESSAGE (ret)); log_write (global_error_msg); sprintf (global_error_msg, "-> event_node=%s",event_node); log_write (global_error_msg); return -1; } break; case TRAN_FF_BASIC_SHORT: ff_basic_sensor_short_unpack (&tm, &sensor_short); printf ("Sensor pkt from 0x%x\n", tm.mac_addr); printf (" Light: %d\n", sensor_short.light); printf (" Temperature: %d\n", sensor_short.temperature); printf (" Acceleration: %d\n", sensor_short.acceleration); printf (" Sound Level: %d\n", sensor_short.sound_level); printf (" Battery: %d\n", sensor_short.battery + 100); c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt->subnet_mac[1] << 16 | gw_pkt-> subnet_mac[0] << 8 | tm.mac_addr; // calibrate temperature temp_cal = ff_basic_sensor_cal_get_temp ((sensor_short.temperature << 1) + TEMPERATURE_OFFSET) + ff_basic_sensor_cal_get_temp_offset (c_mac); // calibrate light printf ("battery=%u light=%u\n", sensor_short.battery, sensor_short.light); light_cal = ff_basic_sensor_cal_get_light (sensor_short.light, ((float) (sensor_short.battery + 100)) / 100) + ff_basic_sensor_cal_get_light_offset (c_mac); light_cal = 255 - light_cal; battery_cal = ((float) (sensor_short.battery + 100)) / 100; // Get local timestamp time (×tamp); strftime (time_str, 100, "%Y-%m-%dT%X", localtime (×tamp)); printf ("Sensor pkt from 0x%x\n", tm.mac_addr); printf (" Light: %u (%u)\n", light_cal, sensor_short.light); printf (" Temperature: %f (%u)\n", temp_cal, sensor_short.temperature); printf (" Acceleration: %u\n", sensor_short.acceleration); printf (" Sound Level: %u\n", sensor_short.sound_level); printf (" Battery: %f (%u)\n", battery_cal, sensor_short.battery); printf (" Timestamp: %s\n", time_str); sprintf (event_node, "%02x%02x%02x%02x", gw_pkt->subnet_mac[2], gw_pkt->subnet_mac[1], gw_pkt->subnet_mac[0], tm.mac_addr); printf ("event node=%s\n", event_node); check_and_create_node (event_node); val = reg_id_get (event_node, reg_id); if (val == 0) strcpy (reg_id, "unknown"); printf (" event node: %s reg_id: %s\n", event_node, reg_id); msg = create_sox_message (); msg_add_device_installation (msg, event_node, reg_id, "FIREFLY", "A Firefly Node", time_str); // Light sprintf (reg_name, "%s_LIGHT", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg_add_transducer_installation (msg, event_node, "Light", "0001", reg_id, FALSE); sprintf (sensor_raw_str, "%d", sensor_short.light); sprintf (sensor_adj_str, "%d", light_cal); msg_add_value_to_transducer (msg, event_node, "0001", sensor_adj_str, sensor_raw_str, time_str); // Temperature sprintf (reg_name, "%s_TEMP", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg_add_transducer_installation (msg, event_node, "Temperature", "0002", reg_id, FALSE); sprintf (sensor_raw_str, "%d", sensor_short.light); sprintf (sensor_adj_str, "%2.2f", temp_cal); msg_add_value_to_transducer (msg, event_node, "0002", sensor_adj_str, sensor_raw_str, time_str); // Acceleration sprintf (reg_name, "%s_ACCEL", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg_add_transducer_installation (msg, event_node, "Acceleration", "0003", reg_id, FALSE); sprintf (sensor_raw_str, "%d", sensor_short.acceleration); sprintf (sensor_adj_str, "%d", sensor_short.acceleration); msg_add_value_to_transducer (msg, event_node, "0003", sensor_adj_str, sensor_raw_str, time_str); // Voltage sprintf (reg_name, "%s_BAT", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg_add_transducer_installation (msg, event_node, "Voltage", "0004", reg_id, FALSE); sprintf (sensor_raw_str, "%d", sensor_short.battery); sprintf (sensor_adj_str, "%1.2f", battery_cal); msg_add_value_to_transducer (msg, event_node, "0004", sensor_adj_str, sensor_raw_str, time_str); // Sound Level sprintf (reg_name, "%s_AUDIO", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg_add_transducer_installation (msg, event_node, "Audio", "0005", reg_id, FALSE); sprintf (sensor_raw_str, "%d", sensor_short.sound_level); sprintf (sensor_adj_str, "%d", sensor_short.sound_level); msg_add_value_to_transducer (msg, event_node, "0005", sensor_adj_str, sensor_raw_str, time_str); ret = publish_sox_message (connection, event_node, msg); delete_sox_message (msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "Transducer pkt could not send %s: %s", event_node, ERROR_MESSAGE (ret)); log_write (global_error_msg); return -1; } break; case TRAN_NCK: case TRAN_ACK: if(tm.type==TRAN_ACK) tran_ack=1; else tran_ack=0; if(debug_txt_flag==1) printf ("Transducer ACK from 0x%x with value %d\n", tm.mac_addr,tran_ack); sprintf (event_node, "%02x%02x%02x%02x", gw_pkt->subnet_mac[2], gw_pkt->subnet_mac[1], gw_pkt->subnet_mac[0], tm.mac_addr); check_and_create_node (event_node); time (×tamp); strftime (time_str, 100, "%Y-%m-%dT%X", localtime (×tamp)); val = reg_id_get (event_node, reg_id); if (val == 0) strcpy (reg_id, "unknown"); msg = create_sox_message (); msg_add_device_installation (msg, event_node, reg_id, "JigaWatt", "A Firefly Node with Power", time_str); sprintf (reg_name, "%s_TRANACK", event_node); val = reg_id_get (reg_name, reg_id); if (val == 0) strcpy (reg_id, "unknown"); sprintf (sensor_type_str, "TranACK" ); msg_add_transducer_installation (msg, event_node, sensor_type_str, "0001", reg_id, FALSE); if(tran_ack==0) { sprintf (sensor_raw_str, "0"); sprintf (sensor_adj_str, "0"); } if(tran_ack==1) { sprintf (sensor_raw_str, "1"); sprintf (sensor_adj_str, "1"); } msg_add_value_to_transducer (msg, event_node, "0001", sensor_adj_str, sensor_raw_str, time_str); if(xmpp_flag) { ret = publish_sox_message (connection, event_node, msg); delete_sox_message (msg); if (ret != XMPP_NO_ERROR) { sprintf (global_error_msg, "Could not publish Tran ACK data to %s: %s", event_node, ERROR_MESSAGE (ret)); log_write (global_error_msg); return -1; } } else delete_sox_message (msg); break; case TRAN_POWER_PKT: if(tm.payload[0]==SENSE_PKT) { ff_power_sense_unpack( tm.payload, &ps); c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt-> subnet_mac[1] << 16 | gw_pkt->subnet_mac[0] << 8 | tm.mac_addr; if (jiga_watt_cal_get (c_mac,ps.socket_num, &jiga_watt_cal) == 1) { rms_voltage = (float)ps.rms_voltage / jiga_watt_cal.voltage_scaler; rms_current = (float)ps.rms_current / jiga_watt_cal.current_scaler; true_power = (float)ps.true_power / jiga_watt_cal.power_scaler; tmp_energy=ps.energy[5]<<40 | ps.energy[4]<<32 | ps.energy[3]<<24 | ps.energy[2]<<16 | ps.energy[1]<<8 | ps.energy[0]; cal_energy=(float)tmp_energy / jiga_watt_cal.power_scaler; // get Watt Seconds //cal_energy=cal_energy/3600; // convert to WHrs } else { cal_energy=0; rms_voltage = 0; rms_current = 0; jiga_watt_cal.current_adc_offset = 0; } if (ps.rms_current <= jiga_watt_cal.current_adc_offset) { // disconnected state //adc_rms_current = 0; rms_current = 0; true_power = 0; apparent_power = 0; } apparent_power = rms_voltage * rms_current; sprintf (event_node, "%02x%02x%02x%02x", gw_pkt->subnet_mac[2], gw_pkt->subnet_mac[1], gw_pkt->subnet_mac[0], tm.mac_addr); xmpp_pwr.socket=ps.socket_num; xmpp_pwr.adc_rms_current=ps.rms_current; xmpp_pwr.adc_rms_voltage=ps.rms_voltage; xmpp_pwr.adc_true_power=ps.true_power; xmpp_pwr.adc_energy=tmp_energy; xmpp_pwr.rms_current=rms_current; xmpp_pwr.rms_voltage=rms_voltage; xmpp_pwr.apparent_power=rms_current*rms_voltage; xmpp_pwr.true_power=true_power; xmpp_pwr.energy=cal_energy; if( ps.socket_num==0) xmpp_pwr.state=ps.socket0_state; if( ps.socket_num==1) xmpp_pwr.state=ps.socket1_state; if(apparent_power==0) xmpp_pwr.power_factor=0; else xmpp_pwr.power_factor=apparent_power/true_power; if(xmpp_pwr.power_factor>1.0) xmpp_pwr.power_factor=1.0; xmpp_pwr.freq=60; // FIXME: do we get freq back? val=send_xmpp_power(event_node, xmpp_pwr ); if(val==-1) return -1; } else if(tm.payload[0]==DEBUG_PKT) { ff_power_debug_unpack( tm.payload, &pd); c_mac = gw_pkt->subnet_mac[2] << 24 | gw_pkt-> subnet_mac[1] << 16 | gw_pkt->subnet_mac[0] << 8 | tm.mac_addr; if (jiga_watt_cal_get (c_mac,0, &jiga_watt_cal) == 1) { rms_voltage = (float)pd.rms_voltage / jiga_watt_cal.voltage_scaler; rms_current = (float)pd.rms_current / jiga_watt_cal.current_scaler; true_power = (float)pd.true_power / jiga_watt_cal.power_scaler; tmp_energy=pd.energy[5]<<40 | pd.energy[4]<<32 | pd.energy[3]<<24 | pd.energy[2]<<16 | pd.energy[1]<<8 | pd.energy[0]; cal_energy=(float)tmp_energy / jiga_watt_cal.power_scaler; // get Watt Seconds //cal_energy=cal_energy/3600; // convert to WHrs } else { cal_energy=0; rms_voltage = 0; rms_current = 0; jiga_watt_cal.current_adc_offset = 0; } if (pd.rms_current <= jiga_watt_cal.current_adc_offset) { // disconnected state //adc_rms_current = 0; rms_current = 0; true_power = 0; apparent_power = 0; } apparent_power = rms_voltage * rms_current; sprintf (event_node, "%02x%02x%02x%02x", gw_pkt->subnet_mac[2], gw_pkt->subnet_mac[1], gw_pkt->subnet_mac[0], tm.mac_addr); xmpp_pwr.socket=0; xmpp_pwr.adc_rms_current=pd.rms_current; xmpp_pwr.adc_rms_voltage=pd.rms_voltage; xmpp_pwr.adc_true_power=pd.true_power; xmpp_pwr.adc_energy=tmp_energy; xmpp_pwr.rms_current=rms_current; xmpp_pwr.rms_voltage=rms_voltage; xmpp_pwr.apparent_power=rms_current*rms_voltage; xmpp_pwr.true_power=true_power; xmpp_pwr.energy=cal_energy; xmpp_pwr.state=pd.socket0_state; if(apparent_power==0) xmpp_pwr.power_factor=0; else xmpp_pwr.power_factor=apparent_power/true_power; if(xmpp_pwr.power_factor>1.0) xmpp_pwr.power_factor=1.0; xmpp_pwr.freq=pd.freq; val=send_xmpp_power(event_node, xmpp_pwr ); if(val==-1) return -1; if (jiga_watt_cal_get (c_mac,1, &jiga_watt_cal) == 1) { rms_voltage = (float)pd.rms_voltage / jiga_watt_cal.voltage_scaler; rms_current = (float)pd.rms_current2 / jiga_watt_cal.current_scaler; true_power = (float)pd.true_power2 / jiga_watt_cal.power_scaler; tmp_energy=pd.energy2[5]<<40 | pd.energy2[4]<<32 | pd.energy2[3]<<24 | pd.energy2[2]<<16 | pd.energy2[1]<<8 | pd.energy2[0]; cal_energy=(float)tmp_energy / jiga_watt_cal.power_scaler; // get Watt Seconds //cal_energy=cal_energy/3600; // convert to WHrs } else { cal_energy=0; rms_voltage = 0; rms_current = 0; jiga_watt_cal.current_adc_offset = 0; } if (pd.rms_current2 <= jiga_watt_cal.current_adc_offset) { // disconnected state //adc_rms_current = 0; rms_current = 0; true_power = 0; apparent_power = 0; } apparent_power = rms_voltage * rms_current; xmpp_pwr.socket=1; xmpp_pwr.adc_rms_current=pd.rms_current2; xmpp_pwr.adc_rms_voltage=pd.rms_voltage; xmpp_pwr.adc_true_power=pd.true_power2; xmpp_pwr.adc_energy=tmp_energy; xmpp_pwr.rms_current=rms_current; xmpp_pwr.rms_voltage=rms_voltage; xmpp_pwr.apparent_power=rms_current*rms_voltage; xmpp_pwr.true_power=true_power; xmpp_pwr.energy=cal_energy; xmpp_pwr.state=pd.socket1_state; if(apparent_power==0) xmpp_pwr.power_factor=0; else xmpp_pwr.power_factor=apparent_power/true_power; if(xmpp_pwr.power_factor>1.0) xmpp_pwr.power_factor=1.0; xmpp_pwr.freq=pd.freq; val=send_xmpp_power(event_node, xmpp_pwr ); if(val==-1) return -1; } break; default: printf ("unkown transducer packet: %d\n", tm.type); } } }