Re: Python and Cors

Deve Krehbiel <[email protected]> Sun, 27 Aug 2017 15:11:51 -0500
Newsgroups gmane.comp.python.twisted.web
Message-ID <CADfFrhS=yOwmm7pjbwP+vhFLcOtMuuUkE6qyxhfGEvTUXsC4VQ@mail.gmail.com>
--===============3567542855432498418==
Content-Type: multipart/alternative; boundary="f403045f2f9cf292370557c1c98a"

--f403045f2f9cf292370557c1c98a
Content-Type: text/plain; charset="UTF-8"

WOW! That did it. I am amazed! Thank you so much! My next chore is to
figure out how to make sliders for this so that I can move the servos in 1
degree increments. On to that task! I am so appreciative! Thank you Donal!

Deve

On Sun, Aug 27, 2017 at 2:43 PM, Donal McMullan <[email protected]>
wrote:

> Ah sorry Deve -  I failed to paste the first like of the render_GET method.
>
> # Import necessary files
>
> import serial
>
> from twisted.web.resource import Resource
>
> # Setup Arduino at correct speed
>
> try:
>
>     arduino = serial.Serial('/dev/ttyACM0', 9600)
>
> except:
>
>     arduino = serial.Serial('/dev/ttyACM1', 9600)
>
>
>
> class MoveServo(Resource):
>
>     isLeaf = True
>
>     permitted_origins = ('http://192.168.1.122:9000',)
>
>
>
>     def render_GET(self,request):
>         origin = request.getHeader('Origin')
>
>         if origin in (self.permitted_origins):
>
>             request.setHeader('Access-Control-Allow-Origin', origin)
>
>         try:
>
>             # Send value over serial to the Arduino
>
>             arduino.write(request.args['value'][0])
>
>             return 'Success'
>
>         except:
>
>             return 'Failure'
>
>
>
> resource = MoveServo()
>
> On 27 August 2017 at 19:01, Deve Krehbiel <[email protected]> wrote:
>
>> This is what I get without your code:
>> index1.html:1 XMLHttpRequest cannot load http://192.168.1.122:81/servos
>> .rpy?value=70P. No 'Access-Control-Allow-Origin' header is present on
>> the requested resource. Origin 'http://192.168.1.122:9000' is therefore
>> not allowed access.
>> jquery.min.js:4 XHR failed loading: GET "http://192.168.1.122:81/servo
>> s.rpy?value=70P".
>>
>> This is what I get with it:
>> jquery.min.js:4 GET http://192.168.1.122:81/servos.rpy?value=100P
>> send @ jquery.min.js:4
>> ajax @ jquery.min.js:4
>> r.(anonymous function) @ jquery.min.js:4
>> move @ index1.html:54
>> onclick @ index1.html:17
>> index1.html:1 XMLHttpRequest cannot load http://192.168.1.122:81/servos
>> .rpy?value=100P. No 'Access-Control-Allow-Origin' header is present on
>> the requested resource. Origin 'http://192.168.1.122:9000' is therefore
>> not allowed access. *The response had HTTP status code 500.*
>> jquery.min.js:4 XHR failed loading: GET "http://192.168.1.122:81/servo
>> s.rpy?value=100P".
>>
>> I appreciate your efforts and if you have any other ideas... Thank You!
>>
>> Deve
>>
>> On Sun, Aug 27, 2017 at 12:48 PM, Deve Krehbiel <[email protected]>
>> wrote:
>>
>>> Thank you for the response. In trying that code, it made it so the LAN
>>> cannot move the buttons either. Here is the error list I got:
>>>
>>> *web.Server Traceback (most recent call last):*
>>> exceptions.NameError: global name 'origin' is not defined
>>> /usr/lib/python2.7/dist-packages/twisted/web/server.py:189 in process
>>> 188                    self._encoder = encoder
>>> 189            self.render(resrc)
>>> 190        except:
>>> /usr/lib/python2.7/dist-packages/twisted/web/server.py:238 in render
>>> 237        try:
>>> 238            body = resrc.render(self)
>>> 239        except UnsupportedMethod as e:
>>> /usr/lib/python2.7/dist-packages/twisted/web/resource.py:250 in render
>>> 249            raise UnsupportedMethod(allowedMethods)
>>> 250        return m(request)
>>> 251
>>> /usr/local/www/servos.rpy:15 in render_GET
>>> 14    def render_GET(self,request):
>>> 15        if origin in (self.permitted_origins):
>>> 16            request.setHeader('Access-Control-Allow-Origin', origin)
>>> exceptions.NameError: global name 'origin' is not defined
>>>
>>> Deve
>>>
>>> On Sun, Aug 27, 2017 at 12:03 PM, Donal McMullan <
>>> [email protected]> wrote:
>>>
>>>> Perhaps you just need to set the 'Access-Control-Allow-Origin' header?
>>>> Something like this might work:
>>>>
>>>>
>>>> # Import necessary files
>>>>
>>>> import serial
>>>>
>>>> from twisted.web.resource import Resource
>>>>
>>>> # Setup Arduino at correct speed
>>>>
>>>> try:
>>>>
>>>>     arduino = serial.Serial('/dev/ttyACM0', 9600)
>>>>
>>>> except:
>>>>
>>>>     arduino = serial.Serial('/dev/ttyACM1', 9600)
>>>>
>>>>
>>>>
>>>> class MoveServo(Resource):
>>>>
>>>>     isLeaf = True
>>>>
>>>>     permitted_origins = ('http://192.168.1.122:9000',)
>>>>
>>>>
>>>>
>>>>     def render_GET(self,request):
>>>>
>>>>         if origin in (self.permitted_origins):
>>>>
>>>>             request.setHeader('Access-Control-Allow-Origin', origin)
>>>>
>>>>         try:
>>>>
>>>>             # Send value over serial to the Arduino
>>>>
>>>>             arduino.write(request.args['value'][0])
>>>>
>>>>             return 'Success'
>>>>
>>>>         except:
>>>>
>>>>             return 'Failure'
>>>>
>>>>
>>>>
>>>> resource = MoveServo()
>>>>
>>>> On 27 August 2017 at 17:10, Deve Krehbiel <[email protected]> wrote:
>>>>
>>>>> First post so forgive me if I am not explaining this right.
>>>>>
>>>>> I am trying to make a baby cam and then heavily document it for
>>>>> everyone to have access to. I am using a Raspberry Pi with Rasbian. I am
>>>>> using mjpg-streamer for the streaming with no problems.
>>>>>
>>>>> The problem is I am also using two servos for pan and tilt. To
>>>>> accomplish this I am using an Arduino Uno. This is so I can add IR lighting
>>>>> for night vision, etc later. I am not a programmer so this is getting
>>>>> frustrating after a few weeks of failure.
>>>>>
>>>>> How is it failing you might ask..well, its working perfectly with only
>>>>> ONE exception:
>>>>> Every time I push the button for left/right/up/down I get this:
>>>>>
>>>>> XMLHttpRequest cannot load http://192.168.1.122:81/servos
>>>>> .rpy?value=100P. No 'Access-Control-Allow-Origin' header is present
>>>>> on the requested resource. Origin 'http://192.168.1.122:9000' is
>>>>> therefore not allowed access.
>>>>>
>>>>> On the local area network, it still works, but taking it to the
>>>>> internet it does not.
>>>>>
>>>>> Here are the two programs that make this happen. One is servos.rpy and
>>>>> the other is the supporting HTML/Get script;
>>>>> ****
>>>>> servos.rpy
>>>>> -----------------------------------
>>>>> # Import necessary files
>>>>> import serial
>>>>> from twisted.web.resource import Resource
>>>>> # Setup Arduino at correct speed
>>>>> try:
>>>>>         arduino = serial.Serial('/dev/ttyACM0', 9600)
>>>>> except:
>>>>>         arduino = serial.Serial('/dev/ttyACM1', 9600)
>>>>>
>>>>> class MoveServo(Resource):
>>>>>         isLeaf = True
>>>>>         def render_GET(self,request):
>>>>>                 try:
>>>>>                 # Send value over serial to the Arduino
>>>>>                         arduino.write(request.args['value'][0])
>>>>>                         return 'Success'
>>>>>                 except:
>>>>>                         return 'Failure'
>>>>>
>>>>> resource = MoveServo()
>>>>> ***
>>>>>
>>>>> Now for the HTML/Get script:
>>>>>
>>>>> **
>>>>> <!doctype html>
>>>>> <html>
>>>>> <head>
>>>>> <title>Make Use Of DIY Security Camera</title>
>>>>> <style type="text/css">
>>>>> #container {
>>>>> /* center the content */
>>>>> margin: 0 auto;
>>>>> text-align: center;
>>>>> }
>>>>> </style>
>>>>> </head>
>>>>> <body>
>>>>> <div id="container">
>>>>> <img src="/?action=stream" /><br>
>>>>> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jque
>>>>> ry.min.js"></script><br />
>>>>> <button onclick="servos.move('P', 10)">Left</button>
>>>>> <button onclick="servos.move('P', -10)">Right</button>
>>>>> <button onclick="servos.move('T', -10)">Down</button>
>>>>> <button onclick="servos.move('T', 10)">Up</button>
>>>>> </div>
>>>>> </body>
>>>>> <script>
>>>>> var servos;
>>>>> $( document ).ready(function() {
>>>>> servos = moveServos();
>>>>> });
>>>>> function moveServos() {
>>>>> // Store some settings, adjust to suit
>>>>> var panPos = 70,
>>>>> tiltPos = 90,
>>>>> tiltMax = 170,
>>>>> tiltMin = 45,
>>>>> panMax = 170,
>>>>> panMin = 20;
>>>>> return {
>>>>> move:function(servo, adjustment) {
>>>>> var value;
>>>>> if(servo == 'P') {
>>>>> if(!((panPos >= panMax && adjustment > 0) || (panPos <= panMin &&
>>>>> adjustment < 0))) {
>>>>> // Still within allowed range, "schedule" the movement
>>>>> panPos += adjustment;
>>>>> }
>>>>> value = panPos + 'P';
>>>>> }
>>>>> else if(servo == 'T') {
>>>>> if(!((tiltPos >= tiltMax && adjustment > 0) || (tiltPos <= tiltMin &&
>>>>> adjustment < 0))) {
>>>>> // Still within allowed range, "schedule" the movement
>>>>> tiltPos += adjustment;
>>>>> }
>>>>> value = tiltPos + 'T';
>>>>> }
>>>>> // Use AJAX to actually move the servo
>>>>> $.get('http://192.168.1.122:81/servos.rpy?value=' + value);
>>>>> },
>>>>> }
>>>>> }
>>>>> </script>
>>>>> </html>
>>>>>
>>>>> *****
>>>>> Twisted is started:  sudo twistd -n web -p 81 --path /usr/local/www/
>>>>>
>>>>> I would be forever grateful if someone could take a serious look at
>>>>> this and tell me where I am going wrong. Once this is fixed, I can start
>>>>> documenting the entire system for everyone. Thank you!
>>>>>
>>>>> Deve
>>>>>
>>>>> _______________________________________________
>>>>> Twisted-web mailing list
>>>>> [email protected]
>>>>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Twisted-web mailing list
>>>> [email protected]
>>>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>>>
>>>>
>>>
>>
>> _______________________________________________
>> Twisted-web mailing list
>> [email protected]
>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>
>>
>
> _______________________________________________
> Twisted-web mailing list
> [email protected]
> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>
>

