MQTT Things
First go: 8 Servos:
??? WiFi connected
IP address: 10.10.10.13
esp8266.10-23 Attempting MQTT connection......MQTT Connected____________
Topic: TxNamib/servo/0001/01
Topic End: 01
1
Servo 01 received: Payload received: 1
1
esp8266.10-23 TxNamib/servo/0001/01 1
_
if ( myPayload == "0" ) { myServo.Normal();
} else if ( myPayload == "1" ) { myServo.Throw();
} else if ( myPayload == "2" ) { myServo.Toggle();
} else if ( myPayload == "3" ) { myServo.Midway();
} else if ( myPayload == "4" ) { myServo.Remove();
} else if ( myPayload == "5" ) { myServo.Reattach();
}
// Nxxx, Txxx, N+xxx, N-xxx, T+xxx, T-xxx
// :?;
// :~;
Now we use the PCA9685 i2c module and have 16 servos, so, even though the board has the "ports" labeled as 0 through 15, we are going to stick to non-zero based numbers for devices. And, to keep to 2 digits, we will only allow 6 modules (either PCA9685 for servos or MCP23017 for I/Os), thus we will have /01 through /96 max.
That gives us /00 as the control point for either information about the node, or a place to set things for the node.
/00:
A request command ends in a '?', which the node will replace with a '_', so it does not need to answer the same question again when it reboots.
VER? - software version
MCM? - number of modules attached
RPT? - report the state of all pins or servos
ENA? - report all enables pins or servos
IPA? - what is your IP Address
DIR? - pin directions, i.e. inputs or outputs
LCK? - locked pins or servos
PCFG? - spit out the JSON config string for the modules
SAV! - save the node and module info
Servos:
/01 - /16: (Active is Thrown and Inactive is Closed)
THROWN/ON/1/Active/ACTIVE/preset_active - move to the THROWN position
CLOSED/OFF/0/Inactive/INACTIVE/preset_inactive - move to the CLOSED position
Tnnn - set the the THROWN servo position and move it there, need 00/SAV1
T+nnn - increase the THROWN servo position and move it there, need 00/SAV1
T-nnn - decrease the THROWN servo position and move it there, need 00/SAV1
Cnnn - set the the CLOSED servo position and move it there, need 00/SAV1
C+nnn - increase the CLOSED servo position and move it there, need 00/SAV1
C-nnn - decrease the CLOSED servo position and move it there, need 00/SAV1
L - lock this servo (lock does not persist, cycling power removes lock)
U - unlock this servo
HTML for MQTT with mqttws31.js in same folder:
<html> <head> <title>Windhoek Humpyard</title> </head> <body> <script src="mqttws31.js" type="text/javascript"></script> <script type="text/javascript"> client = new Paho.MQTT.Client( "10.10.10.13", 9001,"client_id" ); client.onConnectionLost = onConnectionLost; client.onMessageArrived = onMessageArrived; var options = { onSuccess:onConnect,
onFailure:doFail } // options // connect the client
client.connect( options );
// called when the client connects function onConnect() { console.log( "onConnect" ); client.subscribe( "TxNamib/servo/0001/01" ); } // onConnect() function doFail(e){ console.log(e); } // doFail() function publish( topic, payload ) { message = new Paho.MQTT.Message( payload ); message.destinationName = topic; client.send(message); } // publish() // called when the client loses its connection function onConnectionLost( responseObject ) { if ( responseObject.errorCode !== 0 ) { console.log( "onConnectionLost:" + responseObject.errorMessage ); } // if() } // onConnectionLost() // called when a message arrives function onMessageArrived(message) { console.log( "onMessageArrived:" + message.payloadString ); } // onMessageArrived() function HillWVB() { publish( "TxNamib/servo/0001/01", "1" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/04", "0" ); document.getElementById('route').innerHTML = 'Walvisbaai'; } function HillKZB() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/04", "0" ); document.getElementById('route').innerHTML = 'Kranzberg'; } function HillOTA() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/06", "1" ); document.getElementById('route').innerHTML = 'Otavi'; } function HillOTJ() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/05", "1" ); document.getElementById('route').innerHTML = 'Otjiwarongo'; } function HillWDH3() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/05", "0" ); document.getElementById('route').innerHTML = 'Windhoek 3'; } function HillWDH2() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/03", "1" ); document.getElementById('route').innerHTML = 'Windhoek 2'; } function HillWDH1() { publish( "TxNamib/servo/0001/01", "0" ); publish( "TxNamib/servo/0001/02", "0" ); publish( "TxNamib/servo/0001/03", "0" ); document.getElementById('route').innerHTML = 'Windhoek 1'; } </script> <div> Humpyard Hill </div> <button onclick="HillWVB()" style="height:30px; width:150px">Walvisbaai</button><br> <button onclick="HillKZB()" style="height:30px; width:150px">Kranzberg</button><br> <button onclick="HillOTA()" style="height:30px; width:150px">Otavi</button><br> <button onclick="HillOTJ()" style="height:30px; width:150px">Otjiwarongo</button><br> <button onclick="HillWDH3()" style="height:30px; width:150px">Windhoek #3</button><br> <button onclick="HillWDH2()" style="height:30px; width:150px">Windhoek #2</button><br> <button onclick="HillWDH1()" style="height:30px; width:150px" autofocus>Windhoek #1</button><br> <br> <p id="route"></p> </body></html>