Skip to content

Instantly share code, notes, and snippets.

@bitcanon
Created December 13, 2022 10:27
Show Gist options
  • Save bitcanon/56d42446a964591cbbeec9ee0cb3d037 to your computer and use it in GitHub Desktop.
Save bitcanon/56d42446a964591cbbeec9ee0cb3d037 to your computer and use it in GitHub Desktop.
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