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>