Hello everybody,
i like to execute a phyton script and read back the out put in a variable. Can someone help me how to do this?
thanks
[Solved] Need help for executing phyton script with read back
Hello everybody,
i like to execute a phyton script and read back the out put in a variable. Can someone help me how to do this?
thanks
def pimaticAPI (pserver, pcmd, pVariable, pValue):
global pReturnValue
rcode=0
if pcmd == ‘read’:
try:
pReturnValue = subprocess.check_output([’/home/pi/rpimatic.sh’, pserver, ‘read’, pVariable])
except subprocess.CalledProcessError as e:
rcode = e.returncode # Return code
if rcode != 0:
pvalue = ""
elif pcmd == ‘write’:
rcode = subprocess.call([’/home/pi/rpimatic.sh’, pserver, ‘write’, pVariable, pValue])
return rcode
I’ve already a phyton script which read out the sensor value and it writes on the console the value 1031hPa. Now I like to execude it regularly like every 20 minutes and read back this value
How do i do this?
Hi, I’ve to apologise but my daughter disturbed me and I hit a wrong button on my keyboard so you received a incomplete post.
Please wait a few minutes and I send you a post with a solution I used to send values from a python script to a variable in pimatic.
Hi temp, I use the following bash script to read/write values to pimatic variables from outside of pimatic. The script can be run from a shell command line or executed by a python script or other languages as s system call. The addressed pimatic server can run locally or on a remote pi. If you would like to address a variable on a remote pi, you need to configure relevant remote parameters in a file called ‘server.host’ in the home directory of user pi. Please study the script, I have included several comments explaining the way how to access a remote pimatic system.
Script to read/write a value to a pimatic varaiable or to execute a pimatic action from a shell command line:
rpimatic.sh pimaticServer read|write|action pimaticVariable [pimaticValue] # [] - on write request
#!/bin/bash
#
# bash interface to read/write values to pimatic or to execute an action
#
# rpimatic.sh pimaticServer read|write|action pimaticVariable [pimaticValue] [] - set on write
#
# 04.12.2015 by Mr.Sponti
#-----------------------------------------------------------------------------------------
#
export DEBUG="true" # set on "true" for verbose mode
#
. /home/pi/pimaticAPI.sh
#
# get runstring parameter
#
pimatic_server=$1
pimatic_cmd=$2
pimatic_var_name=$3
#
# process the desired command
#
case $pimatic_cmd in
read) read_from_pimatic $pimatic_var_name
printf "%s" "$pimatic_var_value"
if [ $pimatic_var_value = "ERROR" ]
then
exit 1
fi
;;
write) pimatic_var_value="$4"
write_to_pimatic ${pimatic_var_name} "${pimatic_var_value}"
exit $?
;;
action) post_action_to_pimatic "${pimatic_var_name}"
exit $?
;;
*) echo "usage: $0 host read|write VariableName [VariableValue]"
echo
echo " [] - set on write"
echo " host - reference to optional file 'server.host' in pi home directory!"
echo
echo "Use file'server.host' to define pimatic remote access data."
echo "If file not exist, local config.json will be used to get pimatic access data."
echo
echo "Examples:"
echo " rpimatic.sh local write TESTVAR 20"
echo " -> no file 'server.local' -> local config.json is read to get access data"
echo
echo " rpimatic.sh PI002 read TESTVAR"
echo " -> file 'server.PI002' exist -> file is used to get remote access data"
exit 1
The rpimatic.sh script use ‘curl’ as the interface to pimatic. The respective curl commands are embedded in shell functions which are sourced at the beginning of the script. The shell script including these functions is named ‘pimaticAPI.sh’:
export LANG=de_DE.UTF-8
export PIMATIC_HOME="/home/pi"
export PIMATIC_CONFIG_FILE="${PIMATIC_HOME}/pimatic-app/config.json"
export PIMATIC_HOST
export PIMATIC_PORT
export PIMATIC_USER=admin
export PIMATIC_PWD
export pimatic_server
export pimatic_var_value
function get_pimatic_server_data() {
#------------------------------------------------------------------------------
# get host and login data to access pimatic server
#
# for local pimatic access, config.json is read to get account data
# for remote access, create a file 'server.host' in PIMATIC_HOME, where host is the 'hostname' of the pimatic server
# and include the host access parameter to login to pimatic server --> explore 'server.example'
#
PIMATIC_SERVER_FILE="${PIMATIC_HOME}/server.${pimatic_server}"
#
# check if a server file exist, otherwise use local hostname and config.json
#
if [ -e "$PIMATIC_SERVER_FILE" ]
then
. $PIMATIC_SERVER_FILE
else
PIMATIC_HOST=$(hostname)
PIMATIC_PWD=$(grep -B 2 -A 2 -w "\"role\": \"admin\"" $PIMATIC_CONFIG_FILE | grep -w "password" | awk 'BEGIN{FS="\"";} {print $4;}')
PIMATIC_PORT=$(grep -B 2 -A 2 -w "\"httpServer\"" $PIMATIC_CONFIG_FILE | grep "\"port\"" | awk '{print $2}')
fi
#-----DEBUG---------------------------
if [ "$DEBUG" = "true" ]
then
echo "PIMATIC_HOST=$PIMATIC_HOST"
echo "PIMATIC_PORT=$PIMATIC_PORT"
echo "PIMATIC_USER=$PIMATIC_USER"
echo "PIMATIC_PWD=$PIMATIC_PWD"
fi
#-------------------------------------
}
function write_to_pimatic() {
#--------------------------------------
# write value trough pimatic variabale
#
pimatic_var=$1
pimatic_var_value=$2
get_pimatic_server_data
#-----DEBUG---------------------------
if [ "$DEBUG" = "true" ]
then
echo ">>>> curl start >>>>"
echo "curl --insecure -X PATCH --header \"Content-Type:application/json\" --data '{\"type\": \"value\", \"valueOrExpression\": '\"${pimatic_var_value}\"'}' --user \"${PIMATIC_USER}:${PIMATIC_PWD}\" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var"
echo "<<<< curl end <<<<"
curl --insecure -X PATCH --header "Content-Type:application/json" --data '{"type": "value", "valueOrExpression": '"${pimatic_var_value}"'}' --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var
#---------------------------------
else
get=$(curl --insecure -X PATCH --header "Content-Type:application/json" --data '{"type": "value", "valueOrExpression": '"${pimatic_var_value}"'}' --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var 2>/dev/null)
success=$(echo $get | grep "\"success\"" | awk '{print $16;}')
if [ "$success" = "true" ]
then
return 0
else
return 1
fi
fi
}
function read_from_pimatic() {
#----------------------------------
# read value from pimatic variable
#
pimatic_var=$1
get_pimatic_server_data
#-----DEBUG---------------------------
if [ "$DEBUG" = "true" ]
then
echo ">>>> curl start >>>>"
echo "curl --insecure -X GET --user \"${PIMATIC_USER}:${PIMATIC_PWD}\" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var"
echo "<<<< curl end <<<<"
get=$(curl --insecure -X GET --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var)
echo $get
success=$(echo $get | grep "\"success\"" | awk '{print $16;}')
echo "success = $success"
pimatic_var_value=$(echo $get | grep "\"value\"" | awk 'BEGIN{FS=",";} {print $4;}' | awk 'BEGIN{FS=":";} {print $2;}')
echo "pimatic_var_value = $pimatic_var_value"
#---------------------------------
else
get=$(curl --insecure -X GET --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/variables/$pimatic_var 2>/dev/null)
success=$(echo $get | grep "\"success\"" | awk '{print $16;}')
if [ "$success" = "true" ]
then
pimatic_var_value=$(echo $get | grep "\"value\"" | awk 'BEGIN{FS=",";} {print $4;}' | awk 'BEGIN{FS=":";} {print $2;}')
return 0
else
pimatic_var_value="ERROR"
return 1
fi
fi
}
function post_action_to_pimatic() {
#-------------------------------------
# post action request trough pimatic
#
pimatic_action="\"${1}\""
get_pimatic_server_data
##-----DEBUG---------------------------
if [ "$DEBUG" = "true" ]
then
echo ${pimatic_action}
echo ">>>> curl start >>>>"
curl --insecure -X POST --header "Content-Type:application/json" --data '{"actionString":'"${pimatic_action}"} --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/execute-action
echo "<<<< curl end <<<<"
#---------------------------------
else
curl --insecure -X POST --header "Content-Type:application/json" --data '{"actionString":'"${pimatic_action}"} --user "${PIMATIC_USER}:${PIMATIC_PWD}" http://$PIMATIC_HOST:$PIMATIC_PORT/api/execute-action >/dev/null 2>&1
return $?
fi
}
In case you need to send a request to a remote pimatic server you need to configure a file named ‘server.host’ in pi’s home directory:
example of a server.host file: server.mypimaticserver
#
# data for authentification to a remote pimatic server
#
#
PIMATIC_HOST=mypimaticserver
PIMATIC_PORT=80
PIMATIC_USER=admin
PIMATIC_PWD=xxxxxxxx
In python you can use the following code to execute ‘rpimatic.sh’
pServer = 'mypimaticserver'
pVariable = 'MYPIMATICVARIABLE'
pValue = 'myvalue'
.
.
rcode = pimaticAPI ( pServer, 'write', pVariable, pValue)
.
.
def pimaticAPI (pserver, pcmd, pVariable, pValue):
global pReturnValue
rcode=0
if pcmd == 'read':
try:
pReturnValue = subprocess.check_output(['/home/pi/rpimatic.sh', pserver, 'read', pVariable])
except subprocess.CalledProcessError as e:
rcode = e.returncode # Return code
if rcode != 0:
pvalue = ""
elif pcmd == 'write':
rcode = subprocess.call(['/home/pi/rpimatic.sh', pserver, 'write', pVariable, pValue])
return rcode
To use the script you need to place the bash scripts in user pi’s home directory ‘/home/pi’. Make the scripts executable and test ‘rpimatic.sh’ by writing and reading to a variable in pimatic. If this is working execute the rpimatic script from your python script.
That solution works fine for me and is one possible (old fashion) way to read/write values from outside to a pimatic server.
Have fun and good luck!
@temp said:
d out the sensor value and it writes on the console the value 1031hPa. Now I like to execude it regularly like every 20 minutes and read back this value
To execute your python script every 20 minutes you can define a pimatic rule:
if every 20 minutes then execute “/home/pi/mypythonscript.py”
To execute your python script every 20 minutes you can define a pimatic rule:
if every 20 minutes then execute “/home/pi/mypythonscript.py”
Or you can use the interval
property of e.g. a ShellSensor which executes your script.
pimatic-google-calendar | pimatic-wmi | pimatic-snmp | pimatic-wakeonlan |
Like my work? Then consider a donation
Follow me: www.thorstenreichelt.de
or us a cronjob maybe
pimatic v0.9 has been released!
Support Pimatic and get some free stickers
Like us on Facebook
make it so !
Why it isn’t corect like this??
{
“id”: “temperature”,
“name”: “temperature”,
“class”: “ShellSensor”,
“interval”: 30,
“command”: “./bmp085.py”
},
@temp
Which error do you get?
pimatic-google-calendar | pimatic-wmi | pimatic-snmp | pimatic-wakeonlan |
Like my work? Then consider a donation
Follow me: www.thorstenreichelt.de
error [pimatic]: Error loading device temperature: Cannot call method ‘toUpperCase’ of undefined
Any idea?
@temp Well, if the “toUpperCase” statement is in one of your .py scripts… try string.upper()
see here for more info:
http://www.tutorialspoint.com/python/string_upper.htm
@Hubald-Alberti I don’t use it somewhere
#!/usr/bin/python
from CLASS_BMP085 import BMP085
# ===========================================================================
# Example Code
# ===========================================================================
# Initialise the BMP085 and use STANDARD mode (default value)
# bmp = BMP085(0x77, debug=True)
bmp = BMP085(0x77)
# To specify a different operating mode, uncomment one of the following:
# bmp = BMP085(0x77, 0) # ULTRALOWPOWER Mode
# bmp = BMP085(0x77, 1) # STANDARD Mode
# bmp = BMP085(0x77, 2) # HIRES Mode
# bmp = BMP085(0x77, 3) # ULTRAHIRES Mode
temp = bmp.readTemperature()
# Read the current barometric pressure level
pressure = bmp.readPressure()
# To calculate altitude based on an estimated mean sea level pressure
# (1013.25 hPa) call the function as follows, but this won't be very accurate
#altitude = bmp.readAltitude()
altitude = 429
psea = pressure / pow(1.0 - altitude/44330.0, 5.255)
# To specify a more accurate altitude, enter the correct mean sea level
# pressure level. For example, if the current pressure level is 1023.50 hPa
# enter 102350 since we include two decimal places in the integer value
# altitude = bmp.readAltitude(102350)
#print "Temperature: %.2f C" % temp
#print "Pressure absolute: %.2f hPa" % (pressure / 100.0)
#print "Altitude: %.2f" % altitude
print "Pressure at sea level: %8.2f hPa" % (psea / 100.0)
Also not used in I2c_CLASS or BMP085_CLASS
@temp Well, than it’s way out of my league! Looks like it’s a Java statement of sorts, no idea where it’s used…
Solved I had a wrong syntax in the device section