Almost all components of any system that is engineered are subject to a thing called manufacturing tolerances. In a nutshell, it means that it’s too expensive to make something absolutely accurate (and that begs the question - what is absolute accuracy), so the practical solution is to make each component “good enough” to within some tolerance, which generally means the whole thing becomes affordable.
In terms of your emonPi and emonTx, and as you don’t say which sensors you are using nor do you say what the discrepancy is, I can’t go into too much detail. Both the components in the input circuits and the sensors are made to varying tolerances, and there’s an article in the ‘Learn’ section that gives an analysis of the worst case scenario. Having said that, because of the random nature of things, errors in opposite directions tend to cancel and in reality you can expect much better performance than the worst case - a Monte Carlo analysis indicated that 45% of emonTx V3.4.4 production would be inside ½% and 82% would be inside 1%.
The cure will be to calibrate your inputs. The method is also the subject of an article in ‘Learn’, and the easy place to adjust the numbers is in the emonhub.conf file in the emonPi, which is accessible through your browser. Simply adjust the numbers in scales = ...
by a small percentage to correct the values that are being fed into the graphs.
You should be looking under the nodeIDs for your emonPi, which should be NodeID=5, and your emonTx, which should be NodeID=10. The scale factors relate 1:1 to the values in ‘names’, so to increase the reading by 10%, 1 becomes 1.1 and 0.01 becomes 0.011, etc.
nodename = emonpi
[[[rx]]]
names = power1,power2,power1pluspower2,vrms,t1,t2,t3,t4,t5,t6,pulsecount
datacodes = h, h, h, h, h, h, h, h, h, h, L
scales = 1,1,1,0.01,0.1,0.1,0.1,0.1,0.1,0.1,1
units = W,W,W,V,C,C,C,C,C,C,p