-
-
Save bitcanon/56d42446a964591cbbeec9ee0cb3d037 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
from uuid import uuid4 | |
from flask import Flask, request | |
app = Flask(__name__) | |
version = "9.0" | |
def print_request(): | |
print('=========================================================') | |
print('======================= REQUEST =========================') | |
print('=========================================================') | |
print(f"{request.method} {request.path}") | |
print() | |
print('== URL ==') | |
print(request.url) | |
print() | |
print('== ARGS ==') | |
print(request.args) | |
print() | |
print('== HEADER ==') | |
for header in request.headers: | |
print(f"{header[0]}: {header[1]}") | |
print() | |
if request.is_json: | |
print('== DATA (JSON) ==') | |
print(str(request.get_json())) | |
else: | |
print('== DATA (RAW) ==') | |
print(str(request.get_data())) | |
print() | |
def print_response(data): | |
print('== RESPONSE ==') | |
print(data) | |
print() | |
@app.get('/rest_api/version') | |
def rest_api_version(): | |
print_request() | |
return '{"rest_versions": ["8.0", "9.0"], "installer_versions": ["7.0"], "push_format_versions": ["7"], "dls_versions": ["1.0"]}' | |
@app.get('/rest_api/apptype') | |
def rest_api_apptype(): | |
print_request() | |
return '{"apptype": "", "android": "market://details?id=com.visonic.neo", "ios": "itms-apps://itunes.apple.com/app/connectalarm/id1300525077"}' | |
@app.post('/rest_api/'+version+'/auth') | |
def auth(): | |
print_request() | |
response = json.dumps({ | |
'user_token': str(uuid4()), | |
}) | |
print_response(response) | |
return response | |
@app.get('/rest_api/'+version+'/panels') | |
def panels(): | |
print_request() | |
return '[{"panel_serial": "123ABC", "alias": "Home"}]' | |
@app.post('/rest_api/'+version+'/panel/login') | |
def panel_login(): | |
print_request() | |
response = json.dumps({ | |
'session_token': str(uuid4()), | |
}) | |
print_response(response) | |
return response | |
@app.get('/rest_api/'+version+'/panel_info') | |
def panel_info(): | |
return '{"serial": "123ABC", "model": "PowerMaster 10", "manufacturer": "Visonic", "current_user": "master_user", "state_sets": {"all": [{"name": "AWAY", "settable": true, "options": ["NOENTRY"], "statuses": ["EXIT"], "transitions": ["DISARM", "HOME"]}, {"name": "HOME", "settable": true, "options": ["NOENTRY"], "statuses": ["EXIT"], "transitions": ["DISARM", "AWAY"]}, {"name": "DISARM", "settable": true, "options": [], "statuses": [], "transitions": ["DISARM", "AWAY", "HOME"]}, {"name": "ENTRY_DELAY", "settable": false, "options": [], "statuses": [], "transitions": ["DISARM"]}, {"name": "PROGRAMMING", "settable": false, "options": [], "statuses": [], "transitions": []}]}, "partitions": [{"id": -1, "active": true, "exit_delay_time": 30, "state_set": "all", "name": "ALL"}], "bypass_mode": "no_bypass", "local_wakeup_needed": true, "remote_switch_to_programming_mode_requires_user_acceptance": false, "features": {"video_on_demand": true, "alerts": true, "enabling_siren": true, "disabling_siren": true, "wi_fi_connection": false, "set_date_time": false, "outputs_setup": true}}' | |
@app.get('/rest_api/'+version+'/status') | |
def status(): | |
return '{"connected": true, "connected_status": {"bba": {"is_connected": true, "state": "online"}, "gprs": {"is_connected": false, "state": "online"}}, "discovery": {"completed": true, "stages": 11, "in_queue": 0, "triggered": null}, "partitions": [{"id": -1, "state": "DISARM", "status": "", "ready": true, "options": []}], "rssi": {"level": "ok", "network": "Unknown"}}' | |
@app.get('/rest_api/'+version+'/wakeup_sms') | |
def wakeup_sms(): | |
return '{"phone": "+4670123456789", "sms": "CONNECT;ABCD;CS-1;SEQ-1234;"}' | |
@app.get('/rest_api/'+version+'/feature_set') | |
def feature_set(): | |
return '{"events": {"is_enabled": true}, "datetime": {"is_enabled": false}, "partitions": {"is_enabled": false, "is_labels_enabled": false, "max_partitions": 3}, "sirens": {"can_enable": true, "can_disable": true}, "devices": {"is_enabled": true, "is_enrollable": true, "devices": [{"enrollment_prefix": "300", "name": "BASIC_KEYFOB", "enroll": true, "removing": true, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "301", "name": "KEYFOB_ARM_LED", "enroll": true, "removing": true, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "305", "name": "DSC_KEYFOB_1", "enroll": true, "removing": true, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "306", "name": "DSC_KEYFOB_2", "enroll": true, "removing": true, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "", "name": "VISONIC_PANEL", "enroll": false, "removing": false, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "120", "name": "MOTION", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "122", "name": "CURTAIN", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "140", "name": "MOTION_CAMERA", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "160", "name": "GLASS_BREAK", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "123", "name": "MOTION_V_ANTIMASK", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "150", "name": "MOTION_DUAL", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "130", "name": "MOTION_OUTDOOR", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "142", "name": "MOTION_OUTDOOR_CAMERA", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "200", "name": "SMOKE", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "201", "name": "SMOKE_HEAT", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "230", "name": "GAS", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "220", "name": "CO", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "240", "name": "FLOOD", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "250", "name": "TEMPERATURE", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "241", "name": "FLOOD_PROBE", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "100", "name": "CONTACT", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "101", "name": "CONTACT_AUX", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "104", "name": "CONTACT_V", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "171", "name": "SHOCK_AUX", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "172", "name": "SHOCK_CONTACT_G3", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "170", "name": "SHOCK_CONTACT_AUX_ANTIMASK", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "173", "name": "SHOCK_CONTACT_G2", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "050", "name": "HW_ZONE_CONNECTED_DIRECTLY_TO_THE_PANEL", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": true}, {"enrollment_prefix": "370", "name": "KEYPAD", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "371", "name": "PROXIMITY_KEYPAD", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "374", "name": "LCD_KEYPAD", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "375", "name": "LCD_PRG_KEYPAD", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "410", "name": "OUTDOOR", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "400", "name": "INDOOR", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "411", "name": "AC_OUTDOOR", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "", "name": "POWER_LINK", "enroll": false, "removing": false, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "", "name": "GENERIC_PROXY_TAG", "enroll": false, "removing": false, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "320", "name": "SINGLE_BUTTON", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "322", "name": "TWO_BUTTON", "enroll": false, "removing": false, "partitions_required": true, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "430", "name": "BASIC_REPEATER", "enroll": false, "removing": false, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}, {"enrollment_prefix": "", "name": "GENERIC_PGM", "enroll": false, "removing": false, "partitions_required": false, "users_required": false, "is_zone_type_applicable": false}], "zone_types": ["NON_ALARM", "EMERGENCY", "FLOOD", "GAS", "DELAY_1", "DELAY_2", "INTERIOR_FOLLOW", "PERIMETER", "PERIMETER_FOLLOW", "H24_SILENT", "H24_AUDIBLE", "FIRE", "INTERIOR", "HOME_DELAY", "TEMPERATURE", "ARMING_KEY", "GUARD_KEYBOX", "OUTDOOR", "CO"], "video_on_demand": true}, "home_automation_devices": {"is_enabled": true, "enabling": true, "disabling": true, "toggling": true, "off_timer": true, "setting": true}, "state": {"is_enabled": true, "can_set": true, "can_get": true}, "faults": {"is_enabled": true, "has_alarms": true, "has_alerts": true, "has_troubles": true}, "diagnostic": {"is_enabled": false}, "wifi": {"is_enabled": false}}' | |
@app.get('/rest_api/'+version+'/locations') | |
def locations(): | |
return '[{"hel_id": 0, "name": "Entry", "is_editable": false}, {"hel_id": 1, "name": "Backdoor", "is_editable": false}, {"hel_id": 2, "name": "Basement", "is_editable": false}, {"hel_id": 3, "name": "Outdoor", "is_editable": false}, {"hel_id": 4, "name": "Bedroom", "is_editable": false}, {"hel_id": 5, "name": "Playroom", "is_editable": false}, {"hel_id": 6, "name": "TV room", "is_editable": false}, {"hel_id": 7, "name": "Shed", "is_editable": false}, {"hel_id": 8, "name": "Dining room", "is_editable": false}, {"hel_id": 9, "name": "Down stairs", "is_editable": false}, {"hel_id": 10, "name": "Emergency", "is_editable": false}, {"hel_id": 11, "name": "Fire", "is_editable": false}, {"hel_id": 12, "name": "Entry door", "is_editable": false}, {"hel_id": 13, "name": "Garage", "is_editable": false}, {"hel_id": 14, "name": "Garage door", "is_editable": false}, {"hel_id": 15, "name": "Guest room", "is_editable": false}, {"hel_id": 16, "name": "Hallway", "is_editable": false}, {"hel_id": 17, "name": "Kitchen", "is_editable": false}, {"hel_id": 18, "name": "Laundry room", "is_editable": false}, {"hel_id": 19, "name": "Living room", "is_editable": false}, {"hel_id": 20, "name": "Window", "is_editable": false}, {"hel_id": 21, "name": "Hallway", "is_editable": true}, {"hel_id": 22, "name": "Office", "is_editable": true}, {"hel_id": 23, "name": "Upstairs", "is_editable": true}, {"hel_id": 24, "name": "All room", "is_editable": true}, {"hel_id": 25, "name": "Guest cabin", "is_editable": true}, {"hel_id": 26, "name": "Custom 1", "is_editable": true}, {"hel_id": 27, "name": "Custom 2", "is_editable": true}, {"hel_id": 28, "name": "Custom 3", "is_editable": true}, {"hel_id": 29, "name": "Custom 4", "is_editable": true}, {"hel_id": 30, "name": "Custom 5", "is_editable": true}]' | |
@app.get('/rest_api/'+version+'/home_automation_devices') | |
def home_automation_devices(): | |
return '[]' | |
@app.get('/rest_api/'+version+'/smart_devices') | |
def smart_devices(): | |
return '[]' | |
@app.get('/rest_api/'+version+'/devices') | |
def devices(): | |
return '[{"id": 90, "enrollment_id": null, "device_number": 1, "device_type": "CONTROL_PANEL", "zone_type": null, "subtype": "VISONIC_PANEL", "preenroll": false, "warnings": null, "partitions": [1], "traits": {}, "name": "", "removable": false, "renamable": false}, {"id": 10123, "enrollment_id": null, "device_number": 1, "device_type": "AOTA", "zone_type": null, "subtype": null, "preenroll": false, "warnings": null, "partitions": [1], "traits": {}, "name": "", "removable": false, "renamable": false}]' | |
@app.get('/rest_api/'+version+'/alarms') | |
def alarms(): | |
return '[]' | |
@app.get('/rest_api/'+version+'/events') | |
def events(): | |
return '[{"event":346990,"type_id":87,"label":"ARM","description":"Quick Arm Home","appointment":"Control Panel","datetime":"2022-08-29 19:26:39","video":false,"device_type":"CONTROL_PANEL","zone":0,"partitions":[1],"name":null},{"event":350777,"type_id":89,"label":"DISARM","description":"Disarm","appointment":"User 1","datetime":"2022-08-30 04:46:23","video":false,"device_type":"USER","zone":1,"partitions":[1],"name":"Uncle Bob"},{"event":360471,"type_id":86,"label":"ARM","description":"Arm Away","appointment":"User 2","datetime":"2022-08-30 14:37:04","video":false,"device_type":"USER","zone":2,"partitions":[1],"name":null}]' | |
@app.get('/rest_api/'+version+'/alerts') | |
def alerts(): | |
return '[]' | |
@app.get('/rest_api/'+version+'/troubles') | |
def troubles(): | |
return '[]' | |
@app.get('/rest_api/'+version+'/cameras') | |
def cameras(): | |
return '[{"zone": 6, "preenroll": false, "location": "Basement", "status": "FAILED", "preview_path": null, "timestamp": null, "partitions": [1], "zone_name": "Basement"}, {"zone": 5, "preenroll": false, "location": "Vardagsrum", "status": "FAILED", "preview_path": null, "timestamp": null, "partitions": [1], "zone_name": ""}]' | |
@app.post('/rest_api/'+version+'/set_state') | |
def set_state(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/make_video') | |
def make_video(): | |
return '' | |
@app.post('/rest_api/'+version+'/register_push_recipient') | |
def register_push_recipient(): | |
print_request() | |
return '[]' | |
@app.get('/rest_api/'+version+'/notifications/email') | |
def notifications_email(): | |
return '{"mode": 2047, "recipient_mode": 0}' | |
@app.post('/rest_api/'+version+'/notifications/email') | |
def notifications_email_post(): | |
print_request() | |
return '' | |
@app.get('/rest_api/'+version+'/users') | |
def users(): | |
print_request() | |
return '{"max_users_count": 8, "users": [{"id": 1, "name": "Uncle Bob", "partitions": [1, 2, 3], "email": "uncle@bob.com"}, {"id": 4, "name": "", "partitions": [1], "email": ""}, {"id": 8, "name": "", "partitions": [1], "email": ""}]}' | |
@app.post('/rest_api/'+version+'/set_user_code') | |
def set_user_code(): | |
print_request() | |
response = json.dumps({ | |
'process_token': str(uuid4()), | |
}) | |
print_response(response) | |
return response | |
@app.get('/rest_api/'+version+'/process_status') | |
def process_status(): | |
# Returns: [{"token": "a771b111-d0ab-4e98-ae38-b09fbc7e06b8", "status": "succeeded", "message": "", "error": null}] | |
print_request() | |
tokens = request.args['process_tokens'].split(',') | |
res_list = [] | |
for token in tokens: | |
if token == 'null': | |
token = None | |
pt = { | |
'token': token, | |
'status': 'succeeded', | |
'message': '', | |
'error': None, | |
} | |
res_list.append(pt) | |
response = json.dumps(res_list) | |
print_response(response) | |
return response | |
@app.post('/rest_api/'+version+'/set_name') | |
def set_name(): | |
print_request() | |
response = json.dumps({ | |
'process_token': str(uuid4()), | |
}) | |
print_response(response) | |
return response | |
@app.post('/rest_api/'+version+'/access/grant') | |
def grant_access(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/access/revoke') | |
def revoke_access(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/activate_siren') | |
def activate_siren(): | |
print_request() | |
return '{"process_token": "'+str(uuid4())+'"}' | |
@app.post('/rest_api/'+version+'/disable_siren') | |
def disable_siren(): | |
print_request() | |
return '{"process_token": "'+str(uuid4())+'"}' | |
@app.get('/rest_api/'+version+'/smart_devices/settings') | |
def smart_devices_settings(): | |
print_request() | |
return '' | |
@app.get('/rest_api/'+version+'/push_options') | |
def push_options(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/password/reset') | |
def password_reset(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/password/reset/complete') | |
def password_reset_complete(): | |
print_request() | |
return '' | |
@app.post('/rest_api/'+version+'/panel/add') | |
def panel_add(): | |
print_request() | |
return '{}' | |
@app.post('/rest_api/'+version+'/panel/rename') | |
def panel_rename(): | |
print_request() | |
return '{}' | |
@app.post('/rest_api/'+version+'/panel/unlink') | |
def panel_unlink(): | |
print_request() | |
return '{}' | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=8080) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment