def sensor_send_value(sensor_id): sensor = SensorInteractor.get(sensor_id) if sensor: if sensor.active: gateways = GatewayInteractor.get_all_device_registered() if gateways: for gateway in gateways: for sensor_method in sensor.sensor_methods: if sensor_method.method.type == "write" and sensor_method.value: r = request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) elif sensor_method.method.type == "read": r = request_helper.get_sensor_value(sensor, sensor_method.method.path) if r != False: sensor_method.value = r sensor_method.save() r = request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) else: app.logger.error("Getting value: Couldn't connect to YunServer - sensor %s (method %s) - path %s" % (sensor.id, sensor_method.method.id, sensor_method.method.path)) return jsonify({ "value" : 'error', 'error' : 'The arduino server is not available.' }) flash('Sensor method values successfully sent to gateway %s!' % gateway.address, category={ 'theme' : 'success' } ) else: flash("No gateways with registered device!", category={ 'theme': 'warning' } ) return redirect("/sensors/#%s" % sensor.identificator) else: flash('Sensor is not active!', category={ 'theme': 'warning' } ) return redirect("/sensors/#%s" % sensor.identificator) flash('Sensor does not exist!', category={ 'theme': 'error' } ) app.logger.error("Sending sensor values: Sensor does not exist") return redirect("/sensors/")
def ip_cron(): import json from app.arduino.common import PublicIPInteractor from urllib2 import urlopen ip = PublicIPInteractor.get() currentIP = "%s:%s" % ( json.load(urlopen('http://httpbin.org/ip'))['origin'].rstrip(), settings.PORT ) app.logger.info("---- START IP cron START----") app.logger.info("IP ADDRESS - %s" % currentIP) if ( not ip.address or ip.address != currentIP ): try: for gateway in GatewayInteractor.get_all_device_registered(): r = request_helper.delete_device(gateway.address, gateway.post_authorization) if r != False: app.logger.info("Delete dev: %d" % r.status_code) ip.address = currentIP ip.save() r = request_helper.init_device(gateway.address, gateway.post_authorization) if r != False: app.logger.info("Init dev: %d" % r.status_code) r = request_helper.init_descriptor(gateway.address, gateway.post_authorization) if r != False: app.logger.info("Init descriptor: %d" % r.status_code) r = request_helper.send_descriptor(gateway.address, gateway.post_authorization) if r != False: app.logger.info("Descriptor: %d" % r.status_code) for sensor in SensorInteractor.get_all_active(): for sensor_method in sensor.sensor_methods: r = request_helper.delete_sensor(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path) if r != False: app.logger.info("Delete sensor method %s: %d" % (sensor_method.method.path, r.status_code)) r = request_helper.init_sensor(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path) if r != False: app.logger.info("Init sensor method %s: %d" % (sensor_method.method.path, r.status_code)) if sensor_method.method.type in ["read", "write"]: r = request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) if r != False: app.logger.info("Send method value %s: %d" % (sensor_method.method.path, r.status_code)) log = "%s - %s %s %s - %s (%s)" % ( gateway.address, sensor.module.hardware.name, sensor.module.name, sensor.identificator, sensor_method.method.path, sensor_method.value ) app.logger.info(log) else: ip.address = "" ip.save() else: ip.address = "" ip.save() else: ip.address = "" ip.save() except: app.logger.error( "%s" % sys.exc_info()[0] ) ip.address = "" ip.save() else: app.logger.warning("address wasn't changed") app.logger.info("----END IP cron END----") return make_response()
def edit_gateway_view(gateway_id): gateway = GatewayInteractor.get(gateway_id) if gateway: return render_template("gateway/edit.html", gateway=gateway) else: flash("Gateway doesn't exist!", category={"theme": "error"}) app.logger.error("Gateway editing: Gateway doesn't exist") return redirect("/")
def deactivate_gateway(gateway_id): gateway = GatewayInteractor.get(gateway_id) if gateway: gateway.active = False gateway.save() else: flash("Gateway doesn't exist!", category={"theme": "error"}) app.logger.error("Gateway activation: Gateway doesn't exist") return redirect("/")
def remove_gateway(): gateway_id = request.form.get("gateway_id") remove_device_from_gateway(gateway_id) if GatewayInteractor.delete(gateway_id): flash("Gateway successfully removed!", category={"theme": "success"}) else: flash("Could not remove gateway!", category={"theme": "error"}) app.logger.error("Deleting gateway: Could not delete GW from db") return redirect("/")
def register_device_on_gateway(gateway_id): gateway = GatewayInteractor.get(gateway_id) if gateway: r = request_helper.init_device(gateway.address, gateway.post_authorization) if r != False: if r.status_code == 201 or r.status_code == 409: r = request_helper.init_descriptor(gateway.address, gateway.post_authorization) if r != False: r = request_helper.send_descriptor(gateway.address, gateway.post_authorization) if r != False: sensors = SensorInteractor.get_all_active() if sensors: for sensor in sensors: if sensor.active: sensor.save() for sensor_method in sensor.sensor_methods: r = request_helper.init_sensor( gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, ) if ( r != False and sensor_method.method.type in ["read", "write"] and sensor_method.value ): request_helper.send_sensor_value( gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value, ) flash("Device successfully registered!", category={"theme": "success"}) gateway.device_registered = True gateway.save() elif r.status_code == 400 or r.status_code == 401: flash("Wrong authorization for registration!", category={"theme": "error"}) app.logger.error("Registering device: Wrong authorization") else: flash("Something went wrong!", category={"theme": "error"}) app.logger.error("Registering device: Unknown error during device initialization") else: flash("Gateway does not exist!", category={"theme": "error"}) app.logger.error("Registering device: Gateway doesn't exist") return redirect("/")
def activate_sensor(sensor_id): sensor = SensorInteractor.get(sensor_id) if sensor: sensors = SensorInteractor.get_active_for_pin(sensor.pin.arduino_pin) old_io = "" if sensors: for sensor_on_pin in sensors: deactivate_sensor(sensor_on_pin.id, False) old_io = sensor_on_pin.pin.io sensor.active = True sensor.save() if sensor.pin.io != old_io: r = request_helper.change_pin_mode(sensor.pin.arduino_pin, sensor.pin.io) if r != False: flash("Pin %s mode successfully changed to %s!" % (sensor.pin.arduino_pin, sensor.pin.io), category={'theme' : 'success'} ) else: flash("Pin mode could not be changed!", category={'theme': 'error'}) app.logger.error("Activating sensor: Couldn't change pin mode - %s (%s)" % (sensor.pin.arduino_pin, sensor.pin.io)) for sensor_method in sensor.sensor_methods: if sensor_method.method.type in ["read"]: r = request_helper.get_sensor_value(sensor, sensor_method.method.path) if r != False: sensor_method.value = r sensor_method.save() else: app.logger.error("Getting value: Couldn't connect to YunServer - sensor %s (method %s) - path %s" % (sensor.id, sensor_method.method.id, sensor_method.method.path)) return jsonify({ "value" : 'error', 'error' : 'The arduino server is not available.' }) gateways = GatewayInteractor.get_all_device_registered() if gateways: for gateway in gateways: r = request_helper.send_descriptor(gateway.address, gateway.post_authorization) if r != False: for sensor_method in sensor.sensor_methods: r = request_helper.init_sensor(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path) if r != False and sensor_method.method.type in ["read", "write"] and sensor_method.value: r = request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) flash('Sensor successfully added to gateway %s!' % gateway.address, category={ 'theme': 'success' } ) flash("Sensor activated!", category={ 'theme': 'success' } ) else: flash("No gateways with registered device", category={ 'theme': 'warning' } ) return redirect("/sensors/#%s" % sensor.identificator) flash("Sensor does not exist!", category={ 'theme': 'error' } ) app.logger.error("Activating sensor: Sensor does not exist") return redirect("/sensors/")
def edit_gateway(gateway_id): gateway = GatewayInteractor.get(gateway_id) if gateway: from app.helpers.base64_helper import b64encode_quote authorization = b64encode_quote(request.form.get("authorization")) name = request.form.get("name") is_active = True if request.form.get("is_active") else False if authorization == gateway.authorization and name == gateway.name and is_active == gateway.active: flash("You didn't change anything!", category={"theme": "warning"}) return redirect("/gateway/%d/edit/" % (gateway_id,)) r = request_helper.check_gateway(gateway.address, authorization) if r != False: if r.status_code == 200: if r.text: m = re.findall(r"<m2m:holderRef>(.*?)</m2m:holderRef>", r.text) gateway.post_authorization = b64encode_quote(m[1]) gateway.active = True if not is_active: gateway.active = False gateway.name = name if name else m[1].split("//")[1].split(".")[0].lower() gateway.save() r = request_helper.check_device(gateway.address, authorization) if r != False: if r.status_code == 200: flash("Device is already registered on gateway!", category={"theme": "success"}) gateway.device_registered = True gateway.save() elif r.status_code == 404: flash("Device is not registered.", category={"theme": "warning"}) else: flash("Response was not a valid accessRights XML!", category={"theme": "error"}) app.logger.error("Editing gateway: Invalid accessRights XML") elif r.status_code == 400 or r.status_code == 404: flash("Wrong authorization URI! Gateway wasn't edited!", category={"theme": "error"}) app.logger.error("Editing gateway: Wrong authorization URI") return edit_gateway_view(gateway_id) else: flash("Gateway doesn't exist!", category={"theme": "error"}) app.logger.error("Editing gateway: Gateway does not exist") return redirect("/")
def retargeting_sensor_toggle(identificator, method_path, value=None): if request.remote_addr in [gateway.address.split(":")[1][2:] for gateway in GatewayInteractor.get_all_device_registered()]: sensor = SensorInteractor.get_by_identificator(identificator) if sensor and sensor.active: method = MethodInteractor.get_by_path(method_path, sensor.module_id) if method: if method.type != "read": sensor_method = SensorMethodsInteractor.get(sensor.id, method.id) if sensor_method: if sensor.pin.io == "output": path = "/%s/%s/%s/%s" % (sensor.module.hardware.path, sensor.module.path, method_path, sensor.pin.pin) if value: path += "/%s" % value r = request_helper.call_arduino_path( path ) if r != False: if r.status_code == 200: if r.text: sensor_method.value = r.text sensor_method.save() for gateway in GatewayInteractor.get_all_device_registered(): request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) app.logger.info("Retargeting call: %s - %s (%s)" % (identificator, method_path, sensor_method.value)) return make_response((r.text, r.status_code)) app.logger.error("Retargeting call: Can't reach sensor - %s" % (sensor.identificator, )) return make_response(("400: The sensor can't be reached!", 400)) app.logger.error("Retargeting call: Called method for an INPUT sensor - %s" % (sensor.identificator)) return make_response(("400: You are calling a method for an INPUT sensor!", 400)) app.logger.error("Retargeting call: Invalid method for sensor - %s (%s)" % (sensor.identificator, method_path)) return make_response(("400: Invalid method for sensor!", 400)) app.logger.error("Retargeting call: Called read method - %s (%s)" % (sensor.identificator, method_path)) return make_response(("400: You are calling a read method!", 400)) app.logger.error("Retargeting call: Invalid method for sensor - %s (%s)" % (sensor.identificator, method_path)) return make_response(("400: Invalid method for sensor!", 400)) app.logger.error("Retargeting call: Sensor doesn't exist - %s" % (identificator, )) return make_response(("400: Non existant sensor!", 400)) app.logger.error("Retargeting call: Request didn't come from registered GW - %s" % (request.remote_addr, )) return make_response(("400: You are not allowed to access this device!", 400))
def delete_sensor(sensor_id=None): if not sensor_id: sensor_id = request.form.get('sensor_id') sensor = SensorInteractor.get(sensor_id) if sensor: if sensor.active: gateways = GatewayInteractor.get_all_device_registered() if gateways: deleted_all_remote = True for gateway in gateways: for sensor_method in sensor.sensor_methods: r = request_helper.delete_sensor(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path) if r == False: flash("Sensor method %s was not deleted on gateway %s!" % (sensor_method.method.path, gateway.address), category={ 'theme': 'warning' } ) deleted_all_remote = False if deleted_all_remote: if SensorInteractor.delete(sensor_id): flash("Sensor deleted from gateway %s!" % gateway.address, category={ 'theme': 'success' } ) else: flash("Sensor could not be deleted!", category={ 'theme': 'error' }) app.logger.error("Deleting sensor: Couldn't delete sensor from db because not all sensor methods could be deleted from GW") return redirect("/sensors/#%s" % sensor.identificator) request_helper.send_descriptor(gateway.address, gateway.post_authorization) else: flash("No gateways with registered device", category={ 'theme': 'warning' } ) else: if SensorInteractor.delete(sensor_id): flash("Sensor deleted!", category={ 'theme': 'success' } ) else: flash("Sensor could not be deleted!", category={ 'theme': 'error' } ) app.logger.error("Deleting sensor: Could not delete sensor from db") return redirect("/sensors/#%s" % sensor.identificator) else: flash('Sensor does not exist!', category={ 'theme': 'error' } ) app.logger.error("Deleting sensor: Sensor does not exist") return redirect("/sensors/")
def deactivate_sensor(sensor_id, descriptor=True): sensor = SensorInteractor.get(sensor_id) if sensor: sensor.active = False sensor.save() gateways = GatewayInteractor.get_all_device_registered() if gateways: for gateway in gateways: if descriptor: r = request_helper.send_descriptor(gateway.address, gateway.post_authorization) for sensor_method in sensor.sensor_methods: r = request_helper.delete_sensor(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path) if r != False: flash('Sensor successfully removed from gateway %s!' % gateway.address, category={ 'theme': 'success' } ) else: flash("No gateways with registered device", category={ 'theme': 'warning' } ) flash("Sensor deactivated!", category={ 'theme': 'success' } ) return redirect("/sensors/#%s" % sensor.identificator) flash("Sensor does not exist!", category={ 'theme': 'error' } ) app.logger.error("Activating sensor: Sensor does not exist") return redirect("/sensors/")
def cron(): app.logger.info("----START cron START----") try: for gateway in GatewayInteractor.get_all_device_registered(): for sensor in SensorInteractor.get_all_active(): for sensor_method in sensor.sensor_methods: if sensor_method.method.type in ["read", "write"]: if sensor_method.method.type == "read": r = request_helper.get_sensor_value(sensor, sensor_method.method.path) if r != False: sensor_method.value = r sensor_method.save() if sensor_method.value: r = request_helper.send_sensor_value(gateway.address, gateway.post_authorization, sensor.identificator, sensor_method.method.path, sensor_method.value) if r != False: log = "%s - %s %s %s - %s (%s)" % ( gateway.address, sensor.module.hardware.name, sensor.module.name, sensor.identificator, sensor_method.method.path, sensor_method.value ) app.logger.info(log) else: app.logger.error("CRON getting value: Couldn't connect to YunServer - sensor %s (method %s) - path %s" % (sensor.id, sensor_method.method.id, sensor_method.method.path)) return make_response() except: app.logger.error( "%s" % sys.exc_info()[0] ) app.logger.info("----END cron END----") return make_response()
def remove_device_from_gateway(gateway_id): gateway = GatewayInteractor.get(gateway_id) if gateway: r = request_helper.delete_device(gateway.address, gateway.post_authorization) if r != False: if r.status_code == 204: flash("Device successfully removed from gateway!", category={"theme": "success"}) gateway.device_registered = False gateway.save() elif r.status_code == 404: flash("Device is already removed!", category={"theme": "warning"}) gateway.device_registered = False gateway.save() else: flash("Something went wrong!", category={"theme": "error"}) app.logger.error("Unregistering device: Unknown error during device deletion") else: flash("Gateway does not exist!", category={"theme": "error"}) app.logger.error("Unregistering device: Gateway doesn't exist") return redirect("/")
def index(): return render_template("gateway/index.html", settings=settings, gateways=GatewayInteractor.get_all())
def gateway(): gateway = Gateway() address = request.form.get("address") address = address if "http://" in address else "http://%s" % address if GatewayInteractor.check_address(address): flash( "Gateway wasn't saved beacuse it already exists for this device! If you need to change the authorization, edit the existing one!", category={"theme": "warning", "life": 6000}, ) return redirect("/") from app.helpers.base64_helper import b64encode_quote authorization = b64encode_quote(request.form.get("authorization")) r = request_helper.check_gateway(address, authorization) if r != False: if r.status_code == 200: if r.text: m = re.findall(r"<m2m:holderRef>(.*?)</m2m:holderRef>", r.text) gateway.post_authorization = b64encode_quote(m[1]) gateway.name = ( request.form.get("name") if request.form.get("name") else m[1].split("//")[1].split(".")[0] ) gateway.address = address gateway.authorization = authorization if request.form.get("is_active"): gateway.active = True try: gateway.save() except: flash( "Gateway wasn't saved beacuse it already exists for this device! If you need to change the authorization, edit the existing one!", category={"theme": "warning", "life": 6000}, ) return redirect("/") r = request_helper.check_device(address, authorization) if r != False: if r.status_code == 200: flash("Device is already registered on gateway!", category={"theme": "success"}) gateway.device_registered = True gateway.save() # remove_device_from_gateway(gateway.id) # register_device_on_gateway(gateway.id) elif r.status_code == 404: flash("Device is not registered.", category={"theme": "warning"}) else: flash("Response was not a valid accessRights XML!", category={"theme": "error"}) app.logger.error("Adding gateway: Invalid accessRights XML") elif r.status_code == 400 or r.status_code == 404: flash("Wrong authorization URI! Gateway wasn't added!", category={"theme": "error"}) app.logger.error("Adding gateway: Wrong authorization URI") return redirect("/")
def update_sensor(sensor_id): identificator = request.form.get("identificator").lower().replace(" ", "_") old_sensor = SensorInteractor.get(sensor_id) old_io = old_sensor.pin.io sensor = SensorInteractor.get_by_identificator(identificator) if old_sensor: if sensor and sensor != old_sensor: flash("Sensor with same identifier already exists!", category={ 'theme': 'error' } ) app.logger.error("Editing sensor: Identificator already exists") return redirect("/sensors/%d/edit/" % sensor_id) identificator_changed = False if old_sensor.identificator != identificator: identificator_changed= True old_sensor.identificator = identificator gateways = GatewayInteractor.get_all_device_registered() if gateways: for gateway in gateways: for sensor_method in old_sensor.sensor_methods: request_helper.delete_sensor(gateway.address, gateway.post_authorization, old_sensor.identificator, sensor_method.method.path) if request.form.get('type'): old_sensor.type = request.form.get('type') old_sensor.pin_id = request.form.get("pin") if old_sensor.module_id != request.form.get("module"): old_sensor.module_id = request.form.get("module") if not identificator_changed: gateways = GatewayInteractor.get_all_device_registered() if gateways: for gateway in gateways: for sensor_method in old_sensor.sensor_methods: request_helper.delete_sensor(gateway.address, gateway.post_authorization, old_sensor.identificator, sensor_method.method.path) old_sensor.save() SensorMethodsInteractor.delete_all_for_sensor(old_sensor.id) for method in old_sensor.module.methods: sm = SensorMethods() sm.method = method old_sensor.sensor_methods.append(sm) old_sensor.save() if request.form.get('is_active'): activate_sensor(old_sensor.id) if old_sensor.pin.arduino_pin[0] == "D" and old_sensor.pin.io != old_io: r = request_helper.change_pin_mode(old_sensor.pin.arduino_pin[1:], old_sensor.pin.io) if r!= False: flash("Pin %s mode successfully changed to %s!" % (old_sensor.pin.arduino_pin, old_sensor.pin.io), category={'theme' : 'success'} ) else: flash("Pin mode could not be changed!", category={'theme': 'error'}) app.logger.error("Editing sensor: Couldn't change pin mode - %s (%s)" % (old_sensor.pin.arduino_pin, old_sensor.pin.io)) elif old_sensor.active: deactivate_sensor(old_sensor.id) flash("Sensor edited!", category={ 'theme': 'success' } ) return redirect("/sensors/#%s" % old_sensor.identificator) flash("Sensor doesn't exist!", category={ 'theme': 'error' } ) app.logger.error("Editing sensor: Sensor doesn't exist") return redirect("/sensors/")