def on_message(client, msg): """Callback when MQTT message is received.""" try: values = json.loads(msg.payload) except ValueError as e: print(u"MQTT Values could not decode command: ", msg.payload, e) return # Rain Delay if 'rd' in values: gv.sd['rd'] = float(values['rd']) gv.sd['rdst'] = gv.now + gv.sd[ 'rd'] * 3600 + 1 # +1 adds a smidge just so after a round trip the display hasn't already counted down by a minute. if float(gv.sd['rd']) > .0: stop_onrain() report_value_change() # Water level if 'wl' in values: gv.sd['wl'] = float(values['wl']) report_value_change() # Manual mode if 'mm' in values: gv.sd['mm'] = int(values['mm']) report_value_change() # Enable if 'en' in values: gv.sd['en'] = int(values['en']) report_value_change() # Reset (stop) all stations if 'rsn' in values: gv.sd['rsn'] = int(values['rsn']) stop_stations() report_value_change() return
def set_manual_mode(self): lcd = self._lcd lcd.lcd_clear() lcd.lcd_puts('{:^15}'.format("Activar Bomba Manualmente?"), 1) lcd.lcd_puts(' SI Cancelar', 2) start_wait = time.time() while ((time.time() - start_wait ) < 10) or \ (self._but2.lastState == OneButton.CLICK and (self._but2.lastChangeTime > start_wait)): # Wait 10 secs or cancel self._but1.tick() self._but2.tick() if self._but1.lastState == OneButton.CLICK and ( self._but1.lastChangeTime > start_wait): self._manual_mode = True lcd.lcd_clear() lcd.lcd_puts('{:^15}'.format("Iniciando Bomba"), 1) lcd.lcd_puts('{:^15}'.format("Manualmente"), 2) time.sleep(2) stop_stations() gv.sd['mm'] = 0 gv.sd['en'] = 0 vals = [0] * len(gv.srvals) vals[gv.sd['mas'] - 1] = 1 # Start Pump gv.srvals = vals set_output() manual_master_start = time.time() # now we wait to cancel with other double press last_update = time.time() while True: time.sleep(TICK_DELAY) self._but1.tick() self._but2.tick() if (time.time() - last_update) > 5: # Keep Forcing the current State! gv.sd['mm'] = 0 gv.sd['en'] = 0 vals = [0] * len(gv.srvals) vals[gv.sd['mas'] - 1] = 1 gv.scontrol.stations = vals run_min = int((time.time() - manual_master_start) / 60) run_sec = int((time.time() - manual_master_start) % 60) lcd.lcd_clear() lcd.lcd_puts('{:^15}'.format("Cancelar Bomba Manual?"), 1) lcd.lcd_puts( ' Cancel - {:^3}:{}'.format(run_min, run_sec), 2) last_update = time.time() if self._but1.lastState == OneButton.CLICK and self._but1.lastChangeTime > manual_master_start: # Cancel Manual Mode lcd.lcd_clear() lcd.lcd_puts('{:^15}'.format("Detentiendo Bomba"), 1) lcd.lcd_puts('{:^15}'.format("Modo Automatico"), 2) time.sleep(3) stop_stations() gv.srvals = [0] * len(gv.srvals) set_output() gv.sd['mm'] = 0 gv.sd['en'] = 1 break
def _botCmd_disable(self, bot, update): chat_id = update.message.chat_id if chat_id in self.currentChats: txt = "{} System <b>OFF</b>".format(gv.sd[u'name']) gv.sd['en'] = 0 # disable system SIP jsave(gv.sd, 'sd') # save en = 0 stop_stations() else: txt = "I'm sorry Dave I'm afraid I can't do that." bot.sendMessage(chat_id, text=txt, parse_mode='HTML')
def chatter(cct): stop_stations() t = 0 for cnt in range(150): t = 1 - t # toggle cct gv.srvals[cct] = t set_output() sleep(0.2) if stop: break # switch everything off stop_stations()
def run(self): time.sleep(randint(3, 10)) # Sleep some time to prevent printing before startup information print "Pressure plugin is active" send = False SUBJ = "Reporting from OSPy" # Subject in email self.add_status('Waiting...') while True: try: datapressure = get_pressure_options() # load data from file if datapressure['press'] != 'off': # if pressure plugin is enabled if (gv.sd['mas'] != 0) and not (gv.sd['mm']): # if is use master station and not manual control if gv.srvals[gv.sd['mas']] != 0: # if master station is ON test = get_check_pressure() if not test: # if sensor is active self._sleep(int(datapressure['time'])) # wait to activated pressure sensor test = get_check_pressure() if not test: # if sensor is current active stop_stations() self.add_status('Pressure sensor is not activated in time -> stops all stations and sends email.') if datapressure['sendeml'] != 'off': # if enabled send email send = True else: # if not used master station self.status = '' self.add_status('Not used master station.') if send: TEXT = ('On ' + time.strftime("%d.%m.%Y at %H:%M:%S", time.localtime( time.time())) + ' System detected error: pressure sensor.') try: from plugins.email_adj import email email(SUBJ, TEXT) # send email without attachments self.add_status('Email was sent: ' + TEXT) send = False except Exception as err: self.add_status('Email was not sent! ' + str(err)) self._sleep(1) except Exception: exc_type, exc_value, exc_traceback = sys.exc_info() err_string = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) self.add_status('Pressure plugin encountered error: ' + err_string) self._sleep(60)
def run(self): time.sleep(randint(3, 10)) # Sleep some time to prevent printing before startup information print "Pressure plugin is active" send = False SUBJ = "Reporting from ospi" # Subject in email self.add_status('Waiting...') while True: try: datapressure = get_pressure_options() # load data from file if datapressure['press'] != 'off': # if pressure plugin is enabled if (gv.sd['mas'] != 0) and not (gv.sd['mm']): # if is use master station and not manual control if gv.srvals[gv.sd['mas']] != 0: # if master station is ON if GPIO.input(pin_pressure) == 0: # if sensor is open self._sleep(int(datapressure['time'])) # wait to activated pressure sensor if GPIO.input(pin_pressure) == 0: # if sensor is current open stop_stations() self.add_status('Pressure sensor is not activated in time -> stops all stations and sends email.') if datapressure['sendeml'] != 'off': # if enabled send email send = True else: # if not used master station self.status = '' self.add_status('Not used master station.') if send: TEXT = ('On ' + time.strftime("%d.%m.%Y at %H:%M:%S", time.localtime( time.time())) + ' System detected error: pressure sensor.') try: from plugins.email_adj import email email(SUBJ, TEXT) # send email without attachments self.add_status('Email was sent: ' + TEXT) send = False except Exception as err: self.add_status('Email was not sent! ' + str(err)) self._sleep(1) except Exception: exc_type, exc_value, exc_traceback = sys.exc_info() err_string = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) self.add_status('Pressure plugin encountered error: ' + err_string) self._sleep(60)
def sms_check(self): """Control and processing SMS""" data = get_sms_options() # Load data from json file tels = data['tels'] comm1 = data['txt1'] comm2 = data['txt2'] comm3 = data['txt3'] comm4 = data['txt4'] comm5 = data['txt5'] comm6 = data['txt6'] comm7 = data['txt7'] sm = gammu.StateMachine() sm.ReadConfig() try: sm.Init() print "Checking SMS..." except: print "Error: SMS modem fault" status = sm.GetSMSStatus() remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed'] sms = [] start = True while remain > 0: if start: cursms = sm.GetNextSMS(Start=True, Folder=0) start = False else: cursms = sm.GetNextSMS(Location=cursms[0]['Location'], Folder=0) remain = remain - len(cursms) sms.append(cursms) data = gammu.LinkSMS(sms) for x in data: v = gammu.DecodeSMS(x) m = x[0] print '%-15s: %s' % ('Sender', m['Number']) print '%-15s: %s' % ('Date', str(m['DateTime'])) print '%-15s: %s' % ('State', m['State']) print '%-15s: %s' % ('SMS command', m['Text']) if m['Number'] in tels: # If telephone in admin lists self.add_status(time.strftime("%d.%m.%Y at %H:%M:%S", time.localtime(time.time())) + ' SMS from admin') if m['State'] == "UnRead": # If SMS is unread if m['Text'].upper().strip() == comm1.upper(): # If command = comm1 (info - send SMS to admin phone1 and phone2) self.add_status('Command ' + comm1 + ' is processed') # Current Status logline = "Status: " if gv.srvals == [0] * len(gv.srvals): logline += "Idle. " elif gv.sd['mm'] == 1: # manual mode logline += "Manual Mode." for sid in range(len(gv.srvals)): if gv.srvals[sid]: if gv.rs[sid][1] == float('inf'): end_time = 'inf' else: end_time = time.strftime('%m-%d %H:%M', time.gmtime(gv.rs[sid][1])) logline += '\n st: ' + str(sid + 1) + ' dur: ' + end_time logline += "\n" else: logline += "Auto Mode." for sid in range(len(gv.srvals)): if gv.srvals[sid]: if gv.rs[sid][1] == float('inf'): end_time = 'inf' else: end_time = time.strftime('%m-%d %H:%M', time.gmtime(gv.rs[sid][1])) logline += '\n st: ' + str(sid + 1 ) + ' dur: ' + end_time logline += "\n" # Last RUN if gv.lrun[1] == 98: pgr = 'Run-once' elif gv.lrun[1] == 99: pgr = 'Manual' else: pgr = str(gv.lrun[1]) start = time.gmtime(gv.now - gv.lrun[2]) if pgr != '0': logline += 'Last RUN: { prg: ' + pgr + ',st: ' + str(gv.lrun[0]) + ',dur: ' + timestr( gv.lrun[2]) + ',start: ' + time.strftime("%H:%M - %m-%d", start) + '}' else: logline += ' Last program none' # revision = ' Rev: ' + gv.ver_date datastr = ('On ' + time.strftime("%d.%m.%Y at %H:%M", time.localtime( time.time())) + '. ' + logline) msgs=[""] idx = 0 for line in datastr.splitlines(): if (len(msgs[idx]) + len(line)) < 140: msgs[idx] += line + "\n" else: msgs[idx] += "{continues....}" idx += 1 msgs.append(line) for txt in msgs: message = { 'Text': txt, 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm1 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) self.add_status('SMS text: ' + datastr) sm.DeleteSMS(m['Folder'], m['Location']) # SMS deleted self.add_status('Received SMS was deleted') self.add_status('Command ' + comm2 + ' is processed') stop_stations() time.sleep(3) gv.sd['en'] = 0 # disable system SIP jsave(gv.sd, 'sd') # save en = 0 message = { 'Text': 'Command: ' + comm2 + ' was processed', 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm2 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted') elif m['Text'].upper().strip() == comm3.upper(): # If command = comm3 (start - system sip on) self.add_status('Command ' + comm3 + ' is processed') gv.sd['en'] = 1 # enable system SIP stop_stations() gv.sd['mm'] = 0 # Put in auto mode jsave(gv.sd, 'sd') # save en = 1 message = { 'Text': 'Command: ' + comm3 + ' was processed', 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm3 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted') elif m['Text'].upper().strip() == comm4.upper(): # If command = comm4 (reboot system) self.add_status('Command ' + comm4 + ' is processed') message = { 'Text': 'Command: ' + comm4 + ' was processed', 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm4 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted and system is now reboot') self._sleep(10) reboot() # restart linux system elif m['Text'].upper().strip() == comm5.upper(): # If command = comm5 (poweroff system) self.add_status('Command ' + comm5 + ' is processed') message = { 'Text': 'Command: ' + comm5 + ' was processed', 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm5 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted and system is now poweroff') self._sleep(10) poweroff() # poweroff linux system elif m['Text'].upper().strip() == comm6.upper(): # If command = comm6 (update sip system) self.add_status('Command ' + comm6 + ' is processed') message = { 'Text': 'Command: ' + comm6 + ' was processed', 'SMSC': {'Location': 1}, 'Number': m['Number'], } sm.SendSMS(message) self.add_status( 'Command: ' + comm6 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) try: from plugins.system_update import perform_update perform_update() self.add_status('Received SMS was deleted, update was performed and program will restart') except ImportError: self.add_status('Received SMS was deleted, but could not perform update') sm.DeleteSMS(m['Folder'], m['Location']) elif m['Text'].strip().split()[0].upper() == comm7.upper(): # If command = comm7 (manual mode) self.add_status('Command ' + comm7 + ' is processed') message = "" command = m['Text'].strip().split()[1].upper() if (gv.sd['en'] == 0 or gv.sd['mm'] == 0 ) and command != "ON": message = { 'Text': 'Command: ' + comm7 + ' cannot continue, enable manual mode first with: ' +comm7+ ' on', 'SMSC': {'Location': 1}, 'Number': m['Number'], } elif command == "ON": # enable manual mode stop_stations() gv.sd['en'] = 1 gv.sd['mm'] = 1 jsave(gv.sd, 'sd') message = { 'Text': 'Command: ' + comm7 + ' manual mode enabled', 'SMSC': {'Location': 1}, 'Number': m['Number'], } else : # check the correct formatting # should be a pair of int separated by comma stations_duration = [0] * len(gv.srvals) try: for c in m['Text'].split()[1:]: station,duration = c.split(',') if not (0 < (int(station) -1) < len(stations_duration)): # out of range raise ValueError("Out of Range station ID") stations_duration[int(station) - 1 ] = int(duration)*60 except ValueError: message = { 'Text': 'Command: ' + comm7 + ' cannot continue, wrong command formatting, should be ' 'station,duration (in minutes)\n Example: ' + comm7 + ' 2,10 3,10', 'SMSC': {'Location': 1}, 'Number': m['Number'], } self.add_status('Command ' + comm7 + ' has formatting errors') if message == "": # logic copied from webpages.get_set_station for sid in range(len(stations_duration)): print "sid: " + str(sid) if sid == gv.sd['mas'] - 1: continue duration = stations_duration[sid] print "duration: " + str(duration) if duration > 0: gv.rs[sid][0] = gv.now # set start time to current time gv.rs[sid][2] = duration gv.rs[sid][1] = gv.rs[sid][0] + duration # stop time = start time + duration gv.rs[sid][3] = 99 # set program index gv.ps[sid][1] = duration gv.sd['bsy'] = 1 elif duration <= 0 and gv.srvals[sid]: # we should stop the running station gv.rs[sid][1] = gv.now time.sleep(1) message = { 'Text': 'Command: ' + comm7 + ' Processed OK ', 'SMSC': {'Location': 1}, 'Number': m['Number'], } self.add_status('Command ' + comm7 + ' Command OK') sm.SendSMS(message) self.add_status( 'Command: ' + comm7 + ' was processed and confirmation was sent as SMS to: ' + m['Number']) sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted') self._sleep(10) else: # If SMS command is not defined sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received command ' + m['Text'] + ' is not defined!') else: # If SMS was read sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted - SMS was read') else: # If telephone number is not admin 1 or admin 2 phone number sm.DeleteSMS(m['Folder'], m['Location']) self.add_status('Received SMS was deleted - SMS was not from admin')