mirror of
https://github.com/uhi22/pyPLC.git
synced 2024-11-20 01:13:58 +00:00
183 lines
5.4 KiB
Python
Executable file
183 lines
5.4 KiB
Python
Executable file
#!/usr/bin/python3
|
|
# The non-GUI variant of the listener
|
|
|
|
# Functionality:
|
|
# - gets the GPS location from a GPS daemon (gpsd on linux)
|
|
# - gets the chargers MAC address from the address manager
|
|
# - sends the location and the chargers MAC to a server via http request
|
|
|
|
import time
|
|
import pyPlcWorker
|
|
from pyPlcModes import *
|
|
import sys # for argv
|
|
from configmodule import getConfigValue, getConfigValueBool
|
|
import urllib.request
|
|
import gps # the gpsd interface module
|
|
import RPi.GPIO as GPIO # for controlling hardware pins of the raspberry
|
|
|
|
startTime_ms = round(time.time()*1000)
|
|
GPSsession = gps.gps(mode=gps.WATCH_ENABLE)
|
|
strGpsPos = "no_pos"
|
|
strLoggingUrl = getConfigValue("logging_url")
|
|
|
|
def cbAddToTrace(s):
|
|
currentTime_ms = round(time.time()*1000)
|
|
dT_ms = currentTime_ms - startTime_ms
|
|
print("[" + str(dT_ms) + "ms] " + s)
|
|
|
|
def cbShowStatus(s, selection=""):
|
|
pass
|
|
|
|
def testBlockingBeep(patternselection):
|
|
if (patternselection==1):
|
|
# The "MAC Found" beep
|
|
p.ChangeDutyCycle(30)
|
|
p.ChangeFrequency(1100)
|
|
time.sleep(0.3)
|
|
p.ChangeFrequency(1300)
|
|
time.sleep(0.3)
|
|
p.ChangeFrequency(1500)
|
|
time.sleep(0.3)
|
|
p.ChangeDutyCycle(0)
|
|
if (patternselection==2):
|
|
# The short "ok" beep
|
|
p.ChangeDutyCycle(10)
|
|
p.ChangeFrequency(1600)
|
|
time.sleep(0.07)
|
|
p.ChangeDutyCycle(0)
|
|
if (patternselection==3):
|
|
# The "no GPS position" beep
|
|
print("no pos beep 4")
|
|
p.ChangeDutyCycle(10)
|
|
p.ChangeFrequency(1700)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(0)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(10)
|
|
p.ChangeFrequency(1700)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(0)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(10)
|
|
p.ChangeFrequency(1700)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(0)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(10)
|
|
p.ChangeFrequency(1700)
|
|
time.sleep(0.04)
|
|
p.ChangeDutyCycle(0)
|
|
|
|
def trySomeHttp():
|
|
print("***************trying some http********************")
|
|
strChargerMac = "chargerMac=na"
|
|
if (worker.addressManager.isEvseMacNew()):
|
|
testBlockingBeep(1)
|
|
strChargerMac = "chargerMac=" + worker.addressManager.getEvseMacAsStringAndClearUpdateFlag().replace(":", "")
|
|
strParams = strChargerMac
|
|
strParams = strParams + "&loops="+str(nMainloops)+"&pos="+strGpsPos
|
|
print(strParams)
|
|
try:
|
|
contents = urllib.request.urlopen(strLoggingUrl + "?" + strParams).read()
|
|
print(len(strGpsPos))
|
|
if (len(strGpsPos)>7):
|
|
print("Valid GPS coordinates, and http logging worked")
|
|
#testBlockingBeep(2)
|
|
else:
|
|
print("http was ok, but no GPS position")
|
|
#testBlockingBeep(3)
|
|
except Exception as err:
|
|
contents = "(no contents received) " + str(err)
|
|
print(contents)
|
|
|
|
def GpsMainfunction():
|
|
global strGpsPos
|
|
GPSsession.read()
|
|
if (gps.MODE_SET & GPSsession.valid):
|
|
print('Mode: %s(%d) Time: ' %
|
|
(("Invalid", "NO_FIX", "2D", "3D")[GPSsession.fix.mode],
|
|
GPSsession.fix.mode), end="")
|
|
# print time, if we have it
|
|
if gps.TIME_SET & GPSsession.valid:
|
|
print(GPSsession.fix.time, end="")
|
|
else:
|
|
print('n/a', end="")
|
|
|
|
if ((gps.isfinite(GPSsession.fix.latitude) and
|
|
gps.isfinite(GPSsession.fix.longitude))):
|
|
print(" Lat %.6f Lon %.6f" %
|
|
(GPSsession.fix.latitude, GPSsession.fix.longitude))
|
|
strGpsPos = str(GPSsession.fix.latitude)+"_"+str(GPSsession.fix.longitude)
|
|
else:
|
|
print(" Lat n/a Lon n/a")
|
|
strGpsPos = str(0.0)+"_"+str(0.0)
|
|
print(strGpsPos)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def mytestfunction():
|
|
global soundstate
|
|
#testBlockingBeep(2)
|
|
#if (soundstate==0):
|
|
# p.ChangeDutyCycle(10)
|
|
# p.ChangeFrequency(1000)
|
|
#if (soundstate==1):
|
|
# p.ChangeDutyCycle(10)
|
|
# p.ChangeFrequency(1200)
|
|
#if (soundstate==2):
|
|
# p.ChangeDutyCycle(0)
|
|
#soundstate+=1
|
|
#if (soundstate>=3):
|
|
# soundstate=0
|
|
|
|
|
|
myMode = C_LISTEN_MODE
|
|
|
|
|
|
isSimulationMode=0
|
|
if (len(sys.argv) > 1):
|
|
if (sys.argv[1] == "S"):
|
|
isSimulationMode=1
|
|
|
|
print("starting in LISTEN_MODE")
|
|
print("press Ctrl-C to exit")
|
|
|
|
worker=pyPlcWorker.pyPlcWorker(cbAddToTrace, cbShowStatus, myMode, isSimulationMode)
|
|
|
|
nMainloops=0
|
|
httpTime_ms = round(time.time()*1000)
|
|
testTime_ms = httpTime_ms
|
|
#intervalForHttpLogging_ms = 120*1000 # each 2 minutes send the logging data to the server
|
|
intervalForHttpLogging_ms = 30*1000 # each half minute send the logging data to the server
|
|
|
|
soundstate = 0
|
|
GPIO.setmode(GPIO.BCM)
|
|
GPIO.setup(23, GPIO.OUT)
|
|
p=GPIO.PWM(23, 500) # 500 Hz
|
|
p.start(0)
|
|
p.ChangeDutyCycle(50)
|
|
time.sleep(0.1)
|
|
p.ChangeDutyCycle(0)
|
|
time.sleep(0.1)
|
|
p.ChangeDutyCycle(50)
|
|
time.sleep(0.1)
|
|
p.ChangeDutyCycle(0)
|
|
|
|
|
|
while (1):
|
|
time.sleep(.03) # 'do some calculation'
|
|
nMainloops+=1
|
|
currentTime_ms = round(time.time()*1000)
|
|
if ((currentTime_ms-httpTime_ms)>intervalForHttpLogging_ms) or (worker.addressManager.isEvseMacNew()):
|
|
trySomeHttp()
|
|
httpTime_ms = currentTime_ms
|
|
if ((currentTime_ms-testTime_ms)>2000):
|
|
mytestfunction()
|
|
testTime_ms = currentTime_ms
|
|
worker.mainfunction()
|
|
GpsMainfunction()
|
|
|
|
#---------------------------------------------------------------
|