Total-Connect-Client is a python client for interacting with the TotalConnect2 alarm system.
Started by @craigjmidwinter to add alarm support for his personal HomeAssistant set-up, with later contributions from others.
To use with Home Assistant, follow the instructions to set up Total Connect.
For command line or other uses, the package can be downloaded at PyPI.
The code currently supports:
To see zones that are faulted (open), your Total Connect account must have “Sensor Activities” enabled. Your alarm monitoring company may charge an extra fee to enable this. If available, these can be found in the Total Connect 2 web portal at Notifications -> Sensor Activities. Alternately, they can be found in the Total Connect mobile app at More -> Settings -> Notifications -> Sensor Activities.
If you're having trouble with your system, or find an error message, we may ask you to submit information about your alarm system.
Do the following steps:
python3 -m total_connect_client username
If you want to easily put the info into a file for sharing:
python3 -m total_connect_client username > my_info.txt
WARNING: the output of this command includes private information including your username and password. Carefully remove it before sharing with the developers or posting on Github.
Create an Issue on Github and post both your problem and your system information.
Why do we ask for this information? The TotalConnect API documentation provides little information on the status codes and other information it returns about your system. We developed as best we could using the codes our own systems returned. We have seen many times that other users with issues have different system status codes.
Also consider looking at the Total Connect system status to see if there is a system wide problem.
If you're an end user, just install Home Assistant and things should just work.
If you're a developer and want to interface to TotalConnect from a system other than Home Assistant:
pip install total-connect-client
from total_connect_client import TotalConnectClient, ArmType, ArmingHelper
To arm or disarm the system you must provide the usercode. The usercodes dictionary maps locationid to usercode; if the locationid is not found it uses the default usercode.
usercodes = { 'default': '1234' }
client = TotalConnectClient(username, password, usercodes)
for location in client.locations:
# location.arming_state can be matched against the ArmingState enum members
# or you can call the ArmingState convenience methods:
location.arming_state.is_disarmed()
location.arming_state.is_armed() # true if system is armed in any way
location.arming_state.is_armed_away()
location.arming_state.is_pending() # true if system is arming or disarming
location.arming_state.is_triggered() # true if system is in any alarm state
location.arming_state.is_triggered_gas() # true if in carbon monoxide alarm state
# and many more convenience methods
# you can pass one of the ArmType enum members to location.arm(), e.g.
# location.arm(ArmType.STAY_INSTANT)
# or, equivalently, you can use any of the specific methods on ArmingHelper:
# ArmingHelper(location).arm_away()
location.disarm()
location.zone_bypass(zoneid)
location.is_ac_loss()
location.is_low_battery()
location.is_cover_tampered()
location.last_updated_timestamp_ticks
location.configuration_sequence_number
for (zone_id, zone) in location.zones.items():
zone.is_bypassed()
zone.is_faulted()
zone.is_tampered()
zone.is_low_battery()
zone.is_troubled()
zone.is_triggered()
# zone.zone_type_id can be matched against the ZoneType enum members,
# or you can call the following convenience methods:
zone.is_type_button()
zone.is_type_security()
zone.is_type_motion()
zone.is_type_fire() # heat detector or smoke detector
zone.is_type_carbon_monoxide()
zone.is_type_medical()
zone.partition # the partition ID
zone.description
zone.can_be_bypassed
zone.status
zone.battery_level
zone.signal_strength
zone.chime_state
zone.supervision_type
zone.alarm_report_state
zone.loop_number
zone.sensor_serial_number
zone.device_type
# to refresh a location
location.get_partition_details()
location.get_zone_details()
location.get_panel_meta_data()
# to arm or disarm by partition
for (partition_id, partition) in location.partitions.items():
ArmingHelper(partition).arm_stay()
etc.
If there's something about the interface you don't understand, check out the Home Assistant integration that uses this package, or submit an issue.
During development, if you discover new status codes or other information not handled, please submit an issue to let us know, or even better submit a pull request.