It doesn't make any difference to this procedure, assuming you already have the data for up/down. I don't know how that works in LibreNMS. I will assume it's in an rrd file.
# scale with value of 2 for down (red) and 1 for up (green)
SCALE updown 0.5 1.5 0 255 0
SCALE updown 1.5 2.5 255 0 0
POSITION 100 100
POSITION 200 300
NODES node1 node2
TARGET my_interface_state_rrd_node1.rrd:value:- my_interface_state_rrd_node2.rrd:-:value
So that's two nodes, and a link between. The link uses a new scale called 'updown' that changes the colour depending on the interface states. The standard ifOperStatus SNMP variable is 2 for down and 1 for up.
I am also collecting the 'in' and 'out' values for the link from different RRD files, since that's most likely how they are stored by the nms. That's why the TARGET for the link has two filenames there, and why the DS names are written differently at the end. The first is the 'in' value, and the second for 'out'. That will colour the two arrows on the link.
Finally, to get the bandwidth as well, you need something else with a target to collect that data, because you've already used the target on the link. So on node2, we say "USESCALE none" so that it isn't coloured based on the data, and then add another TARGET for the bandwidth we want on the link. Back on the link, you can add that as a comment down the side of the link arrows, referring to node2's data.