--f403045f2f9cf292370557c1c98a
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">WOW! That did it. I am amazed! Thank you so much! My next =
chore is to figure out how to make sliders for this so that I can move the =
servos in 1 degree increments. On to that task! I am so appreciative! Thank=
 you Donal!</div><div class=3D"gmail_extra"><br clear=3D"all"><div><div cla=
ss=3D"gmail_signature" data-smartmail=3D"gmail_signature"><div dir=3D"ltr">=
<div><div dir=3D"ltr"><div>Deve</div></div></div></div></div></div>
<br><div class=3D"gmail_quote">On Sun, Aug 27, 2017 at 2:43 PM, Donal McMul=
lan <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" targe=
t=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote =
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid=
;padding-left:1ex"><div dir=3D"ltr">Ah sorry Deve - =C2=A0I failed to paste=
 the first like of the render_GET method.<span class=3D""><br><br><div># Im=
port necessary files =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div>=
<div>import serial =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>from twisted.web.resource impor=
t Resource =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=
</div><div># Setup Arduino at correct speed =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>tr=
y: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 ar=
duino =3D serial.Serial(&#39;/dev/ttyACM0&#39;, 9600) =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0=C2=A0</div><div>except: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</d=
iv><div>=C2=A0 =C2=A0 arduino =3D serial.Serial(&#39;/dev/ttyACM1&#39;, 960=
0) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>class MoveServo(Resource=
): =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 isLea=
f =3D True =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 permitted_origins =3D (&#39;<a href=3D=
"http://192.168.1.122:9000" target=3D"_blank">http://192.168.1.122:9000</a>=
&#39;,) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 def render_GET(self,requ=
est): =C2=A0 =C2=A0 =C2=A0</div></span><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ori=
gin =3D request.getHeader(&#39;Origin&#39;) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><span class=3D""><div>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 if origin in (self.permitted_origins): =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 request.setHeader(&#39;Access-<wbr>Control-Allow-Origin&#39;, or=
igin) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 try: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 # Send value over serial to the Arduino =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 arduino.write(re=
quest.args[&#39;<wbr>value&#39;][0]) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return &#39;Success&#39; =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 except: =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return &#39;F=
ailure&#39; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>resource =3D Move=
Servo()=C2=A0</div></span></div><div class=3D"HOEnZb"><div class=3D"h5"><di=
v class=3D"gmail_extra"><br><div class=3D"gmail_quote">On 27 August 2017 at=
 19:01, Deve Krehbiel <span dir=3D"ltr">&lt;<a href=3D"mailto:deve@speedpri=
nt.com" target=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr"><div>This is what I get without=
 your code:</div><div>index1.html:1 XMLHttpRequest cannot load <a href=3D"h=
ttp://192.168.1.122:81/servos.rpy?value=3D70P" target=3D"_blank">http://192=
.168.1.122:81/servos<wbr>.rpy?value=3D70P</a>. No &#39;Access-Control-Allow=
-Origin&#39; header is present on the requested resource. Origin &#39;<a hr=
ef=3D"http://192.168.1.122:9000" target=3D"_blank">http://192.168.1.122:900=
0</a>&#39; is therefore not allowed access.</div><div>jquery.min.js:4 XHR f=
ailed loading: GET &quot;<a href=3D"http://192.168.1.122:81/servos.rpy?valu=
e=3D70P" target=3D"_blank">http://192.168.1.122:81/servo<wbr>s.rpy?value=3D=
70P</a>&quot;.</div><div><br></div><div>This is what I get with it:</div><d=
iv><div>jquery.min.js:4 GET <a href=3D"http://192.168.1.122:81/servos.rpy?v=
alue=3D100P" target=3D"_blank">http://192.168.1.122:81/servos<wbr>.rpy?valu=
e=3D100P</a>=C2=A0</div><div>send @ jquery.min.js:4</div><div>ajax @ jquery=
.min.js:4</div><div>r.(anonymous function) @ jquery.min.js:4</div><div>move=
 @ index1.html:54</div><div>onclick @ index1.html:17</div><div>index1.html:=
1 XMLHttpRequest cannot load <a href=3D"http://192.168.1.122:81/servos.rpy?=
value=3D100P" target=3D"_blank">http://192.168.1.122:81/servos<wbr>.rpy?val=
ue=3D100P</a>. No &#39;Access-Control-Allow-Origin&#39; header is present o=
n the requested resource. Origin &#39;<a href=3D"http://192.168.1.122:9000"=
 target=3D"_blank">http://192.168.1.122:9000</a>&#39; is therefore not allo=
wed access. <b>The response had HTTP status code 500.</b></div><div>jquery.=
min.js:4 XHR failed loading: GET &quot;<a href=3D"http://192.168.1.122:81/s=
ervos.rpy?value=3D100P" target=3D"_blank">http://192.168.1.122:81/servo<wbr=
>s.rpy?value=3D100P</a>&quot;.</div></div><div><br></div><div>I appreciate =
your efforts and if you have any other ideas... Thank You!</div></div><div =
class=3D"gmail_extra"><span class=3D"m_-5483403120246404331HOEnZb"><font co=
lor=3D"#888888"><br clear=3D"all"><div><div class=3D"m_-5483403120246404331=
m_8117101615705453869gmail_signature" data-smartmail=3D"gmail_signature"><d=
iv dir=3D"ltr"><div><div dir=3D"ltr"><div>Deve</div></div></div></div></div=
></div></font></span><div><div class=3D"m_-5483403120246404331h5">
<br><div class=3D"gmail_quote">On Sun, Aug 27, 2017 at 12:48 PM, Deve Krehb=
iel <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=3D"=
_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote class=3D"g=
mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l=
eft:1ex"><div dir=3D"ltr">Thank you for the response. In trying that code, =
it made it so the LAN cannot move the buttons either. Here is the error lis=
t I got:<div><br></div><div><b style=3D"color:rgb(0,0,0);font-family:&quot;=
Times New Roman&quot;;font-size:medium">web.Server Traceback (most recent c=
all last):</b><span style=3D"color:rgb(0,0,0);font-family:&quot;Times New R=
oman&quot;;font-size:medium"></span><div style=3D"font-family:Verdana,Arial=
,helvetica,sans-serif;color:rgb(0,0,0);font-size:medium"><div class=3D"m_-5=
483403120246404331m_8117101615705453869m_8371283913762161110error" style=3D=
"color:red;font-weight:bold">exceptions.NameError:=C2=A0global name &#39;or=
igin&#39; is not defined</div><div class=3D"m_-5483403120246404331m_8117101=
615705453869m_8371283913762161110gmail-stackTrace"><div class=3D"m_-5483403=
120246404331m_8117101615705453869m_8371283913762161110gmail-frame" style=3D=
"padding:1em;background-image:initial;background-position:initial;backgroun=
d-size:initial;background-repeat:initial;background-origin:initial;backgrou=
nd-clip:initial;border-bottom:thin dashed black;border-top:thin dashed blac=
k"><div class=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762=
161110gmail-location">/usr/lib/python2.7/dist-packag<wbr>es/twisted/web/ser=
ver.py:189=C2=A0i<wbr>n=C2=A0<span class=3D"m_-5483403120246404331m_8117101=
615705453869m_8371283913762161110gmail-function" style=3D"font-weight:bold;=
font-family:&quot;Courier New&quot;,courier,monospace">process</span></div>=
<div class=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161=
110gmail-snippet" style=3D"margin-bottom:0.5em;margin-left:1em;background:r=
gb(255,255,221)"><div class=3D"m_-5483403120246404331m_8117101615705453869m=
_8371283913762161110gmail-snippetLine"><span class=3D"m_-548340312024640433=
1m_8117101615705453869m_8371283913762161110gmail-lineno">188</span>=C2=A0<c=
ode class=3D"m_-5483403120246404331m_8117101615705453869m_83712839137621611=
10gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0self._encoder =3D encoder</code></div><div class=3D"m_-5483403120=
246404331m_8117101615705453869m_8371283913762161110gmail-snippetHighlightLi=
ne" style=3D"color:red"><span class=3D"m_-5483403120246404331m_811710161570=
5453869m_8371283913762161110gmail-lineno">189</span>=C2=A0<code class=3D"m_=
-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-code">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.render(resrc)</code></div><di=
v class=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110=
gmail-snippetLine"><span class=3D"m_-5483403120246404331m_81171016157054538=
69m_8371283913762161110gmail-lineno">190</span>=C2=A0<code class=3D"m_-5483=
403120246404331m_8117101615705453869m_8371283913762161110gmail-code">=C2=A0=
 =C2=A0 =C2=A0 =C2=A0except:</code></div></div></div><div class=3D"m_-54834=
03120246404331m_8117101615705453869m_8371283913762161110gmail-frame" style=
=3D"padding:1em;background-image:initial;background-position:initial;backgr=
ound-size:initial;background-repeat:initial;background-origin:initial;backg=
round-clip:initial;border-bottom:thin dashed black"><div class=3D"m_-548340=
3120246404331m_8117101615705453869m_8371283913762161110gmail-location">/usr=
/lib/python2.7/dist-packag<wbr>es/twisted/web/server.py:238=C2=A0i<wbr>n=C2=
=A0<span class=3D"m_-5483403120246404331m_8117101615705453869m_837128391376=
2161110gmail-function" style=3D"font-weight:bold;font-family:&quot;Courier =
New&quot;,courier,monospace">render</span></div><div class=3D"m_-5483403120=
246404331m_8117101615705453869m_8371283913762161110gmail-snippet" style=3D"=
margin-bottom:0.5em;margin-left:1em;background:rgb(255,255,221)"><div class=
=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-s=
nippetLine"><span class=3D"m_-5483403120246404331m_8117101615705453869m_837=
1283913762161110gmail-lineno">237</span>=C2=A0<code class=3D"m_-54834031202=
46404331m_8117101615705453869m_8371283913762161110gmail-code">=C2=A0 =C2=A0=
 =C2=A0 =C2=A0try:</code></div><div class=3D"m_-5483403120246404331m_811710=
1615705453869m_8371283913762161110gmail-snippetHighlightLine" style=3D"colo=
r:red"><span class=3D"m_-5483403120246404331m_8117101615705453869m_83712839=
13762161110gmail-lineno">238</span>=C2=A0<code class=3D"m_-5483403120246404=
331m_8117101615705453869m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0body =3D resrc.render(self)</code></div><div class=
=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-s=
nippetLine"><span class=3D"m_-5483403120246404331m_8117101615705453869m_837=
1283913762161110gmail-lineno">239</span>=C2=A0<code class=3D"m_-54834031202=
46404331m_8117101615705453869m_8371283913762161110gmail-code">=C2=A0 =C2=A0=
 =C2=A0 =C2=A0except UnsupportedMethod as e:</code></div></div></div><div c=
lass=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gma=
il-frame" style=3D"padding:1em;background-image:initial;background-position=
:initial;background-size:initial;background-repeat:initial;background-origi=
n:initial;background-clip:initial;border-bottom:thin dashed black"><div cla=
ss=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail=
-location">/usr/lib/python2.7/dist-packag<wbr>es/twisted/web/resource.py:25=
0<wbr>=C2=A0in=C2=A0<span class=3D"m_-5483403120246404331m_8117101615705453=
869m_8371283913762161110gmail-function" style=3D"font-weight:bold;font-fami=
ly:&quot;Courier New&quot;,courier,monospace">render</span></div><div class=
=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-s=
nippet" style=3D"margin-bottom:0.5em;margin-left:1em;background:rgb(255,255=
,221)"><div class=3D"m_-5483403120246404331m_8117101615705453869m_837128391=
3762161110gmail-snippetLine"><span class=3D"m_-5483403120246404331m_8117101=
615705453869m_8371283913762161110gmail-lineno">249</span>=C2=A0<code class=
=3D"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-c=
ode">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0raise UnsupportedMethod(allow=
edMetho<wbr>ds)</code></div><div class=3D"m_-5483403120246404331m_811710161=
5705453869m_8371283913762161110gmail-snippetHighlightLine" style=3D"color:r=
ed"><span class=3D"m_-5483403120246404331m_8117101615705453869m_83712839137=
62161110gmail-lineno">250</span>=C2=A0<code class=3D"m_-5483403120246404331=
m_8117101615705453869m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0return m(request)</code></div><div class=3D"m_-5483403120246404331m_8=
117101615705453869m_8371283913762161110gmail-snippetLine"><span class=3D"m_=
-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-lineno"=
>251</span><code class=3D"m_-5483403120246404331m_8117101615705453869m_8371=
283913762161110gmail-code"></code></div></div></div><div class=3D"m_-548340=
3120246404331m_8117101615705453869m_8371283913762161110gmail-frame" style=
=3D"padding:1em;background-image:initial;background-position:initial;backgr=
ound-size:initial;background-repeat:initial;background-origin:initial;backg=
round-clip:initial;border-bottom:thin dashed black"><div class=3D"m_-548340=
3120246404331m_8117101615705453869m_8371283913762161110gmail-location">/usr=
/local/www/servos.rpy:15=C2=A0i<wbr>n=C2=A0<span class=3D"m_-54834031202464=
04331m_8117101615705453869m_8371283913762161110gmail-function" style=3D"fon=
t-weight:bold;font-family:&quot;Courier New&quot;,courier,monospace">render=
_GET</span></div><div class=3D"m_-5483403120246404331m_8117101615705453869m=
_8371283913762161110gmail-snippet" style=3D"margin-bottom:0.5em;margin-left=
:1em;background:rgb(255,255,221)"><div class=3D"m_-5483403120246404331m_811=
7101615705453869m_8371283913762161110gmail-snippetLine"><span class=3D"m_-5=
483403120246404331m_8117101615705453869m_8371283913762161110gmail-lineno">1=
4</span>=C2=A0<code class=3D"m_-5483403120246404331m_8117101615705453869m_8=
371283913762161110gmail-code">=C2=A0 =C2=A0def render_GET(self,request):</c=
ode></div><div class=3D"m_-5483403120246404331m_8117101615705453869m_837128=
3913762161110gmail-snippetHighlightLine" style=3D"color:red"><span class=3D=
"m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-line=
no">15</span>=C2=A0<code class=3D"m_-5483403120246404331m_81171016157054538=
69m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0if origin in =
(self.permitted_origins):</code></div><div class=3D"m_-5483403120246404331m=
_8117101615705453869m_8371283913762161110gmail-snippetLine"><span class=3D"=
m_-5483403120246404331m_8117101615705453869m_8371283913762161110gmail-linen=
o">16</span>=C2=A0<code class=3D"m_-5483403120246404331m_811710161570545386=
9m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
request.setHeader(&#39;Access-Con<wbr>trol-Allow-Origin&#39;, origin)</code=
></div></div></div></div><div class=3D"m_-5483403120246404331m_811710161570=
5453869m_8371283913762161110error" style=3D"color:red;font-weight:bold">exc=
eptions.NameError:=C2=A0global name &#39;origin&#39; is not defined</div></=
div></div></div><div class=3D"gmail_extra"><span class=3D"m_-54834031202464=
04331m_8117101615705453869HOEnZb"><font color=3D"#888888"><br clear=3D"all"=
><div><div class=3D"m_-5483403120246404331m_8117101615705453869m_8371283913=
762161110gmail_signature" data-smartmail=3D"gmail_signature"><div dir=3D"lt=
r"><div><div dir=3D"ltr"><div>Deve</div></div></div></div></div></div></fon=
t></span><div><div class=3D"m_-5483403120246404331m_8117101615705453869h5">
<br><div class=3D"gmail_quote">On Sun, Aug 27, 2017 at 12:03 PM, Donal McMu=
llan <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" targ=
et=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote=
 class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><div>Perhaps you just need to set the =
&#39;Access-Control-Allow-Origin&#39; header? Something like this might wor=
k:</div><span><div><br></div><div><br></div><div># Import necessary files =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>import serial =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0=C2=A0</div><div>from twisted.web.resource import Resource =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div># Setu=
p Arduino at correct speed =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>try: =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 arduino =3D serial.=
Serial(&#39;/dev/ttyACM0&#39;, 9600) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</d=
iv><div>except: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0=
 arduino =3D serial.Serial(&#39;/dev/ttyACM1&#39;, 9600) =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0=C2=A0</div><div>class MoveServo(Resource): =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 isLeaf =3D True =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div></sp=
an><div>=C2=A0 =C2=A0 permitted_origins =3D (&#39;<a href=3D"http://192.168=
.1.122:9000" target=3D"_blank">http://192.168.1.122:9000</a>&#39;,) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 def render_GET(self,request): =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if origin in (self.permi=
tted_origins): =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 request.setHeader(&#39;Access-Cont<w=
br>rol-Allow-Origin&#39;, origin) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
</div><span><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 try: =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><di=
v>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # Send value over serial to the=
 Arduino =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 arduino.write(request.args[&#39;va<wbr>lue&#39;][0]) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 return &#39;Success&#39; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 except: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 return &#39;Failure&#39; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0</div><div>resource =3D MoveServo()=C2=A0</div></span></div><div clas=
s=3D"gmail_extra"><br><div class=3D"gmail_quote"><div><div class=3D"m_-5483=
403120246404331m_8117101615705453869m_8371283913762161110h5">On 27 August 2=
017 at 17:10, Deve Krehbiel <span dir=3D"ltr">&lt;<a href=3D"mailto:deve@sp=
eedprint.com" target=3D"_blank">[email protected]</a>&gt;</span> wrote:<b=
r></div></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div><div class=3D"m_-54834031=
20246404331m_8117101615705453869m_8371283913762161110h5"><div dir=3D"ltr">F=
irst post so forgive me if I am not explaining this right.=C2=A0<div><br></=
div><div>I am trying to make a baby cam and then heavily document it for ev=
eryone to have access to. I am using a Raspberry Pi with Rasbian. I am usin=
g mjpg-streamer for the streaming with no problems.=C2=A0</div><div><br></d=
iv><div>The problem is I am also using two servos for pan and tilt. To acco=
mplish this I am using an Arduino Uno. This is so I can add IR lighting for=
 night vision, etc later. I am not a programmer so this is getting frustrat=
ing after a few weeks of failure.</div><div><br></div><div>How is it failin=
g you might ask..well, its working perfectly with only ONE exception:</div>=
<div>Every time I push the button for left/right/up/down I get this:</div><=
div><br></div><div>XMLHttpRequest cannot load <a href=3D"http://192.168.1.1=
22:81/servos.rpy?value=3D100P" target=3D"_blank">http://192.168.1.122:81/se=
rvos<wbr>.rpy?value=3D100P</a>. No &#39;Access-Control-Allow-Origin&#39; he=
ader is present on the requested resource. Origin &#39;<a href=3D"http://19=
2.168.1.122:9000" target=3D"_blank">http://192.168.1.122:9000</a>&#39; is t=
herefore not allowed access.</div><div><br></div><div>On the local area net=
work, it still works, but taking it to the internet it does not.</div><div>=
<br></div><div>Here are the two programs that make this happen. One is serv=
os.rpy and the other is the supporting HTML/Get script;</div><div>****</div=
><div>servos.rpy</div><div>------------------------------<wbr>-----</div><d=
iv><div># Import necessary files</div><div>import serial</div><div>from twi=
sted.web.resource import Resource</div><div># Setup Arduino at correct spee=
d</div><div>try:</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 arduino =3D serial.S=
erial(&#39;/dev/ttyACM0&#39;, 9600)</div><div>except:</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 arduino =3D serial.Serial(&#39;/dev/ttyACM1&#39;, 9600)</=
div><div><br></div><div>class MoveServo(Resource):</div><div>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 isLeaf =3D True</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 def ren=
der_GET(self,request):</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 try:</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 <span style=3D"white-space:pre-wrap">		</span># Send value over =
serial to the Arduino</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 arduino.write(request.args[&#39;v=
a<wbr>lue&#39;][0])</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return &#39;Success&#39;</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 except:</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 return &#39;Failure&#39;</div><div><br></div><div>resource =3D M=
oveServo()</div></div><div>***</div><div><br></div><div>Now for the HTML/Ge=
t script:</div><div><br></div><div>**</div><div><div>&lt;!doctype html&gt;<=
/div><div>&lt;html&gt;</div><div><span style=3D"white-space:pre-wrap">	</sp=
an>&lt;head&gt;</div><div><span style=3D"white-space:pre-wrap">		</span>&lt=
;title&gt;Make Use Of DIY Security Camera&lt;/title&gt;</div><div><span sty=
le=3D"white-space:pre-wrap">		</span>&lt;style type=3D&quot;text/css&quot;&=
gt;</div><div><span style=3D"white-space:pre-wrap">			</span>#container {</=
div><div><span style=3D"white-space:pre-wrap">				</span>/* center the cont=
ent */</div><div><span style=3D"white-space:pre-wrap">				</span>margin: 0 =
auto;<span style=3D"white-space:pre-wrap">	</span></div><div><span style=3D=
"white-space:pre-wrap">				</span>text-align: center;</div><div><span style=
=3D"white-space:pre-wrap">			</span>}</div><div><span style=3D"white-space:=
pre-wrap">		</span>&lt;/style&gt;</div><div><span style=3D"white-space:pre-=
wrap">	</span>&lt;/head&gt;</div><div><span style=3D"white-space:pre-wrap">=
	</span>&lt;body&gt;</div><div><span style=3D"white-space:pre-wrap">		</spa=
n>&lt;div id=3D&quot;container&quot;&gt;</div><div><span style=3D"white-spa=
ce:pre-wrap">			</span>&lt;img src=3D&quot;/?action=3Dstream&quot; /&gt;&lt=
;br&gt;</div><div><span style=3D"white-space:pre-wrap">			</span>&lt;script=
 src=3D&quot;<a href=3D"https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/=
jquery.min.js" target=3D"_blank">https://ajax.googleapis.c<wbr>om/ajax/libs=
/jquery/3.1.0/jque<wbr>ry.min.js</a>&quot;&gt;&lt;/script&gt;&lt;br /&gt;</=
div><div><span style=3D"white-space:pre-wrap">			</span>&lt;button onclick=
=3D&quot;servos.move(&#39;P&#39;, 10)&quot;&gt;Left&lt;/button&gt;</div><di=
v><span style=3D"white-space:pre-wrap">			</span>&lt;button onclick=3D&quot=
;servos.move(&#39;P&#39;, -10)&quot;&gt;Right&lt;/button&gt;</div><div><spa=
n style=3D"white-space:pre-wrap">			</span>&lt;button onclick=3D&quot;servo=
s.move(&#39;T&#39;, -10)&quot;&gt;Down&lt;/button&gt;</div><div><span style=
=3D"white-space:pre-wrap">			</span>&lt;button onclick=3D&quot;servos.move(=
&#39;T&#39;, 10)&quot;&gt;Up&lt;/button&gt;</div><div><span style=3D"white-=
space:pre-wrap">		</span>&lt;/div&gt;</div><div><span style=3D"white-space:=
pre-wrap">	</span>&lt;/body&gt;</div><div><span style=3D"white-space:pre-wr=
ap">	</span>&lt;script&gt;</div><div><span style=3D"white-space:pre-wrap">	=
	</span>var servos;</div><div><span style=3D"white-space:pre-wrap">		</span=
>$( document ).ready(function() {</div><div><span style=3D"white-space:pre-=
wrap">			</span>servos =3D moveServos();</div><div><span style=3D"white-spa=
ce:pre-wrap">		</span>});</div><div><span style=3D"white-space:pre-wrap">		=
</span>function moveServos() {</div><div><span style=3D"white-space:pre-wra=
p">			</span>// Store some settings, adjust to suit</div><div><span style=
=3D"white-space:pre-wrap">			</span>var panPos =3D 70,=C2=A0</div><div><spa=
n style=3D"white-space:pre-wrap">				</span>tiltPos =3D 90,=C2=A0</div><div=
><span style=3D"white-space:pre-wrap">				</span>tiltMax =3D 170,=C2=A0</di=
v><div><span style=3D"white-space:pre-wrap">				</span>tiltMin =3D 45,=C2=
=A0</div><div><span style=3D"white-space:pre-wrap">				</span>panMax =3D 17=
0,=C2=A0</div><div><span style=3D"white-space:pre-wrap">				</span>panMin =
=3D 20;</div><div><span style=3D"white-space:pre-wrap">			</span>return {</=
div><div><span style=3D"white-space:pre-wrap">				</span>move:function(serv=
o, adjustment) {</div><div><span style=3D"white-space:pre-wrap">					</span=
>var value;</div><div><span style=3D"white-space:pre-wrap">					</span>if(s=
ervo =3D=3D &#39;P&#39;) {</div><div><span style=3D"white-space:pre-wrap">	=
					</span>if(!((panPos &gt;=3D panMax &amp;&amp; adjustment &gt; 0) || (p=
anPos &lt;=3D panMin &amp;&amp; adjustment &lt; 0))) {</div><div><span styl=
e=3D"white-space:pre-wrap">							</span>// Still within allowed range, &qu=
ot;schedule&quot; the movement</div><div><span style=3D"white-space:pre-wra=
p">							</span>panPos +=3D adjustment;</div><div><span style=3D"white-spa=
ce:pre-wrap">						</span>}</div><div><span style=3D"white-space:pre-wrap">=
						</span>value =3D panPos + &#39;P&#39;;</div><div><span style=3D"white=
-space:pre-wrap">					</span>}</div><div><span style=3D"white-space:pre-wra=
p">					</span>else if(servo =3D=3D &#39;T&#39;) {</div><div><span style=3D=
"white-space:pre-wrap">						</span>if(!((tiltPos &gt;=3D tiltMax &amp;&amp=
; adjustment &gt; 0) || (tiltPos &lt;=3D tiltMin &amp;&amp; adjustment &lt;=
 0))) {</div><div><span style=3D"white-space:pre-wrap">							</span>// Sti=
ll within allowed range, &quot;schedule&quot; the movement</div><div><span =
style=3D"white-space:pre-wrap">							</span>tiltPos +=3D adjustment;</div>=
<div><span style=3D"white-space:pre-wrap">						</span>}</div><div><span st=
yle=3D"white-space:pre-wrap">						</span>value =3D tiltPos + &#39;T&#39;;<=
/div><div><span style=3D"white-space:pre-wrap">					</span>}</div><div><spa=
n style=3D"white-space:pre-wrap">					</span>// Use AJAX to actually move t=
he servo</div><div><span style=3D"white-space:pre-wrap">					</span>$.get(&=
#39;<a href=3D"http://192.168.1.122:81/servos.rpy?value=3D" target=3D"_blan=
k">http://192.168.1.122:81<wbr>/servos.rpy?value=3D</a>&#39; + value);</div=
><div><span style=3D"white-space:pre-wrap">				</span>},</div><div><span st=
yle=3D"white-space:pre-wrap">			</span>}</div><div><span style=3D"white-spa=
ce:pre-wrap">		</span>}</div><div><span style=3D"white-space:pre-wrap">	</s=
pan>&lt;/script&gt;</div><div>&lt;/html&gt;</div></div><div><br></div><div>=
*****</div><div>Twisted is started: =C2=A0sudo twistd -n web -p 81 --path /=
usr/local/www/</div><div><br></div><div>I would be forever grateful if some=
one could take a serious look at this and tell me where I am going wrong. O=
nce this is fixed, I can start documenting the entire system for everyone. =
Thank you!</div><span class=3D"m_-5483403120246404331m_8117101615705453869m=
_8371283913762161110m_-4865426837896638325HOEnZb"><font color=3D"#888888"><=
div><br clear=3D"all"><div><div class=3D"m_-5483403120246404331m_8117101615=
705453869m_8371283913762161110m_-4865426837896638325m_-2487397493353888386g=
mail_signature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div>Deve</div></div=
></div></div></div></div>
</div></font></span></div>
<br></div></div>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Twisted-=
[email protected]</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-w<wbr>eb</a><br>
<br></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Twisted-=
[email protected]</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-w<wbr>eb</a><br>
<br></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
<br>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Twisted-=
[email protected]</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-w<wbr>eb</a><br>
<br></blockquote></div><br></div>
</div></div><br>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]">Twisted-web@twistedmatrix.=
com</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-<wbr>web</a><br>
<br></blockquote></div><br></div>

--f403045f2f9cf292370557c1c98a--

--===============3567542855432498418==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline

X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVHdpc3RlZC13
ZWIgbWFpbGluZyBsaXN0ClR3aXN0ZWQtd2ViQHR3aXN0ZWRtYXRyaXguY29tCmh0dHBzOi8vdHdp
c3RlZG1hdHJpeC5jb20vY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3R3aXN0ZWQtd2ViCg==

--===============3567542855432498418==--