wyzecam icon indicating copy to clipboard operation
wyzecam copied to clipboard

Detailed Linux (Debian) install notes

Open noelhibbard opened this issue 3 years ago • 20 comments

Okay, not really a question, just leaving some notes for really green Linux users.

# clone repo
git clone https://github.com/kroo/wyzecam.git && cd wyzecam

# Install python, pip and virtual environment
sudo apt-get install python3 python3-pip python3-venv -y

# create venv
python3 -m venv wyzetest
source wyzetest/bin/activate

# Install dependencies
pip install .
pip install requests
pip install opencv-python
pip install av

# Download, compile and install TUTK_IOTC
wget https://github.com/nblavoie/wyzecam-api/raw/master/wyzecam-sdk/TUTK_IOTC_Platform_14W42P1.zip
unzip TUTK_IOTC_Platform_14W42P1.zip
cd Lib/Linux/x64/
g++ -fpic -shared -Wl,--whole-archive libAVAPIs.a libIOTCAPIs.a -Wl,--no-whole-archive -o libIOTCAPIs_ALL.so
sudo cp libIOTCAPIs_ALL.so /usr/local/lib/
cd ../../..

# Set Wyze creds
export [email protected]
export WYZE_PASSWORD=mypassword

# Set your camera name on line 20 of example:
nano examples/streaming_video.py

# run example
python examples/streaming_video.py

noelhibbard avatar Jun 10 '21 19:06 noelhibbard

I walked through the above steps, If I run the last command "python examples/streaming_video.py" I receive the following error:

Traceback (most recent call last):
  File "examples/streaming_video.py", line 7, in <module>
    from wyzecam import get_camera_list, get_user_info, login
ModuleNotFoundError: No module named 'wyzecam'

I am not too familiar with Python, how can I check that the wyzecam module exists?

calvinnelms avatar Jun 12 '21 00:06 calvinnelms

If you followed all the steps (including the .s), you should have the wyzecam module installed in the local venv which you can activate using the command source wyzetest/bin/activate.

If that still doesn't work you can try reinstalling it from the repo using pip install . (with the dot) or pip install wyzecam

mrlt8 avatar Jun 12 '21 02:06 mrlt8

** on Ubuntu I had to make another slight edit to ensure the venv was using python3.8 which does work... ** all pip & python calls must be pip3.8 & python3.8

clone repo

git clone https://github.com/kroo/wyzecam.git && cd wyzecam

Install python, pip and virtual environment

sudo apt-get install python3.8 python3.8-pip python3.8-venv -y

create venv

python3.8 -m venv wyzetest source wyzetest/bin/activate

Install dependencies

pip3.8 install . pip3.8 install requests pip3.8 install opencv-python pip3.8 install av

...

run example ( with venv activated )

python3.8 examples/streaming_video.py

Hope this helps ...

rickgitdone avatar Jun 14 '21 19:06 rickgitdone

@ricksdunn FYI, 'python' and 'pip' are linked to what ever version of python was used to create the venv.

So while in the venv, this:

python3.8 examples/streaming_video.py

Is the same as doing this:

python examples/streaming_video.py

noelhibbard avatar Jun 15 '21 14:06 noelhibbard

@ricksdunn , thanks, I am running ubuntu 20.04; running with python3.8 did the trick.

calvinnelms avatar Jun 16 '21 02:06 calvinnelms

On latest Ubuntu 20.04.2.0 LTS.

wyzetest) ron@ToshibaWin7-Ubuntu:~$ pip3 --version pip 20.0.2 from /home/ron/wyzetest/lib/python3.8/site-packages/pip (python 3.8)

(wyzetest) ron@ToshibaWin7-Ubuntu:~$ python --version Python 3.8.5

Got this far in above instructions...

clone repo

git clone https://github.com/kroo/wyzecam.git && cd wyzecam

Install python, pip and virtual environment

sudo apt-get install python3 python3-pip python3-venv -y

create venv

python3 -m venv wyzetest source wyzetest/bin/activate

Install dependencies

pip install .

Then get this error:

(wyzetest) ron@ToshibaWin7-Ubuntu:~$ pip install . ERROR: Directory '.' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.

Don't know if I am on the correct directory. Just ran these from my /home directory. What should I do next?

