def rebootPi(why): pclogging.systemlog(config.INFO, "Pi Rebooting: %s" % why) if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate("Pi Rebooting: %s" % why) pclogging.systemlog(config.INFO, "Pi Rebooting: %s" % why) os.system("sudo shutdown -r now")
def returnStatusLine(device, state): returnString = device if (state == True): returnString = returnString + ": \t\tPresent" else: returnString = returnString + ": \t\tNot Present" if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate("Device:"+returnString) return returnString
def waterPlant(plantNumber): # We want to put off this state if Update State is .is locked. That will prevent Update State from being hosed by this state machine if (config.DEBUG): print "WP-Attempt Aquire" UpdateStateLock.acquire() if (config.DEBUG): print "WP-UpdateStateLock acquired" previousState = state.SGS_State #if(state.SGS_State == state.SGS_States.Monitor): state.SGS_State = state.SGS_States.Watering if (config.USEPUBNUB): publishStatusToPubNub() if (config.USEBLYNK): updateBlynk.blynkStatusUpdate() if ((state.Tank_Percentage_Full > config.Tank_Pump_Level) or (state.Plant_Water_Request == True)): pumpWater(2.0, plantNumber) state.Last_Event = "Plant #{:d} Watered at: ".format( plantNumber) + time.strftime("%Y-%m-%d %H:%M:%S") if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate( time.strftime("%Y-%m-%d %H:%M:%S") + ": Plant #{:d} Watered".format(plantNumber) + "\n") else: if (config.DEBUG): print "Plant #{:d} pumpWater overruled - Tank Empty".format( plantNumber) if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate( time.strftime("%Y-%m-%d %H:%M:%S") + ": Plant #{:d} pumpWater overruled - Tank Empty".format( plantNumber) + "\n") state.Last_Event = "NW-Tank Empty at: " + time.strftime( "%Y-%m-%d %H:%M:%S") if (config.USEBLYNK): updateBlynk.blynkEventUpdate() state.SGS_State = previousState if (config.USEPUBNUB): publishStatusToPubNub() if (config.USEBLYNK): updateBlynk.blynkStatusUpdate() if (config.DEBUG): print "WP-Attempt released" UpdateStateLock.release() if (config.DEBUG): print "WP-UpdateStateLock released"
def forceWaterPlantCheck(): if ((state.Plant_Water_Request == True) and (state.Plant_Number_Water_Request > 0)): # now check for forced watering if (state.Plant_Number_Water_Request > config.plant_number): print "Non-existent Plant {:d} Water from Button Ignored".format( state.Plant_Number_Water_Request) updateBlynk.blynkTerminalUpdate( time.strftime("%Y-%m-%d %H:%M:%S") + ": Plant #{:d} Force Ignored".format( state.Plant_Number_Water_Request) + "\n") state.Plant_Number_Water_Request = -1 updateBlynk.blynkResetButton("V41") state.Plant_Water_Request = False return if (config.DEBUG): print ">>>>>>>>>>>>>>" print "Entering Force Water" print ">>>>>>>>>>>>>>" print "FW-Attempt UpdateStateLock acquired" UpdateStateLock.acquire() if (config.DEBUG): print "FW-UpdateStateLock acquired" PlantNumber = state.Plant_Number_Water_Request if (config.DEBUG): print "<<<<<<<<>>>>>>>" print "Force Plant {:d} Water from Button ".format(PlantNumber) print "<<<<<<<<>>>>>>>" forceWaterPlant(PlantNumber) state.Plant_Number_Water_Request = -1 updateBlynk.blynkResetButton("V41") state.Plant_Water_Request = False # now reset water information if (config.DEBUG): print "FW-Attempt UpdateStateLock released" UpdateStateLock.release() if (config.DEBUG): print "FW-UpdateStateLock released" print ">>>>>>>>>>>>>>" print "Exiting Force Water" print ">>>>>>>>>>>>>>"
def forceWaterPlant(plantNumber): previousState = state.SGS_State; #if(state.SGS_State == state.SGS_States.Monitor): state.SGS_State =state.SGS_States.Watering if (config.USEPUBNUB): publishStatusToPubNub() if (config.USEBLYNK): updateBlynk.blynkStatusUpdate() pumpWater(2.0, plantNumber) state.Last_Event = "Plant #{:d} Force Watered at: ".format(plantNumber)+time.strftime("%Y-%m-%d %H:%M:%S") if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate(time.strftime("%Y-%m-%d %H:%M:%S")+": Plant #{:d} Force Watered".format(plantNumber)+"\n") updateBlynk.blynkEventUpdate() state.SGS_State = previousState if (config.USEPUBNUB): publishStatusToPubNub() if (config.USEBLYNK): updateBlynk.blynkStatusUpdate()
def systemlog(level, message): if (config.enable_MySQL_Logging == True): LOWESTDEBUG = 0 # open mysql database # write log # commit # close if (level >= LOWESTDEBUG): try: if (level == config.JSON): if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate("JSON Loaded") pass else: if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate(message) pass #print("trying database") con = mdb.connect('localhost', 'root', config.MySQL_Password, 'SkyWeather2') cur = con.cursor() #print("before query") query = "INSERT INTO SystemLog(TimeStamp, Level, SystemText ) VALUES(LOCALTIMESTAMP(), %i, '%s')" % ( level, message) #print("query=%s" % query) cur.execute(query) con.commit() except: traceback.print_exc() con.rollback() #sys.exit(1) finally: cur.close() con.close() del cur del con
def initializeSGSPart2(): # status reports print("----------------------") print("Local Devices") print("----------------------") print(returnStatusLine("OLED",config.OLED_Present)) print(returnStatusLine("BMP280",config.BMP280_Present)) print(returnStatusLine("DustSensor",config.DustSensor_Present)) #print(returnStatusLine("Sunlight Sensor",config.Sunlight_Present)) #print(returnStatusLine("hdc1000 Sensor",config.hdc1000_Present)) #print(returnStatusLine("Ultrasonic Level Sensor",config.UltrasonicLevel_Present)) print("----------------------") print("Checking Wireless SGS Devices") print("----------------------") scanForResources.updateDeviceStatus(True) # turn off All Valves AccessValves.turnOffAllValves() wirelessJSON = readJSON.getJSONValue("WirelessDeviceJSON") for single in wirelessJSON: print(returnStatusLine(str(single["name"])+" - "+str(single["id"]),state.deviceStatus[str(single["id"])])) # Set up Wireless MQTT Links MQTTFunctions.startWirelessMQTTClient() # subscribe to IDs if (len(wirelessJSON) == 0): print("################################") print("ERROR") print("################################") print("No Wireless SGS uinits present - run SGSConfigure.py") print("################################") exit() # wait for connection while state.WirelessMQTTClientConnected != True: #Wait for connection time.sleep(0.1) # subscribe to IDs for single in wirelessJSON: topic = "SGS/" + single["id"] print("subscribing to ", topic) state.WirelessMQTTClient.subscribe(topic) # write out to ValveChanges for startup myJSON = {} myJSON["id"] = single["id"] myJSON["valvestate"] = "V00000000" pclogging.writeMQTTValveChangeRecord(myJSON) print() print() print("----------------------") print("Plant / Sensor Counts") print("----------------------") config.moisture_sensor_count = len(readJSON.getJSONValue("WirelessDeviceJSON"))*4 config.valve_count = len(readJSON.getJSONValue("WirelessDeviceJSON"))*8 print( "Wireless Unit Count:", len(readJSON.getJSONValue("WirelessDeviceJSON")) ) print("Sensor Count: ",config.moisture_sensor_count) print("Valve Count: ",config.valve_count) print() if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate( "Wireless Unit Count:%d"% len(readJSON.getJSONValue("WirelessDeviceJSON")) ) updateBlynk.blynkTerminalUpdate("Sensor Count: %d"%config.moisture_sensor_count) updateBlynk.blynkTerminalUpdate("Pump Count: %d"%config.valve_count) updateBlynk.updateStaticBlynk() print("----------------------") print("Other Smart Garden System Expansions") print("----------------------") print(returnStatusLine("Weather",config.Weather_Present)) print(returnStatusLine("GardenCam",config.GardenCam_Present)) print(returnStatusLine("SunAirPlus",config.SunAirPlus_Present)) print(returnStatusLine("SolarMAX",config.SunAirPlus_Present)) print(returnStatusLine("Lightning Mode",config.Lightning_Mode)) print(returnStatusLine("MySQL Logging Mode",config.enable_MySQL_Logging)) print(returnStatusLine("UseBlynk",config.USEBLYNK)) print() print("----------------------") #Establish WeatherSTEMHash if (config.USEWEATHERSTEM == True): state.WeatherSTEMHash = SkyCamera.SkyWeatherKeyGeneration(config.STATIONKEY)
print(util.returnStatusLine("Check WLAN", config.enable_WLAN_Detection)) print( util.returnStatusLine("WeatherUnderground", config.WeatherUnderground_Present)) print(util.returnStatusLine("UseWeatherStem", config.USEWEATHERSTEM)) print("----------------------") # startup pclogging.systemlog(config.INFO, "SkyWeather2 Startup Version " + config.SWVERSION) if (config.USEBLYNK): updateBlynk.blynkEventUpdate("SW Startup Version " + config.SWVERSION) updateBlynk.blynkTerminalUpdate("SW Startup Version " + config.SWVERSION) subjectText = "The " + config.STATIONKEY + " SkyWeather2 Raspberry Pi has #rebooted." ipAddress = subprocess.check_output(['hostname', '-I']) bodyText = "SkyWeather2 Version " + config.SWVERSION + " Startup \n" + ipAddress.decode( ) + "\n" if (config.SunAirPlus_Present): sampleSunAirPlus() bodyText = bodyText + "\n" + "BV=%0.2fV/BC=%0.2fmA/SV=%0.2fV/SC=%0.2fmA" % ( batteryVoltage, batteryCurrent, solarVoltage, solarCurrent) sendemail.sendEmail("test", bodyText, subjectText, config.notifyAddress, config.fromAddress, "") if (config.USEBLYNK): updateBlynk.blynkInit()
############################# # main program ############################# # Main Program if __name__ == '__main__': print "" print "SGS Version "+SGSVERSION+" - SwitchDoc Labs" print "" print "Program Started at:"+ time.strftime("%Y-%m-%d %H:%M:%S") print "" if (config.USEBLYNK): updateBlynk.blynkTerminalUpdate(time.strftime("%Y-%m-%d %H:%M:%S")+": SGS Program Started"+ "\n") updateBlynk.blynkTerminalUpdate( "SGS Version "+SGSVERSION+" - SwitchDoc Labs"+"\n") print returnStatusLine("ADS1115",config.ADS1115_Present) print returnStatusLine("OLED",config.OLED_Present) print returnStatusLine("Sunlight Sensor",config.Sunlight_Present) print returnStatusLine("hdc1000 Sensor",config.hdc1000_Present) print returnStatusLine("Ultrasonic Level Sensor",config.UltrasonicLevel_Present) print print "----------------------" print "Plant / Sensor Counts" print "----------------------" print "Sensor Count: ",config.moisture_sensor_count print "Pump Count: ",config.USB_pump_count print if (config.USEBLYNK):
print(util.returnStatusLine("Check WLAN", config.enable_WLAN_Detection)) print( util.returnStatusLine("WeatherUnderground", config.WeatherUnderground_Present)) print(util.returnStatusLine("UseWeatherStem", config.USEWEATHERSTEM)) print("----------------------") # startup pclogging.systemlog(config.INFO, "SkyWeather2 Startup Version " + config.SWVERSION) if (config.USEBLYNK): updateBlynk.blynkEventUpdate("SW Startup Version " + config.SWVERSION) updateBlynk.blynkTerminalUpdate("SW Startup Version " + config.SWVERSION) subjectText = "The " + config.STATIONKEY + " SkyWeather2 Raspberry Pi has #rebooted." ipAddress = subprocess.check_output(['hostname', '-I']) if (config.USEBLYNK): updateBlynk.blynkEventUpdate("IPAddress: " + ipAddress.decode()) updateBlynk.blynkTerminalUpdate("IPAddress: " + ipAddress.decode()) bodyText = "SkyWeather2 Version " + config.SWVERSION + " Startup \n" + ipAddress.decode( ) + "\n" if (config.SunAirPlus_Present): sampleSunAirPlus() bodyText = bodyText + "\n" + "BV=%0.2fV/BC=%0.2fmA/SV=%0.2fV/SC=%0.2fmA" % ( state.batteryVoltage, state.batteryCurrent, state.solarVoltage, state.solarCurrent)