Used inject node to insert msg.payload filled with command and left exec node empty with msg.payload ticked. It still throws the same error.
Please highlight what does this suggest comparing Output1 and Output2 by your experience? Does it give us any clue to the problem?
I don't understand what you mean by output 1 and output 2. When you run it in a terminal there is no output 1 and output 2. Please copy/paste the result of running it in the terminal.
When you run it in an exec node there are three outputs. What is on each output?
[Edit] or do you mean that when you run it in the terminal you see the path shown, but when you look at output 1 of the exec node it shows an empty payload?
If that is the case then this may be the problem, that the library load path is not setup. Try this as the command.
LD_LIBRARY_PATH=/usr/python/lib:/usr/lib:/usr/lib/iptables /usr/python/bin/python /home/pi/Downloads/telegram/FAhightemp.py
Don't add any extra spaces into the first bit.
Also you still have not told us how node-red is started.
@zenofmud while the points you are making are valid, I don't think the method of invoking the command will change whether python can find its libraries. Or am I missing something?
I just wanted to make sure that the user understood how the exec node works
I get the following on the three outputs of exec node, and this time it is code:1
Then I pasted $PYTHONHOME on the terminal and I got
-ash: /usr/python: Permission denied, whereas this snapshot /usr/python/ shows permission 777
I did not understand this question, "how node-red is started" my apology. How do I check this? please elaborate so I can check and message
Are you shrinking your screen captures before pasting them? It's making my eyes hurt trying to read the error message.
That is because /usr/python is a directory.
By typing $PYTHONHOME you are asking the shell to execute the file whose path name is the value of that variable.
You can't execute a directory. The "x" permission has different meanings for directories and files.
We have not established if Node-Red is running as root or another user.
Can you run the following command from the commandline:
env > /home/pi/env_cli
And this from Node-Red exec
Then from the command line
ls -l env_cli; cat env_cli
ls -l env_nr; cat env_nr
Copy and paste the output here.
/usr/python is a folder. The python program is in /usr/python/bin/python.
It still is not finding the python libraries for some reason.
Somehow the node red server is started running. Either you do that manually or it is configured to run automatically on boot. It may be useful to know how that is done. Presumably you installed node red somehow and set it up to start on boot, or you start it manually somehow. So tell us how you installed it and how you set it up to start on boot (if you have done that).
What does this command show. It should tell us the user that is running node-red.
ps -aux|grep node
Nodered came as a feature on the LoRaWAN Gateway, I did not install it. Nodered (systemd I guess) starts on its own. I then manually open the web interface https://IP:1880 manually.
The command prompt says invalid option for -aux so I just tried
p | grep node and the output is:-
root@GATEWAY:~# ps |grep node 2340 root 938m S node-red 6952 root 3852 S grep node root@GATEWAY:~#
I guess this shows it is running as root.
Does this answer the question, I will be glad to troubleshoot further.
Gives no output.
B) This on exec node and all three outputs connected to debug:-
Gives code 0 nothing else.
C) CLI within /home/pi directory
D) CLI within /home/pi directory
-rw-r--r-- 1 root root 373 Sep 14 19:26 env_nr procdT_J_V_instances=object SHLVL=2 HOME=/ procdJSON_CUR=J_T1 PYTHONUNBUFFERED=1 procdT_J_V_script=string NTBA_FIX_319=1 procdJ_V_name=node_red TERM=linux procdJ_V_instances=J_T1 PATH=/usr/sbin:/sbin:/usr/bin:/bin procdK_J_V= name script instances procdJ_V_script=/etc/rc.d/S66node_red NODE_RED_HOME=/usr/lib/node_modules/node_red procdK_J_T1= PWD=/ procdT_J_V_name=string```
Did you manually create the /home/pi folder or did you create a user called pi?
You are correct. I created /home/pi/Downloads/ directory manually. I normally use Raspberry Pi to install Nodered using bash script and I have old flows which already have nodes directing to files behind /home/pi/Downloads/. I therefore decided to mkdir /home/pi/Downloads/ so I do not have to change all my nodes on the flow for this particular Non-Raspberry Pi Gateway. This gateway uses OpenWRT as OS did not have /home/pi directory. I think this one does not have any other user other than root, but I am not sure about it and do not know how to check it. I always end up on the root when I login SSH.
Well I'm completely mystified. There seems to be no environment set up when you are logged in as root.
ls -l env_cli gives no output, not even an error message.
But there is an environment within Node-Red and it doesn't include PYTHONPATH.
However it does all show that the process run by exec is root.
Maybe your enquiries in the openwrt forum will be more fruitful.
When I separate the two commands at the colon then ls -l env_cli
-rw-r--r-- 1 root root 474 Sep 14 19:41 env_cli
Yes I have put the same query on OpenWRT forum in parallel and it is in a similar situation. Have not reached a solution.
I found files on the system after executing the command
A) File env_cli
SSH_CLIENT=192.168.1.104 53185 22 USER=root LD_LIBRARY_PATH=/usr/python/lib:/usr/lib:/usr/lib/iptables SHLVL=2 OLDPWD=/root TERMINFO=/etc/terminfo HOME=/ SSH_TTY=/dev/pts/0 PS1=\[\e]0;\u@\h: \w\a\]\u@\h:\w\$ LOGNAME=root TERM=linux PATH=/usr/sbin:/sbin:/usr/bin:/bin PYTHONUSERBASE=/usr/pyuser/app SHELL=/bin/ash PYTHONHOME=/usr/python PWD=/ SSH_CONNECTION=192.168.1.104 53185 192.168.1.115 22 PYTHONPATH=/usr/python/lib:/usr/python/lib/stdlib:/usr/python/lib/python27.zip
procdT_J_V_instances=object SHLVL=2 HOME=/ procdJSON_CUR=J_T1 PYTHONUNBUFFERED=1 procdT_J_V_script=string NTBA_FIX_319=1 procdJ_V_name=node_red TERM=linux procdJ_V_instances=J_T1 PATH=/usr/sbin:/sbin:/usr/bin:/bin procdK_J_V= name script instances procdJ_V_script=/etc/rc.d/S66node_red NODE_RED_HOME=/usr/lib/node_modules/node_red procdK_J_T1= PWD=/ procdT_J_V_name=string
Do these reveal anything? libraries? path? etc
Possibly setting all the python related env vars in the node-red startup script (or setting them when you call the python command) would fix it.
Alternative approaches are
- Change the python code into a continuously running service that you pass data to/from node-red using, for example, MQTT.
- Implement the python code directly in node-red. Is it doing anything complex?
Bingo, path to
LD_LIBRARY_PATH needed to be added to the OpenWRT node_red daemon. Upon stop and start, the exec node command worked perfectly.
BTW, on another note, I also tried the below method on Raspberry Pi Buster OS as an alternative:
with the help of flow on the link
https://flows.nodered.org/flow/778859ca2503db35ff0e12341508efef/in/vL27qorhYRSn and created virtual python env in a directory of my choice. It worked, this is for the benefit of the future readers. Readers to care in particular about inserting the absolute path of the directory of their choice in all the example nodes and .sh files on the given flow. Hurray