Example #1
0
void MeterSML::_parse(sml_list *entry, Reading *rd) {
	//int unit = (entry->unit) ? *entry->unit : 0;
	int scaler = (entry->scaler) ? *entry->scaler : 1;
	
	rd->value(sml_value_to_double(entry->value) * pow(10, scaler));

	Obis obis((unsigned char)entry->obj_name->str[0],
						(unsigned char)entry->obj_name->str[1],
						(unsigned char)entry->obj_name->str[2],
						(unsigned char)entry->obj_name->str[3],
						(unsigned char)entry->obj_name->str[4],
						(unsigned char)entry->obj_name->str[5]);
	ReadingIdentifier *rid(new ObisIdentifier(obis));
	rd->identifier(rid);
	
	// TODO handle SML_TIME_SEC_INDEX or time by SML File/Message
	struct timeval tv;
	if (entry->val_time) { /* use time from meter */
		tv.tv_sec = *entry->val_time->data.timestamp;
		tv.tv_usec = 0;
	}
	else {
		gettimeofday(&tv, NULL); /* use local time */
	}
	rd->time(tv);
}
Example #2
0
void meter_sml_parse(sml_list *entry, reading_t *rd) {
	//int unit = (entry->unit) ? *entry->unit : 0;
	int scaler = (entry->scaler) ? *entry->scaler : 1;

	rd->value = sml_value_to_double(entry->value) * pow(10, scaler);
	rd->identifier.obis = obis_init(entry->obj_name->str);

	/* get time */
	// TODO handle SML_TIME_SEC_INDEX or time by SML File/Message
	if (entry->val_time) {
		rd->time.tv_sec = *entry->val_time->data.timestamp;
		rd->time.tv_usec = 0;
	}
	else {
		gettimeofday(&rd->time, NULL);
	}
}