For pure sine waves, pf = cos(phi), where phi is the phase angle.

No matter what combination of inductive and capacitive load you have, if you don’t *generate* any real power, you cannot get a phase angle that is not in the range <-pi/2; pi/2>. Thus, pf is in the range <0; 1>.

Pf can only be negative if real power is being generated. However, in that case, P is also negative.

The vector math wouldn’t work if PF was negative for an inductive load.

**S** = P + jQ

P is real power being consumed. Since this is a load and not a generator, P is a positive number.

Q is the reactive power. Either positive or negative, based on load type.

**S** is complex power.

|**S**| is apparent power.

P = pf * |**S**|

|**S**| is always positive. Thus, PF can only be negative if P is negative (i.e. if real power is being produced, which an inductive load cannot do).

I recommend that you read the wikipedia article. It clearly show the equations, as well as the graphical representation (power triangle).

What I was trying to explain in one of my previous comments was that you used the incorrect equation in your example.

P = 12.88 W

Q = -93.52 var (you thought this to be |**S**| = -93.52 VA, which cannot be true).

You are calculating PF = P / Q, which is not right. For example, Q = 0 for a purely resistive load. If your equation was correct, PF wouldn’t be defined for a purely resistive load (division by zero), yet it’s a well-known fact that it’s 1 (see the Wikipedia article).

I didn't want to start a flame war. I agree that Home Assistant shouldn't be returning the abs() of PF as this is removing a piece of information the device is sending.

What I don’t agree with is your explanation of why PF would be negative.

I also don’t think the device is returning the true power factor (which would have the same sign as P), but rather a value that also contains information about the PF being leading / lagging, which cannot normally be decided just based on the value of PF (again, see Wikipedia).