Note:

I tried to get slick and copy the setup.py file to the directory in which I was working.

(wyzetest) ron@ToshibaWin7-Ubuntu:~$ cp /usr/share/hplip/setup.py . (wyzetest) ron@ToshibaWin7-Ubuntu:~$ pip3.8 install . Processing /home/ron ERROR: Command errored out with exit status 1: command: /home/ron/wyzetest/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-7lwko7hx/setup.py'"'"'; file='"'"'/tmp/pip-req-build-7lwko7hx/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-req-build-7lwko7hx/pip-egg-info cwd: /tmp/pip-req-build-7lwko7hx/ Complete output (5 lines): Traceback (most recent call last): File "", line 1, in File "/tmp/pip-req-build-7lwko7hx/setup.py", line 47, in from base.g import * ModuleNotFoundError: No module named 'base' ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

SomebodySysop avatar Jun 25 '21 02:06 SomebodySysop

sudo apt-get install python3.8 python3.8-pip python3.8-venv -y

I'm on latest Ubuntu. When I try this, I get the following error:

(wyzetest) ron@ToshibaWin7-Ubuntu:~/wyzecam/wyzecam$ sudo apt-get install python3.8 python3.8-pip python3.8-venv -y Reading package lists... Done Building dependency tree
Reading state information... Done E: Unable to locate package python3.8-pip E: Couldn't find any package by glob 'python3.8-pip' E: Couldn't find any package by regex 'python3.8-pip'

SomebodySysop avatar Jun 25 '21 03:06 SomebodySysop

Got past the errors. Going to try the example.

SomebodySysop avatar Jun 25 '21 03:06 SomebodySysop

Got past the pip install error by making sure I used python3.8.

Now attempting example. Prepared to edit examples/streaming_video.py and totally stumped by this:

cam = [camera for camera in cameras if camera.nickname == "Back Yard Cam"][
    0
]

What????

My camera name is simply WyzeCam301. Do I just replace the "0" with the camera name? And what happens when I add another camera? Sorry to be a bother, but this is a bit unclear.

SomebodySysop avatar Jun 25 '21 04:06 SomebodySysop

Replace "Back Yard Cam" with the camera nickname you set in the wyze app.

Or if you simply want to get the first cam, just use:

cam = cameras[0]

mrlt8 avatar Jun 25 '21 04:06 mrlt8

Replace "Back Yard Cam" with the camera nickname you set in the wyze app.

Or if you simply want to get the first cam, just use:

cam = cameras[0]

Got it! Thank you!

I got a connection, but then python crashed!

(wyzetest) ron@ToshibaWin7-Ubuntu:~/wyzecam/wyzecam$ python3.8 examples/streaming_video.py 6, session_info = SInfoStruct: mode: 2 uid: b'45FX8Z1XY4M55RAP111A' remote_ip: b'192.168.1.211' remote_port: 191 tx_packet_count: 14 got av frame 23936 codec: 78 ts: 1624594040.507448 keyframe: 0 frame rate: 20 frame size: 0 bitrate: 120 qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/ron/wyzecam/wyzecam/wyzetest/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

Aborted (core dumped)

SomebodySysop avatar Jun 25 '21 04:06 SomebodySysop

OK, sorry everybody! I was ssh'd into my Ubuntu machine (I'm real old school). When I executed command from the machine terminal itself, boom, there I was in living color! Example works! Whoo-Hoo!

On to next leg of the journey!

SomebodySysop avatar Jun 25 '21 04:06 SomebodySysop

Went through all the steps fine on both Ubuntu and MacOS, however am getting "validation errors for WyzeCredential access_token". I have verified credentials are correct in env vars. Also tried hard cording creds in streaming_video.py and got the same error. Any suggestions on what else to check?

$ python examples/streaming_video.py 
Traceback (most recent call last):
  File "examples/streaming_video.py", line 51, in <module>
    main()
  File "examples/streaming_video.py", line 16, in main
    auth_info = login(os.environ["WYZE_EMAIL"], os.environ["WYZE_PASSWORD"])
  File "/usr/local/src/wyze/wyzecam/wyzetest/lib/python3.8/site-packages/wyzecam/api.py", line 49, in login
    return WyzeCredential.parse_obj(dict(resp.json(), phone_id=phone_id))
  File "pydantic/main.py", line 578, in pydantic.main.BaseModel.parse_obj
  File "pydantic/main.py", line 406, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 3 validation errors for WyzeCredential
access_token
  none is not an allowed value (type=type_error.none.not_allowed)
refresh_token
  none is not an allowed value (type=type_error.none.not_allowed)
mfa_options
  value is not a valid dict (type=type_error.dict)

hobbez avatar Jul 06 '21 19:07 hobbez

@noelhibbard, Thank you so much for your post. Being green, there was no way i could have pulled this off with the basic instructions that were given. It worked for me with no issues. I would have been nice if they made a way for VLC to connect to it. VcXsrv Windows X Server, goes full screen which is kinda useless without being able to resize it.

versamodule avatar Jul 08 '21 05:07 versamodule

@hobbez it looks like you likely have 2fa set up. See https://github.com/kroo/wyzecam/issues/57

kroo avatar Jul 08 '21 08:07 kroo

@kroo - confirmed, thanks!

hobbez avatar Jul 08 '21 14:07 hobbez

I would have been nice if they made a way for VLC to connect to it. VcXsrv Windows X Server, goes full screen which is kinda useless without being able to resize it.

Why don't you just pipe it directly to VLC?

with wyzecam.WyzeIOTC() as wyze_iotc:
  with wyze_iotc.connect_and_auth(account, camera) as sess:
    for (frame,_) in sess.recv_video_data():
      sys.stdout.buffer.write(frame)

python myscript.py | VLC - --demux h264

mrlt8 avatar Jul 08 '21 15:07 mrlt8

I would have been nice if they made a way for VLC to connect to it. VcXsrv Windows X Server, goes full screen which is kinda useless without being able to resize it.

Why don't you just pipe it directly to VLC?

with wyzecam.WyzeIOTC() as wyze_iotc:
  with wyze_iotc.connect_and_auth(account, camera) as sess:
    for (frame,_) in sess.recv_video_data():
      sys.stdout.buffer.write(frame)

python myscript.py | VLC - --demux h264

Because I know to little about Linux,, and know even less about Python. But I can copy and paste ;-) Thank you for the info though. I need to research more, as my goal now is to have a RPI board do this, and then (if possible) act as a streaming server so that on my PC I can use VLC to connect to the RPI board to receive the video feed.

versamodule avatar Jul 08 '21 15:07 versamodule

did you try this pipe idea? Does it work?

I ended up using the fiveleaves hack and use cvlc ( command line binary ) of vlc and take the hack output and restream to rtsp locally

cvlc -vvv http://[cam IP]:12345 --sout '#rtp{sdp=rtsp://:8554/}' --demux h264 &

... my NVR then slurps up rtsp feed

... I will try this idea soon...

rickgitdone avatar Jul 08 '21 18:07 rickgitdone

I would have been nice if they made a way for VLC to connect to it. VcXsrv Windows X Server, goes full screen which is kinda useless without being able to resize it.

Why don't you just pipe it directly to VLC?

with wyzecam.WyzeIOTC() as wyze_iotc:
  with wyze_iotc.connect_and_auth(account, camera) as sess:
    for (frame,_) in sess.recv_video_data():
      sys.stdout.buffer.write(frame)

python myscript.py | VLC - --demux h264

Because I know to little about Linux,, and know even less about Python. But I can copy and paste ;-) Thank you for the info though. I need to research more, as my goal now is to have a RPI board do this, and then (if possible) act as a streaming server so that on my PC I can use VLC to connect to the RPI board to receive the video feed.

for (frame,_) in sess.recv_video_data():
      sys.stdout.buffer.write(frame)   

the conversion to stdout in terminal isn't working out to be able to use VLC to restream

I tried several adjustments in VLC and also piped to a file but the output was no good.. I am thinking the output needs to stay binary to be able to use it and sys.stdout.buffer.write(frame) examples do sys.stdout.buffer.write(b"frame") and that doesn't work either... I will also try the ffmpeg example to see if that can be piped into vlc to restream to rtsp w/o need for TinyCam or NgnX stuff

rickgitdone avatar Jul 09 '21 12:07 rickgitdone