Code Monkey home page Code Monkey logo

sia's Issues

State after tiggered alarm

Hello,

I try to implement Sia/Ajax with HA but I have some problem.

When hub send a triggered alarm to HA, after end of alarm, HA reset state of alarm on disarmed ?

It's a normal working of script ? or it's a bug ?

Thanks for your answer.

My HA run on docker for your information.
HA version : 0.108.9

Event timestamp is no longer valid

Version of the custom_component and HA setup (version, OS, etc)

SIA v0.5.0-beta.6
Home Asistant 2021.5.1
Supervisor 2021.04.3
Home Assistant OS 5.13

Configuration

                "entry_id": "xxx",
                "version": 2,
                "domain": "sia",
                "title": "SIA Alarm on port 8124",
                "data": {
                    "accounts": [
                        {
                            "account": "xxx",
                            "encryption_key": "xxx",
                            "ping_interval": 1,
                            "zones": 1
                        }
                    ],
                    "port": 8124,
                    "protocol": "TCP"
                },
                "options": {},
                "system_options": {
                    "disable_new_entities": false
                },
                "source": "user",
                "connection_class": "local_push",
                "unique_id": "sia_8124",
                "disabled_by": null

Describe the bug

Not sure if this happened after Ajax updated itself, but all of a sudden I cannot see the status of Ajax in Home Assistant anymore and in the Ajax app it says that the alarm central is disconnected.

The log file is filled with warnings (at the moment just 45 occurences since I just restarted HA to enable log debugging).

Debug log


Logger: pysiaalarm.base_server
Source: /usr/local/lib/python3.8/site-packages/pysiaalarm/base_server.py:126
First occurred: 8:37:33 AM (45 occurrences)
Last logged: 8:45:28 AM

Event timestamp is no longer valid: 2021-05-09 06:47:23+00:00
Event timestamp is no longer valid: 2021-05-09 06:47:33+00:00
Event timestamp is no longer valid: 2021-05-09 06:47:43+00:00
Event timestamp is no longer valid: 2021-05-09 06:47:53+00:00
Event timestamp is no longer valid: 2021-05-09 06:48:04+00:00

---

2021-05-09 08:37:33 DEBUG (MainThread) [pysiaalarm.base_server] Incoming line: xxx
2021-05-09 08:37:33 DEBUG (MainThread) [pysiaalarm.event] Content matches: {'account': 'xxx', 'ti': None, 'id': None, 'ri': '1', 'code': 'OP', 'message': '1', 'xdata': None, 'timestamp': '06:40:08,05-09-2021'}
2021-05-09 08:37:33 WARNING (MainThread) [pysiaalarm.base_server] Event timestamp is no longer valid: 2021-05-09 06:40:08+00:00

Feat: Event documentation + default device (entity) name

Thanks for your work on this, fantastic integration!

I have two suggestions for improvement:

  1. Documentation for new events - End-user use of events / sensors, some examples
  2. Default name for the device.

Is your feature request related to a problem? Please describe.

  1. The following link is specific to Ajax system alarms, but its useful to know their interface to SIA. I see that you support different event codes, I don't know how to listen to an event type and what is the payload.
  2. Since the Account name is limited to HEX ASCII characters it would be nice to enter a default (optional) name in the integration settings dialog that would be used for the sensor names. (I like to have meaningful names)

Describe the solution you'd like

  1. Just an simple example. For example an automation based on a alarm arm/disarm (OP), alarm tamper event (TA), sensor activation (BA), With device and room information (if known)
  2. An extra input for human readable name

Describe alternatives you've considered

  1. none
  2. I could rename them all, but newly added ones after update would be in the current hex format.

Encryption error

Dear All,

since this morning, i loose my connection with my Hub2. The connection work only when i remove the encrytion ! i try different new or old encryption without success !!
I don't understand where is coming from !

any ideas ?

Alarm status unavailable after wrong keycode entry

Hi,

after making a mistake in entering the code from the physical keypad, the SIA integration has stopped working.

In the logs I find this message:
2020-11-18 10:19:40 WARNING (MainThread) [pysiaalarm.base_sia_server] Code not found, replying with DUH to account: AC3

Could you please help me to fix this situation?

Tz,
Andrea

[Question] How to setup 2 leak sensors?

Could you please advise how to configure 2 leak sensors, so they would be recognized as 2 different entities in HA?

Currently, both of them are reported to a single entity in HA (I can tell this by imitating a leak, and a single entry in HA will reflect state of both)

How to change build

Hi. Hoping you are doing well. Many thanks for your supercool plug-in. Could you please suggest hot to migrate from stable custom components build to custom components beta release with config saving? Should I update manually or there is a way to change build update from the integration settings? Thanks

Code JC not in the list

Configuration

Add your configuration here.

sia:
  port: 1241
  ping_interval: 1
  zones: 3
  account: AAA
  password: ******

## Describe the bug
A clear and concise description of what the bug is.


## Debug log

2021-09-15 14:58:16 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content: #AAA|Nri2/JC12]_12:58:23,09-15-2021, Zone (ri): 2, Code: JC, Message: 12, Concerns: None, Type: None, Description: None, Account: AAA, Receiver: None, Prefix: L0, Timestamp: 2021-09-15 12:58:23, Length: 0037, Sequence: 3048, CRC: 0EBD, Calc CRC: 0EBD, Message type: None, Encrypted Content: None, Full Message: "SIA-DCS"3048L0#AAA[#AAA|Nri2/JC12]_12:58:23,09-15-2021..
2021-09-15 14:58:16 WARNING (MainThread) [pysiaalarm.base_sia_server] Code not found, replying with DUH to account: AAA

AlarmControlPanel is deprecated

I'm using Home Assistant 0.110.5 and I can't get the alarm control panel to work. I get these error messages in the logs:

Logger: homeassistant.components.alarm_control_panel
Source: components/alarm_control_panel/init.py:194
Integration: Alarm control panel (documentation, issues)
First occurred: 5:19:28 PM (1 occurrences)
Last logged: 5:19:28 PM

AlarmControlPanel is deprecated, modify SIAAlarmControlPanel to extend AlarmControlPanelEntity

Configuration for specific ajax sensor

Is it possible to get a configuration example of how to add/list a specific ajax devices under a zone section like DoorProtect or MotionProtect, etc.?

Could you also clarify if it is possible to track a state (on/off) of Ajax Wallswitch, Relay or Socket ? Is it possible to turn it on of off from home assistant?

Thanks in advance!

Alarmstate doesn't change when using alarmschedule to activate nightmode

I have created an alarmschedule in my Ajax hub to activate nightmode at night and deactivate it in the morning.
My problem is that the the SIA component doesn't react for the "activate nightmode" event.
If I activate nightmode manually the schedule deactivates it in the morning and this event is picked up by the SIA component.
Also if the schedule activates full armed mode, the event is picked by SIA.

So the only problem is when the schedule activates nightmode.

Maybe the problem is within the hub and not the SIA component at all.
An maybe I can add some debug prints somewhere to collect some more information about this?

//Stefan

Logs fill up with automatic test message exceptions

Ubuntu 18.04.
Home Assistant 0.112.2
Sia component 0.3.2

Describe the bug

SIA works excellent with my Ajax Hub Plus alarm. No smoke or moisture sensors. I can read the state of the alarm in HA just fine. However, the system logs fill up with the below line, or a variation thereof.

Please let me know if I can give more information. There doesn't seem to be a full python stack trace, only the "'NoneType' object has no attribute 'bus'."

Debug log

WARNING (MainThread) [pysiaalarm.aio.sia_server] Last event: Content: _04:24:10,07-14-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: AAA, Receiver: , Prefix: L0, Timestamp: 2020-07-14 04:24:10, Length: 0075, Sequence: , CRC: , Calc CRC: , Message type: *SIA-DCS, Encrypted Content: , Full Message: "., gave error in user function: 'NoneType' object has no attribute 'bus'.

New attribute for the Zone Entity: Message

Describe the solution you'd like
I'd like to have a new attribute of the zone entity called "Message" in order to use it in automations, such as push notifications, triggered from alarm events.
This attribute should be filled with the message that the integration already catches from the data fild of the SIA string.

Additional context
This is an axample of a SIA string from my alarm system:
5C6F005D"SIA-DCS"0595L0#123456[#123456|Nri1BA2^02-VX.INGRESSO AREA VOLUMETRICI^]_20:01:04,01-04-2021

And this is what I see in the debug log:
2021-01-04 20:04:21 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content: #123456|Nri1BA2^02-VX.INGRESSO AREA VOLUMETRICI^]_20:01:04,01-04-2021, Zone: 1, Code: BA, Message: 2^02-VX.INGRESSO AREA VOLUMETRICI^, Concerns: Zone or point, Type: Burglary Alarm, Description: Burglary zone has been violated while armed, Account: 123456, Receiver: None, Prefix: L0, Timestamp: 2021-01-04 20:01:04, Length: 005D, Sequence: 0595, CRC: 5C6F, Calc CRC: 5C6F, Message type: Burglary Alarm, Encrypted Content: None, Full Message: "SIA-DCS"0595L0#123456[#123456|Nri1BA2^02-VX.INGRESSO AREA VOLUMETRICI^]_20:01:04,01-04-2021..

This is the text I would like to read in the attribute:
2^02-VX.INGRESSO AREA VOLUMETRICI^
(the best would be "02-VX.INGRESSO AREA VOLUMETRICI", but I hope to post-process the string in some way. I don't know exactly the meaning of the number just before the symbol "^" ).

Thanks
Stefano

Trouble to connect for the first time

Hi,
i'm using version v.0.3.2 of the integration
HA is version 0.112.4

To have more logs i set this options in my configuration.yaml:

logger:
  default: info
  logs:
    custom_components.sia: debug

Entities state:

alarm_control_panel.8124_aaa_1_alarm | unavailable | friendly_name: 8124 - AAA - zone 1 - alarm

sensor.8124_aaa_last_heartbeat | 2020-07-15T10:58:57.401882+00:00 (last HA restart was at 14h28)

Ha logs:

Logger: pysiaalarm.base_sia_server
Source: __main__.py:356
First occurred: 2:28:41 PM (43 occurrences)
Last logged: 2:36:23 PM

CRC mismatch, ignoring message.

And Ajax apps says "Not connected" for the Sia server
I don't know what to do... I try with or without encryption...

Compatibility with Hikvision Alarm Hub (mostly an ajax hub)

Hello,

I'm using your component with a Hikvision Alarm Hub alarm.
With the old release, I had to change the REGEX used to decode the incoming message because Hikvision doesn't put SIA-DCS or *SIA-DCS in the message but NULL or *NULL when crypted.

[pysiaalarm.base_sia_server] Last line: 821F003A"NULL"0000R0L0#AAAB[#0000|0000 00 000]_18:25:49,07-05-2020 could not be parsed as a SIAEvent.

[pysiaalarm.base_sia_server] Last line: 76D80055"*NULL"0000R0L0#AAAB[B4BC8B40D0E6D959D6BEA78E88CC0B2155741A3C44FBB96D476A3E557CAD64D9 could not be parsed as a SIAEvent.

With the new release, I cannot find the pysiaalarm file in the SIA directory and thus cannot change it.
Would it be possible to bypass this check by mean of a checkbox? or even better for maybe other systems also, to allow us to tell what string should that part be tested against ?

Side-note, on Hikvision, the password must be entered in HEX (32 char HEX, so 16 CHAR ASCII), is it possible to add an function to enter this one both way's?

Oh and thank you for that component...

(Sorry for my english)
Stéphane

Not working (unavailable) with Home Assistant 0.113.0

Using HA 0.113.0, HACS 1.2.2 and SIA 0.3.5.

After installing HA 0.113.0 the SIA integration doesn't work anymore. When the alarm state changes, SIA picks it up for a minute or so, but then it just shows "Unavailable" until the next time the state changes, and so on.

From my logs (some info masked out):


Logger: pysiaalarm.aio.sia_server
Source: runner.py:119
First occurred: July 24, 2020, 1:31:58 PM (1646 occurrences)
Last logged: 6:56:06 PM

Last event: Content: }lf|#xxxxxxx|Nri0/RP0000]_16:51:49,07-25-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: xxxxxx, Receiver: None, Prefix: L0, Timestamp: 2020-07-25 16:51:49, Length: 007C, Sequence: 2609, CRC: 7B87, Calc CRC: 7B87, Message type: Automatic Test, Encrypted Content: BEF91305810054267EF69DAD8xxxxxxxxxxxxxxF31FF28373F2850DF80F40F218A689A2886F, Full Message: "*SIA-DCS"xxxxx#xxxxxxxxx[BEF913058xxxxxxxxxxxEED6B70B86AEC82C7062F31FF28373F2850DF80F40F218A689A2886F., gave error in user function: Attribute hass is None for <Entity 8124 - xxxxxxxxxxxx- Last Heartbeat: 2020-07-25T16:51:50.147913+00:00>.
Last event: Content: at|#xxxxxxxxxx|Nri0/RP0000]_16:52:53,07-25-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: xxxxxxxx, Receiver: None, Prefix: L0, Timestamp: 2020-07-25 16:52:53, Length: 007C, Sequence: 2610, CRC: 8F86, Calc CRC: 8F86, Message type: Automatic Test, Encrypted Content: E7B8FB3FD4EF41B73A3E97B1xxxxxxxxxxxxxBE5B3389ECAE860F0C7E9D9295FBE, Full Message: "*SIA-DCS"2610L0#xxxxxxxxxxxx[E7B8FB3FD4EF41xxxxxxxxxxxxxxB8B8798FE49EA786CE793730FE348306BE5B3389ECAE860F0C7E9D9295FBE., gave error in user function: Attribute hass is None for <Entity 8124 - xxxxxxxx- Last Heartbeat: 2020-07-25T16:52:54.022472+00:00>.
Last event: Content: W|#xxxxxxxxxxx|Nri0/RP0000]_16:53:57,07-25-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: xxxxxxxx, Receiver: None, Prefix: L0, Timestamp: 2020-07-25 16:53:57, Length: 007C, Sequence: 2611, CRC: 405E, Calc CRC: 405E, Message type: Automatic Test, Encrypted Content: 47501481CCAE96D35726138AxxxxxxxxxxxxxA92455A6FF321459A9FD01A27C68D527B12FBBD3D4D, Full Message: "*SIA-DCS"2611L0#xxxxxxxxxxx[47501481CCAE96D35726138ABxxxxxxxxxxxxxxxxxxxx6E0207D15BDA92455A6FF321459A9FD01A27C68D527B12FBBD3D4D., gave error in user function: Attribute hass is None for <Entity 8124 - xxxxxxx- Last Heartbeat: 2020-07-25T16:53:58.135404+00:00>.
Last event: Content: 0|#xxxxxxxxxxxx|Nri0/RP0000]_16:55:01,07-25-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: xxxxxxx, Receiver: None, Prefix: L0, Timestamp: 2020-07-25 16:55:01, Length: 007C, Sequence: 2612, CRC: CA39, Calc CRC: CA39, Message type: Automatic Test, Encrypted Content: 0634C833E6C4E561934EB85E2A2B1EEF7xxxxxxxxxxxxxxx029896F874DBB072F4069969C72, Full Message: "*SIA-DCS"2612L0#xxxxxxxxxxx[0634C833E6C4E561934xxxxxxxxxxxxxE41EDEF2DC99B55B815BD029896F874DBB072F4069969C72., gave error in user function: Attribute hass is None for <Entity 8124 - xxxxxxx- Last Heartbeat: 2020-07-25T16:55:02.251481+00:00>.
Last event: Content: h|#xxxxxxxxxxx|Nri0/RP0000]_16:56:05,07-25-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: xxxxxxxx, Receiver: None, Prefix: L0, Timestamp: 2020-07-25 16:56:05, Length: 007C, Sequence: 2613, CRC: 0209, Calc CRC: 0209, Message type: Automatic Test, Encrypted Content: 65F65B2B95AB8401D519F67641E5Fxxxxxxxxxxxxxxxx05B11C81980D81E1D78034C160FBD13A37, Full Message: "*SIA-DCS"2613L0#xxxxxxxxxxx[65F65B2B95AB840xxxxxxxxxxxxxxD82FFAF7D05B11C81980D81E1D78034C160FBD13A37., gave error in user function: Attribute hass is None for <Entity 8124 - xxxxxxxx- Last Heartbeat: 2020-07-25T16:56:06.111182+00:00>.


Logger: pysiaalarm.base_sia_server
Source: runner.py:119
First occurred: July 24, 2020, 2:35:51 PM (22 occurrences)
Last logged: 5:17:58 PM

Decrypting last line: xxxxxxxx"*SIA-DCS"2360L0#xxxxxxx[77DA3324B82261B28F632699FxxxxxxxxxxxxB20924251A0862538D0744C70BD39110C3ED7EA could not be parsed as a SIAEvent, content: � i|#xxxxxxxxxxxxxxxx|Nri0/RP0000]_12:26:24,07-25-2020
Decrypting last line: D170007C"*SIA-DCS"2391L0#xxxxxxxx[46E4226BFDC8145D00E6FA869C4038xxxxxxxxxxxxxF16AA247B3240680941D33767207FF051 could not be parsed as a SIAEvent, content: J |#xxxxxxxxxxxx|Nri0/RP0000]_12:59:57,07-25-2020
Decrypting last line: 00D3007C"*SIA-DCS"2473L0#xxxxxxxx[D1964C62F90AA8B197349C5D0BBxxxxxxxxxxxxxE42EA233A23650FB3FF72B5DD306300111D1B could not be parsed as a SIAEvent, content: p |#xxxxxxxxxxx|Nri0/RP0000]_14:27:47,07-25-2020
Decrypting last line: 76D3007C"*SIA-DCS"2476L0#xxxxxxxxxx[0B60D25CCDF01205EEC4330BBxxxxxxxxxxxxxxxxxE95BDC19F766F778CB8DC1D48FD725162CDA63 could not be parsed as a SIAEvent, content: 9 k|#xxxxxxxxxxx|Nri0/RP0000]_14:31:00,07-25-2020
Decrypting last line: 909D007C"*SIA-DCS"2521L0#xxxxxxxxx[9172995D1F0FFxxxxxxxxxxxxxxx96415490A560C3F055C69C098F92E4939446832D917DBE899 could not be parsed as a SIAEvent, content: k|#xxxxxxxxxxxx|Nri0/RP0000]_15:17:57,07-25-2020

Let me know if you need more detailed logs.

After simulating a water leak and eliminating it, the leak sensor continues to show " wet"

Номе Assisnant 0.112.4
Component v0.3.5
The configuration is made in integrations
After simulating a water leak and eliminating it, the leak sensor continues to show " wet"
binary_sensor.8226_58ad94_1_moisture = on

warning in log:
2020-07-17 13:36:55 WARNING (MainThread) [pysiaalarm.base_sia_server] Decrypting last line: 69D80078"*SIA-DCS"1408L0#58AD94[50F5F6130B03555799A827B762CF45255A05AC5286EBFF76856CBD27B52FD74C4C3964F666FFED8671C2D79F81E6740F could not be parsed as a SIAEvent, content:
q|#58AD94|Nri0/RP0000]_10:36:54,07-17-2020

I didn't check the other sensors ......

Cannot decrypt line

I've updated to 0.33 and started getting this error message.
I have 2 leak sensors and 2 groups per each in ajax app.
Integration is configured for 2 zones.

2020-07-16 10:59:04 WARNING (MainThread) [pysiaalarm.base_sia_server] Decrypting last line: F39B0079"*SIA-DCS"2826L0#FF8BA34[9B4A82E34836CFFDFCE9E66CE79C71AB3BAAAE342A144694D66CF0AFAE598DE7DE267FBC6A23D0293ED0E2B7ACCDF277 could not be parsed as a SIAEvent, content: ߈@\xb4,\x9dsm\x88<
k\xae@v\xfdNri0/RP0000]_07:59:13,07-16-2020

Disabling Night Mode in multiple zone alarm does not work:

Hi all,

It seems when Ajax alarm has multiple zones, disarming night mode is not reflected to Home Assistant.

These are the logs (I have replaced the account number):

Arming Night Mode:

2020-08-17 14:09:25 DEBUG (MainThread) [pysiaalarm.aio.sia_server] Incoming line: 2C6B00A2"*SIA-DCS"5252L0#XXXXXXX[312FD4F843E8A4D356A23F65503250E38F5B15BDCEE458944C9BB98C0990EE54D65429926465E344D8D52375D76B753B09497CECEF405034DCCB62CA0D700CF9
2020-08-17 14:09:25 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content:  ;@3;7ej|#XXXXXXX|Nri1/NL501]_12:09:26,08-17-2020, Zone: 1, Code: NL, Message: 501, Concerns: Area number, Type: Perimeter Armed, Description: An area has been perimeter armed, Account: XXXXXXX, Receiver: None, Prefix: L0, Timestamp: 2020-08-17 12:09:26, Length: 00A2, Sequence: 5252, CRC: 2C6B, Calc CRC: 2C6B, Message type: Perimeter Armed, Encrypted Content: 312FD4F843E8A4D356A23F65503250E38F5B15BDCEE458944C9BB98C0990EE54D65429926465E344D8D52375D76B753B09497CECEF405034DCCB62CA0D700CF9, Full Message: "*SIA-DCS"5252L0#XXXXXXX[312FD4F843E8A4D356A23F65503250E38F5B15BDCEE458944C9BB98C0990EE54D65429926465E344D8D52375D76B753B09497CECEF405034DCCB62CA0D700CF9..
2020-08-17 14:09:26 DEBUG (MainThread) [pysiaalarm.aio.sia_server] Incoming line: 00CA00A2"*SIA-DCS"5253L0#XXXXXXX[6F786CD1EBA073B307E3831E3429570FCF64C9775F71A45B77CF3934ADE9864EF192C3DE114503761E95AEFE17240B9D6DC018F1BA2263E736A1736824858BEC
2020-08-17 14:09:26 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content: u(+*mk|#XXXXXXX|Nri2/NL501]_12:09:27,08-17-2020, Zone: 2, Code: NL, Message: 501, Concerns: Area number, Type: Perimeter Armed, Description: An area has been perimeter armed, Account: XXXXXXX, Receiver: None, Prefix: L0, Timestamp: 2020-08-17 12:09:27, Length: 00A2, Sequence: 5253, CRC: 00CA, Calc CRC: 00CA, Message type: Perimeter Armed, Encrypted Content: 6F786CD1EBA073B307E3831E3429570FCF64C9775F71A45B77CF3934ADE9864EF192C3DE114503761E95AEFE17240B9D6DC018F1BA2263E736A1736824858BEC, Full Message: "*SIA-DCS"5253L0#XXXXXXX[6F786CD1EBA073B307E3831E3429570FCF64C9775F71A45B77CF3934ADE9864EF192C3DE114503761E95AEFE17240B9D6DC018F1BA2263E736A1736824858BEC..
2020-08-17 14:09:26 DEBUG (MainThread) [pysiaalarm.aio.sia_server] Incoming line: 0F3900A2"*SIA-DCS"5254L0#XXXXXXX[12CB567D7DC462A9C00A8555030C617B3B302634466202A9BAB3D9EBEEAFA2337FF3E933FF4EEDE7C74BC0C1A510D9D6C0064AF9A97FDA412D625A05B22F68BD
2020-08-17 14:09:26 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content:  %l)/|#XXXXXXX|Nri0/RP0000]_12:09:27,08-17-2020, Zone: 0, Code: RP, Message: 0000, Concerns: Unused, Type: Automatic Test, Description: Automatic communication test report, Account: XXXXXXX, Receiver: None, Prefix: L0, Timestamp: 2020-08-17 12:09:27, Length: 00A2, Sequence: 5254, CRC: 0F39, Calc CRC: 0F39, Message type: Automatic Test, Encrypted Content: 12CB567D7DC462A9C00A8555030C617B3B302634466202A9BAB3D9EBEEAFA2337FF3E933FF4EEDE7C74BC0C1A510D9D6C0064AF9A97FDA412D625A05B22F68BD, Full Message: "*SIA-DCS"5254L0#XXXXXXX[12CB567D7DC462A9C00A8555030C617B3B302634466202A9BAB3D9EBEEAFA2337FF3E933FF4EEDE7C74BC0C1A510D9D6C0064AF9A97FDA412D625A05B22F68BD..

Disabling Night Mode:

2020-08-17 14:09:35 DEBUG (MainThread) [pysiaalarm.aio.sia_server] Incoming line: 714A00A2"*SIA-DCS"5255L0#XXXXXXX[500FE215294956F389BAC0030ACDDD1F038A6ABDF49723C4B3E0B8E150735E69DF8A20D7F394CC1C43B0F0F12B3858C5984F67112CF28A1336714BB2B7142E53
2020-08-17 14:09:35 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content: RODk6|#XXXXXXX|Nri1/NP501]_12:09:36,08-17-2020, Zone: 1, Code: NP, Message: 501, Concerns: Zone or point, Type: Arming Event, Description: Night mode deactivated using device, Account: XXXXXXX, Receiver: None, Prefix: L0, Timestamp: 2020-08-17 12:09:36, Length: 00A2, Sequence: 5255, CRC: 714A, Calc CRC: 714A, Message type: Arming Event, Encrypted Content: 500FE215294956F389BAC0030ACDDD1F038A6ABDF49723C4B3E0B8E150735E69DF8A20D7F394CC1C43B0F0F12B3858C5984F67112CF28A1336714BB2B7142E53, Full Message: "*SIA-DCS"5255L0#XXXXXXX[500FE215294956F389BAC0030ACDDD1F038A6ABDF49723C4B3E0B8E150735E69DF8A20D7F394CC1C43B0F0F12B3858C5984F67112CF28A1336714BB2B7142E53..
2020-08-17 14:09:35 INFO (MainThread) [custom_components.sia] Unhandled event code, will be set as attribute in the heartbeat sensor. Code is: NP, Message: 501, Full event: Code: NP, Type: Arming Event,             Description: Night mode deactivated using device
2020-08-17 14:09:36 DEBUG (MainThread) [pysiaalarm.aio.sia_server] Incoming line: 9C2400A2"*SIA-DCS"5256L0#XXXXXXX[71C5C2895F6B5282905C7D0BB5485A09098F25D5C3C43603A4C3290429622186F0F90AC41615473BE02C89F014B8D0730E64813EA709B2529E05075EFA426532
2020-08-17 14:09:36 DEBUG (MainThread) [pysiaalarm.base_sia_server] Parsed event: Content: Q,TMN|#XXXXXXX|Nri2/NP501]_12:09:37,08-17-2020, Zone: 2, Code: NP, Message: 501, Concerns: Zone or point, Type: Arming Event, Description: Night mode deactivated using device, Account: XXXXXXX, Receiver: None, Prefix: L0, Timestamp: 2020-08-17 12:09:37, Length: 00A2, Sequence: 5256, CRC: 9C24, Calc CRC: 9C24, Message type: Arming Event, Encrypted Content: 71C5C2895F6B5282905C7D0BB5485A09098F25D5C3C43603A4C3290429622186F0F90AC41615473BE02C89F014B8D0730E64813EA709B2529E05075EFA426532, Full Message: "*SIA-DCS"5256L0#XXXXXXX[71C5C2895F6B5282905C7D0BB5485A09098F25D5C3C43603A4C3290429622186F0F90AC41615473BE02C89F014B8D0730E64813EA709B2529E05075EFA426532..
2020-08-17 14:09:36 INFO (MainThread) [custom_components.sia] Unhandled event code, will be set as attribute in the heartbeat sensor. Code is: NP, Message: 501, Full event: Code: NP, Type: Arming Event,             Description: Night mode deactivated using device

Let me know if you need more detailed logs.

access device registry

Version of the custom_component and HA setup (version, OS, etc)

Configuration

Home Assistant Core 2022.6.1
Home Assistant Supervisor 2022.05.3
Home Assistant OS 8.1


SIA v1.0.0-beta1

Describe the bug

Logger: homeassistant.helpers.frame
Source: helpers/frame.py:103
First occurred: 16:41:28 (2 occurrences)
Last logged: 16:41:34

Detected integration that uses deprecated async_get_registry to access device registry, use async_get instead. Please report issue to the custom component author for sia using this method at custom_components/sia/hub.py, line 59: device_registry = await dr.async_get_registry(self._hass)

Debug log


Add your logs here.

Ajax alarm - individual binary sensors for each zone and night mode

Is your feature request related to a problem? Please describe.
As discussed here: https://community.home-assistant.io/t/ajax-alarm-system/62853/190?u=fireon
The HA alarm component can only hold one state at a time, whereas the Ajax alarm can arm a zone and at the same time have the night mode turned on or off. This means that the HA alarm component does not truly reflect all the simultaneous state possibilities that can be seen in the Ajax app.

In Ajax, you can also choose to only have particular devices activated during night mode. For example, I have three zones, 1 for home, 2 for the storehouse/garage, and 3 for the patio. When I activate night mode it only spans across zone 2 and 3 but zone 2 is typically always armed. In HA I therefore want to be able to see if zone 2 is armed (by normal arming) and separately if the night mode is also armed. I can see that in the Ajax app but not with the alarm component in HA since it cannot be set to armed_away or armed_night at the same time.

I therefore risk to forget to properly arm zone 2 if I see that night mode is activated. Next morning when night mode is deactivated zone 2 will therefore be totally unarmed. Today I have a notification automation running when zone 2 has been unarmed for too long, just to remind me to arm it. That automation is not possible (or has to consider multiple states) with the alarm component since the night mode could interfere with the actual state of the zone, thereby tricking you into thinking that the zone is armed when it is only armed for night mode. This is a little bit hard to explain but I hope you understand what I am meaning.

Describe the solution you'd like
The main part of the component could be kept as is but I would like to be able to include an individual binary sensor (with on as armed and off as unarmed) for each zone and for the night mode. This should not be too much of a change and it could also be an optional setting in the setup dialog if you want the additional binary sensors or not, In my case they would be named binary_sensor.ajax_zone1, binary_sensor.ajax_zone2, binary_sensor.ajax_zone3 and binary_sensor.ajax_night_mode. This also enables you to more easily write automations that listens to if the night mode or zone is armed or not.

Additional context
I am still using CheaterDev's SIA component with some modifications to support multiple zones, additional SIA codes, and a change that actually resets the alarm state to "safe" upon disarming after a triggered alarm. I have attached the init.py I am using below for reference. Sorry for my coding skills, I am not a programmer :)

I do like the alarm component integration in this version and the fact that it is regularly maintained :) So I would really like to switch to this version but since I have a lot of automations listening to the different binary sensors I am hesitant on moving since I cannot separate the night mode state from the zoned states.

import asyncio
import logging
import json
import voluptuous as vol
import sseclient
import requests
import time
from collections import defaultdict
from requests_toolbelt.utils import dump
from homeassistant.core import callback
import voluptuous as vol
from datetime import timedelta
from homeassistant.exceptions import TemplateError
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity, async_generate_entity_id
from homeassistant.helpers.event import async_track_state_change

from threading import Thread
from homeassistant.helpers import discovery
from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.helpers.restore_state import RestoreEntity
_LOGGER = logging.getLogger(__name__)
from homeassistant.const import (STATE_ON, STATE_OFF)

from homeassistant.const import (
    CONF_NAME, CONF_PORT, CONF_PASSWORD)
import socketserver 
from datetime import datetime
import time
import logging
import threading
import sys
import re

from Crypto.Cipher import AES
from binascii import unhexlify,hexlify
from Crypto import Random
import random, string, base64
from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.util.dt import utcnow

DOMAIN = 'sia'
CONF_HUBS = 'hubs'
CONF_ACCOUNT = 'account'

HUB_CONFIG = vol.Schema({
    vol.Required(CONF_NAME): cv.string,
    vol.Required(CONF_ACCOUNT): cv.string,
    vol.Optional(CONF_PASSWORD):cv.string,
})



CONFIG_SCHEMA = vol.Schema({
    DOMAIN: vol.Schema({
        vol.Required(CONF_PORT): cv.string,
        vol.Required(CONF_HUBS, default={}):
            vol.All(cv.ensure_list, [HUB_CONFIG]),
    }),
}, extra=vol.ALLOW_EXTRA)

ID_STRING = '"SIA-DCS"'.encode()
ID_STRING_ENCODED = '"*SIA-DCS"'.encode()

TIME_TILL_UNAVAILABLE = timedelta(minutes=3)

ID_R='\r'.encode()

hass_platform = None


def setup(hass, config):
    global hass_platform
    socketserver.TCPServer.allow_reuse_address = True
    hass_platform = hass

    hass_platform.data[DOMAIN] = {}

    port = int(config[DOMAIN][CONF_PORT])

    for hub_config in config[DOMAIN][CONF_HUBS]:
        if CONF_PASSWORD in hub_config:
            hass.data[DOMAIN][hub_config[CONF_ACCOUNT]] = EncryptedHub(hass, hub_config)
        else:
            hass.data[DOMAIN][hub_config[CONF_ACCOUNT]] = Hub(hass, hub_config)
          
    for component in ['binary_sensor']:
       discovery.load_platform(hass, component, DOMAIN, {}, config)

    server = socketserver.TCPServer(("", port), AlarmTCPHandler)

    t = threading.Thread(target=server.serve_forever)
    t.start()
    
    return True

class Hub:
    reactions = {            

            # Zone 1 - Hem
            "Nri1/BA" : [{"state":"ALARM_ZONE1","value":True}],
            "Nri1/BR" : [{"state":"ALARM_ZONE1","value":False}],
            "Nri1/TA" : [{"state":"ALARM_ZONE1","value":True}],
            "Nri1/TR" : [{"state":"ALARM_ZONE1","value":False}],
            "Nri1/CG" : [{"state":"STATUS_ZONE1","value":False}],
            "Nri1/CF" : [{"state":"STATUS_ZONE1","value":False}],
            "Nri1/CL" : [{"state":"STATUS_ZONE1","value":False}],
            "Nri1/OG" : [{"state":"STATUS_ZONE1","value":True}],
            "Nri1/OP" : [{"state":"STATUS_ZONE1","value":True}],
            "Nri1/NF" : [{"state":"STATUS_NIGHT_MODE","value":False}],
            "Nri1/NL" : [{"state":"STATUS_NIGHT_MODE","value":False}],
            "Nri1/NP" : [{"state":"STATUS_NIGHT_MODE","value":True}],
            "Nri1/WA":  [{"state":"LEAK_ZONE1","value":True}],
            "Nri1/WH":  [{"state":"LEAK_ZONE1","value":False}],
            "Nri1/GA":  [{"state":"GAS_ZONE1","value":True}],
            "Nri1/GH":  [{"state":"GAS_ZONE1","value":False}],
            "Nri1/XC" : [],
            "Nri1/XL" : [],

            # Zone 2 - Förråd
            "Nri2/BA" : [{"state":"ALARM_ZONE2","value":True}],
            "Nri2/BR" : [{"state":"ALARM_ZONE2","value":False}],
            "Nri2/TA" : [{"state":"ALARM_ZONE2","value":True}],
            "Nri2/TR" : [{"state":"ALARM_ZONE2","value":False}],
            "Nri2/CG" : [{"state":"STATUS_ZONE2","value":False}],
            "Nri2/CF" : [{"state":"STATUS_ZONE2","value":False}],
            "Nri2/CL" : [{"state":"STATUS_ZONE2","value":False}],
            "Nri2/OG" : [{"state":"STATUS_ZONE2","value":True}],
            "Nri2/OP" : [{"state":"STATUS_ZONE2","value":True}],
            "Nri2/NF" : [],
            "Nri2/NL" : [],
            "Nri2/NP" : [],
            "Nri2/WA":  [],
            "Nri2/WH":  [],
            "Nri2/GA":  [],
            "Nri2/GH":  [],
            "Nri2/NF" : [],
            "Nri2/XC" : [],
            "Nri2/XL" : [],

            # Zone 3 - Uteplats
            "Nri3/BA" : [{"state":"ALARM_ZONE3","value":True}],
            "Nri3/BR" : [{"state":"ALARM_ZONE3","value":False}],
            "Nri3/TA" : [{"state":"ALARM_ZONE3","value":True}],
            "Nri3/TR" : [{"state":"ALARM_ZONE3","value":False}],
            "Nri3/CG" : [{"state":"STATUS_ZONE3","value":False}],
            "Nri3/CF" : [{"state":"STATUS_ZONE3","value":False}],
            "Nri3/CL" : [{"state":"STATUS_ZONE3","value":False}],
            "Nri3/OG" : [{"state":"STATUS_ZONE3","value":True}],
            "Nri3/OP" : [{"state":"STATUS_ZONE3","value":True}],
            "Nri3/NF" : [],
            "Nri3/NL" : [],
            "Nri3/NP" : [],
            "Nri3/WA":  [],
            "Nri3/WH":  [],
            "Nri3/GA":  [],
            "Nri3/GH":  [],
            "Nri3/NF" : [],
            "Nri3/XC" : [],
            "Nri3/XL" : [],

            # Other
            "Nri0/RP" : [],
            "Nri0/RS" : [],
            "Nri0/YG" : []
        }

    # -----------------------------------------------------------------------------------------------
    # Mod: reset alarm state when disarmed
    reactions_reset_alarm_state_on_disarm = {            

            # Zone 1 - Hem
            "Nri1/OG" : [{"state":"ALARM_ZONE1","value":False}],
            "Nri1/OP" : [{"state":"ALARM_ZONE1","value":False}],

            # Zone 2 - Förråd
            "Nri2/OG" : [{"state":"ALARM_ZONE2","value":False}],
            "Nri2/OP" : [{"state":"ALARM_ZONE2","value":False}],

            # Zone 3 - Uteplats
            "Nri3/OG" : [{"state":"ALARM_ZONE3","value":False}],
            "Nri3/OP" : [{"state":"ALARM_ZONE3","value":False}],
        }
    # -----------------------------------------------------------------------------------------------

    def __init__(self, hass, hub_config):
        self._name = hub_config[CONF_NAME]
        self._accountId = hub_config[CONF_ACCOUNT]
        self._hass = hass
        self._states = {}
        self._states["LEAK_ZONE1"] = SIABinarySensor("sia_leak_zone1_" + self._name,"moisture" , hass)
        self._states["GAS_ZONE1"] = SIABinarySensor("sia_gas_zone1_" + self._name,"smoke", hass)
        self._states["ALARM_ZONE1"]  = SIABinarySensor("sia_alarm_zone1_" + self._name,"safety", hass)
        self._states["STATUS_ZONE1"]  = SIABinarySensor("sia_status_zone1_" + self._name, "lock", hass)
        self._states["STATUS_NIGHT_MODE"]  = SIABinarySensor("sia_status_night_mode_" + self._name, "lock", hass)
        # self._states["LEAK_ZONE2"] = SIABinarySensor("sia_leak_zone2_" + self._name,"moisture" , hass)
        # self._states["GAS_ZONE2"] = SIABinarySensor("sia_gas_zone2_" + self._name,"smoke", hass)
        self._states["ALARM_ZONE2"]  = SIABinarySensor("sia_alarm_zone2_" + self._name,"safety", hass)
        self._states["STATUS_ZONE2"]  = SIABinarySensor("sia_status_zone2_" + self._name, "lock", hass)
        # self._states["LEAK_ZONE3"] = SIABinarySensor("sia_leak_zone3_" + self._name,"moisture" , hass)
        # self._states["GAS_ZONE3"] = SIABinarySensor("sia_gas_zone3_" + self._name,"smoke", hass)
        self._states["ALARM_ZONE3"]  = SIABinarySensor("sia_alarm_zone3_" + self._name,"safety", hass)
        self._states["STATUS_ZONE3"]  = SIABinarySensor("sia_status_zone3_" + self._name, "lock", hass)
    
    def manage_string(self, msg):
        _LOGGER.debug("manage_string: " + msg)
        
        pos = msg.find('/')        
        assert pos>=0, "Can't find '/', message is possibly encrypted"
        # tipo = msg[pos+1:pos+3]
        tipo = msg[pos-4:pos+3]

        if tipo in self.reactions:
            reactions = self.reactions[tipo]
            for reaction in reactions:
                state = reaction["state"]
                value = reaction["value"]
             
                self._states[state].new_state(value)

            # -----------------------------------------------------------------------------------------------
            # Mod: reset alarm state when disarmed
            if tipo in self.reactions_reset_alarm_state_on_disarm:
                reactions_reset_alarm_state_on_disarm = self.reactions_reset_alarm_state_on_disarm[tipo]
                for reaction in reactions_reset_alarm_state_on_disarm:
                    state = reaction["state"]
                    value = reaction["value"]
                 
                    self._states[state].new_state(value)
            # -----------------------------------------------------------------------------------------------

        else:
            _LOGGER.error("unknown event: " + tipo )
        
        for device in self._states:
           self._states[device].assume_available()



    def process_line(self, line):
        _LOGGER.debug("Hub.process_line" + line.decode())
        pos = line.find(ID_STRING)
        assert pos>=0, "Can't find ID_STRING, check encryption configs"
        seq = line[pos+len(ID_STRING) : pos+len(ID_STRING)+4]
        data = line[line.index(b'[') :]
        _LOGGER.debug("Hub.process_line found data: " + data.decode())
        self.manage_string(data.decode())
        return '"ACK"'  + (seq.decode()) + 'L0#' + (self._accountId) + '[]'
        

class EncryptedHub(Hub):
    def __init__(self, hass, hub_config):
        self._key = hub_config[CONF_PASSWORD].encode("utf8")
        iv = Random.new().read(AES.block_size)
        _cipher = AES.new(self._key, AES.MODE_CBC, iv)
        self.iv2 = None
        self._ending = hexlify(_cipher.encrypt( "00000000000000|]".encode("utf8") )).decode(encoding='UTF-8').upper()
        Hub.__init__(self, hass, hub_config)

    def manage_string(self, msg):
        iv = unhexlify("00000000000000000000000000000000") #where i need to find proper IV ? Only this works good.
        _cipher = AES.new(self._key, AES.MODE_CBC, iv)
        data = _cipher.decrypt(unhexlify(msg[1:]))
        _LOGGER.debug("EncryptedHub.manage_string data: " + data.decode(encoding='UTF-8',errors='replace'))

        data = data[data.index(b'|'):]
        resmsg = data.decode(encoding='UTF-8',errors='replace')
               
        Hub.manage_string(self, resmsg)

    def process_line(self, line):
        _LOGGER.debug("EncryptedHub.process_line" + line.decode())
        pos = line.find(ID_STRING_ENCODED)
        assert pos>=0, "Can't find ID_STRING_ENCODED, is SIA encryption enabled?"
        seq = line[pos+len(ID_STRING_ENCODED) : pos+len(ID_STRING_ENCODED)+4]
        data = line[line.index(b'[') :]
        _LOGGER.debug("EncryptedHub.process_line found data: " + data.decode())
        self.manage_string(data.decode())
        return '"*ACK"'  + (seq.decode()) + 'L0#' + (self._accountId) + '[' + self._ending
  
        

class SIABinarySensor( RestoreEntity):
    def __init__(self,  name, device_class, hass):
        self._device_class = device_class
        self._should_poll = False
        self._name = name
        self.hass = hass
        self._is_available = True
        self._remove_unavailability_tracker = None

    async def async_added_to_hass(self):
        await super().async_added_to_hass()
        state = await self.async_get_last_state()        
        if state is not None and state.state is not None:
            self._state = state.state == STATE_ON
        else:
            self._state = None
        self._async_track_unavailable()

    @property
    def name(self):
        return self._name

    @property
    def state(self):
        return STATE_ON if self.is_on else STATE_OFF

    @property
    def unique_id(self) -> str:
        return self._name

    @property
    def available(self):
        return self._is_available

    @property
    def device_state_attributes(self):
        attrs = {}
        return attrs

    @property
    def device_class(self):
        return self._device_class

    @property
    def is_on(self):
        return self._state

    def new_state(self, state):   
        self._state = state
        self.async_schedule_update_ha_state()

    def assume_available(self):
        self._async_track_unavailable()

    @callback
    def _async_track_unavailable(self):
        if self._remove_unavailability_tracker:
            self._remove_unavailability_tracker()
        self._remove_unavailability_tracker = async_track_point_in_utc_time(
            self.hass, self._async_set_unavailable,
            utcnow() + TIME_TILL_UNAVAILABLE)
        if not self._is_available:
            self._is_available = True
            return True
        return False

    @callback
    def _async_set_unavailable(self, now):
        self._remove_unavailability_tracker = None
        self._is_available = False
        self.async_schedule_update_ha_state()

class AlarmTCPHandler(socketserver.BaseRequestHandler):
    _received_data = "".encode()

    def handle_line(self, line):   
        _LOGGER.debug("Income raw string: " + line.decode())     
        accountId = line[line.index(b'#') +1: line.index(b'[')].decode()

        pos = line.find(b'"')
        assert pos>=0, "Can't find message beginning"
        inputMessage=line[pos:]
        msgcrc = line[0:4] 
        codecrc = str.encode(AlarmTCPHandler.CRCCalc(inputMessage))   
        try:
            if msgcrc != codecrc:
                raise Exception('CRC mismatch')            
            if(accountId not in hass_platform.data[DOMAIN]):
                raise Exception('Not supported account ' + accountId)
            response = hass_platform.data[DOMAIN][accountId].process_line(line)
        except Exception as e:
            _LOGGER.error(str(e))
            timestamp = datetime.fromtimestamp(time.time()).strftime('_%H:%M:%S,%m-%d-%Y')
            response = '"NAK"0000L0R0A0[]' + timestamp

        header = ('%04x' % len(response)).upper()
        CRC = AlarmTCPHandler.CRCCalc2(response)
        response="\n" + CRC + header + response + "\r"

        byte_response = str.encode(response)
        self.request.sendall(byte_response)


    def handle(self):
        line = b''
        try:
            while True:
                raw = self.request.recv(1024)
                if (not raw) or (len(raw) == 0):
                    return
                raw = bytearray(raw)
                while True:
                    splitter = raw.find(b'\r')
                    if splitter> -1:
                        line = raw[1:splitter]
                        raw = raw[splitter+1:]
                    else:
                        break
                    
                    self.handle_line(line)
        except Exception as e: 
            _LOGGER.error(str(e)+" last line: " + line.decode())
            return

    @staticmethod
    def CRCCalc(msg):
        CRC=0
        for letter in msg:
            temp=(letter)
            for j in range(0,8):  # @UnusedVariable
                temp ^= CRC & 1
                CRC >>= 1
                if (temp & 1) != 0:
                    CRC ^= 0xA001
                temp >>= 1
                
        return ('%x' % CRC).upper().zfill(4)
    
    @staticmethod
    def CRCCalc2(msg):
        CRC=0
        for letter in msg:
            temp=ord(letter)
            for j in range(0,8):  # @UnusedVariable
                temp ^= CRC & 1
                CRC >>= 1
                if (temp & 1) != 0:
                    CRC ^= 0xA001
                temp >>= 1
                
        return ('%x' % CRC).upper().zfill(4)

Compatibility with SIA ADM-CID

Hello,
My alarm implement SIA Adm-cid.
Can i use your integration?
Here a message example:
62980029"ADM-CID"6431R0L0#AAAA[#AAAA|3441 01 070]

Issue removing integration via HACS repository

As a component now is an official one I'm trying to remove it from HACS and install it using HA integrations.
But uninstalling the the integration via HACS fails:

After I unistall it and restart HA component is still in the list of installed ones and asking for upgrade.

2021-06-04 21_22_46-Community - Home Assistant

last state

After reboot home assistant, the alarm_control_panel state is always disarmed.
How to restore the real state ?

Lack of configuration info

I installed your component using HACS. It does not work.
I guess it's my fault: probably I did something wrong in the Ajax Hub configuration I did using the mobile app.

To configure your component, I copied and pasted on configuration.yaml the following code taken from here

sia:
  port:  port
  hubs:
    - name: hubname
      account: account
      encryption_key: password
      zones:
        - zone: 1
          name: zonename
          sensors:
           - alarm
           - moisture
           - smoke

In particular, I have the following questions:

  1. port is a port number that I can invent (e.g. 4628)?
  2. account is the username used to get access on the mobile app?
  3. password is the password of the mobile app, or is the encryption key described here?

I also guess that, in order to make a Hub interwork with your custom component, it is necessary also to configure it using the mobile App (e.g. following these instructions here). What it is not clear to me are the following additional configuration items:

  1. The port of the SIA protocol must be the same of the one defined in Home Assistant, at point 1.?
  2. The under the Primary ip address section, the Ip address must be setup to be the ip address of the machine hosting Home Assistant, right?
  3. The under the Primary ip address section, the Port must be setup to be the http port of the machine hosting Home Assistant (whose default value is 8123), right?

Without these precious information, it is rather difficult to successfully install and make your wonderful component work.

Regards,
Vincenzo

Filtering device - Ajax

Hi,

Just an issue to tell you that Teams Ajax told me that SIA send also the number of the device in the SIA packet.

This is the email :

Dear client,
 
When you receive a notification about, for example, opening/closing a door, the SIA line should also indicate the group number and the number of the device that generated the event.

tt

When I listen SIA event in nodred, I see that it seems the content message but indicate 502 for example with 2 which is the device number (I tested with devices and it's the only number that change:

image

[Honeywell FX020] Failed to Communicate

I'm trying to use this component with my Honeywell Galaxy Flex 20 (FX020), firmware version 3.0.2.

Version of the custom_component and HA setup (version, OS, etc)

HA: 0.116.4
Component: master, but also tested beta

Configuration

Not relevant.

Describe the bug

The alarm system also reports that it can't communicate with the server (FTC). And the component also got a task exception that it can't read the test message, I think.

Debug log

2020-10-28 19:14:25 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/pysiaalarm/aio/sia_server.py", line 50, in handle_line
    line = str.strip(data.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 2: invalid start byte

Error sia_server.py", line 50, in handle_line line = str.strip(data.decode("ascii"))

Hi,
sometimes I get this error in the log:

2021-01-18 20:50:04 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/pysiaalarm/aio/sia_server.py", line 50, in handle_line
line = str.strip(data.decode("ascii"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 20: ordinal not in range(128)

I cat give more examples or info if needed

Version of the custom_component and HA setup (version, OS, etc)

SIA
v0.3.10
HA
Version core-2021.1.4
supervisor-2021.01.5
Operating System Raspbian GNU/Linux 10 (buster)
Docker version 19.03.13

Configuration

Describe the bug

Debug log

2021-01-18 20:50:04 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/pysiaalarm/aio/sia_server.py", line 50, in handle_line
line = str.strip(data.decode("ascii"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 20: ordinal not in range(128)

Scene

When the system is armed through a scene, it does not send the armed status to homeassistant

Error when disarming from 'armed_night'

Version of the custom_component

installed commit: 85d405b

Configuration

sia:
  port:  3000
  hubs:
    - name: SwinglineAX
      account: xxxx
      encryption_key: xxxxxxxxxxxxxxxx
      ping_interval: 1
      zones:
        - zone: 1
          name: home
          sensors:
            - alarm

Describe the bug

First I would like to say that I really appreciate this component and the work you have put in.

When disarming from the armed_away mode everything works as intended.
When disarming from the armed_night mode the alarm-card is not changed (still in armed_night mode) and the log records an error as seen in the debug log below.

Debug log


2019-09-15 23:27:43 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_1_alarm to state: armed_night
2019-09-15 23:27:56 ERROR (Thread-2) [custom_components.sia] 
2019-09-15 23:28:15 DEBUG (Thread-2) [custom_components.sia] Incoming parsed: |#xxxx|Nri0/RP0000]_21:28:20,09-15-2019 to sia: Code: RP, Type: Automatic Test, Description: Automatic communication test report, Concerns: Unused for zone: 0 with message: RP0000
2019-09-15 23:28:15 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_last_heartbeat to state: utcnow()
2019-09-15 23:28:28 DEBUG (Thread-2) [custom_components.sia] Incoming parsed: |#xxxx|Nri1/NL501]_21:28:33,09-15-2019 to sia: Code: NL, Type: Perimeter Armed, Description: An area has been perimeter armed, Concerns: Area number for zone: 1 with message: NL501
2019-09-15 23:28:28 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_1_alarm to state: armed_night
2019-09-15 23:29:04 ERROR (Thread-2) [custom_components.sia] 
2019-09-15 23:29:15 DEBUG (Thread-2) [custom_components.sia] Incoming parsed: |#xxxx|Nri0/RP0000]_21:29:20,09-15-2019 to sia: Code: RP, Type: Automatic Test, Description: Automatic communication test report, Concerns: Unused for zone: 0 with message: RP0000
2019-09-15 23:29:15 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_last_heartbeat to state: utcnow()
2019-09-15 23:29:28 DEBUG (Thread-2) [custom_components.sia] Incoming parsed: |#xxxx|Nri1/CG501]_21:29:33,09-15-2019 to sia: Code: CG, Type: Close Area, Description: System has been partially armed, Concerns: Area number for zone: 1 with message: CG501
2019-09-15 23:29:28 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_1_alarm to state: armed_away
2019-09-15 23:29:29 DEBUG (Thread-2) [custom_components.sia] Incoming parsed: |#xxxx|Nri1/OG501]_21:29:34,09-15-2019 to sia: Code: OG, Type: Open Area, Description: System has been partially disarmed, Concerns: Area number for zone: 1 with message: OG501
2019-09-15 23:29:29 DEBUG (Thread-2) [custom_components.sia] Will set state for entity: SwinglineAX_1_alarm to state: disarmed


HA Homekit Bridge - Nigh Mode - Ajax Security status is not updated if night mode set by automation trigger

Hi. I am using HA + SIA + Homekit Bridge module to integrate leak/fire sensors and security status to homekit and this staff seems to be work correctly except one strange issue with getting night mode status in the homekit. When I change Ajax security status manually (in app or using pad/spacecontrol) status updating correctly in homekit but when I set nigh mode using ajax automation it's not updated in the homekit. ( strange, but backing to disarming works as expected) So what kind of issue is this, plugin or something on the homekit bridge side?

Entity id already exists: sensor.ajax_last_heartbeat - No dynamically added sensors

Version of the custom_component and HA setup (version, OS, etc)

Configuration


Add your configuration here.
sia:
  port: 1241
  hubs:
    - name: Ajax
      account: AAA

Describe the bug

Issue when adding first time setup.

Can only get the sensor for heartbeat, no other devices or sensors are added dynamically as stated in the readme

Debug log

2019-12-04 23:22:09 INFO (MainThread) [homeassistant.components.sensor] Setting up sensor.sia
2019-12-04 23:22:09 DEBUG (MainThread) [custom_components.sia.sensor] SIASensor: setup: devices: [<Entity Ajax Last heartbeat: 2019-12-04T23:22:08.412404+00:00>]
2019-12-04 23:22:09 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 399, in _async_add_entity
raise HomeAssistantError(msg)
homeassistant.exceptions.HomeAssistantError: Entity id already exists: sensor.ajax_last_heartbeat

Leaksprotect sensor

Getting an error message for a leak sensor.

Log Details (ERROR)
Logger: custom_components.sia
Source: custom_components/sia/init.py:437
Integration: Sia
First occurred: 2:12:11 PM (1 occurrences)
Last logged: 2:12:11 PM

Hub: Process Event: CRC: 6702, Calc CRC: 6702, Full Message: "SIA-DCS"0174L0#FF8B[#FF8B|Nri1/WA1]_14:12:10,05-01-2020, Message type: SIA-DCS, Sequence: 0174, Receiver: , Prefix: L0, Account: FF8B, Encrypted Content: , Content: #FF8B|Nri1/WA1]_14:12:10,05-01-2020, Zone: 1, Code: WA, Message: 1, Timestamp: 14:12:10,05-01-2020, Code: WA, Type: Water Alarm, Description: Water detected at protected premises, Concerns: Zone or point gave error can only concatenate str (not "bool") to str

Connect via RS232

I have a Galaxy XL with a serial interface, which can interface with a PAC via SIA.
Is it possible to / simple to add a serial port to the connection methods?

Another option is possibly use ser2net to convert serial to IP. Do you happen to know if this is possible?
I don't know if the protocol via serial is the same as via IP. I expect encryption is not used. If this can be switched off, it possibly works.

Another question: What is the difference between you HA integration and the one of Cheaterdev, which you forked?

SIA does not connect to HA

SIA does not connect to HA
Cheaterdev's component instantly establishes connections.
I don't have any zones
My config:
sia:
port: !secret ajax_port
hubs:
- name: Ajax_Home
account: !secret ajax_account
encryption_key: !secret ajax_password
ping_interval: 1
zones:
- zone: 1
name: House
sensors:
- alarm
- moisture
- smoke

Logging is enabled
logger:
default: info
logs:
custom_components.sia: debug

the Cheaterdev's component in the log writes the following:
2020-07-16 18:10:07 DEBUG (Thread-2) [custom_components.sia] Income raw string: 7E650078"*SIA-DCS"0428L0#58AD94[42858A01ED40B4D4137A3E751DC77E5A6E7592146999039FE3B2A0220861197B7A7CF35740E6A26351476875705F4576
2020-07-16 18:10:07 DEBUG (Thread-2) [custom_components.sia] EncryptedHub.process_line7E650078"*SIA-DCS"0428L0#58AD94[42858A01ED40B4D4137A3E751DC77E5A6E7592146999039FE3B2A0220861197B7A7CF35740E6A26351476875705F4576
2020-07-16 18:10:07 DEBUG (Thread-2) [custom_components.sia] EncryptedHub.process_line found data: [42858A01ED40B4D4137A3E751DC77E5A6E7592146999039FE3B2A0220861197B7A7CF35740E6A26351476875705F4576
2020-07-16 18:10:07 DEBUG (Thread-2) [custom_components.sia] EncryptedHub.manage_string data: �Qy%�K^O \j|#58AD94|Nri0/YG0]_15:15:49,07-16-2020
2020-07-16 18:10:07 DEBUG (Thread-2) [custom_components.sia] manage_string: |#58AD94|Nri0/YG0]_15:15:49,07-16-2020
2020-07-16 18:10:07 ERROR (Thread-2) [custom_components.sia] unknown event: YG

Your component does not write anything to the log
except
2020-07-16 18:29:54 WARNING (MainThread) [homeassistant.loader] You are using a custom integration for sia which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable......

Error when trying to configure SIA

Version of the custom_component and HA setup (version, OS, etc)

I'm running HA core-2021.4.6
OS : Raspbian 10
SIA on branch from latest beta commit bbe80ec

Configuration

Trying to setup SIA integration. Only changing port to 8124 and Account to "AAA" as in example.

Describe the bug

Form is reseting and displaying "Unexpected error"

Debug log

May 08 09:38:12 pi hass[15841]: 2021-05-08 09:38:12 ERROR (MainThread) [custom_components.sia.config_flow] Unexpected exception
May 08 09:38:12 pi hass[15841]: Traceback (most recent call last):
May 08 09:38:12 pi hass[15841]:   File "/home/homeassistant/.homeassistant/custom_components/sia/config_flow.py", line 108, in async_step_user
May 08 09:38:12 pi hass[15841]:     await self.async_set_unique_id(f"{DOMAIN}_{self.data[CONF_PORT]}")
May 08 09:38:12 pi hass[15841]: TypeError: 'NoneType' object is not subscriptable

Last Heartbeat - Alarm status is not displayed in Homekit using Homekit Bridge.

Last Heartbeat - not added to Homekit using Homekit bridge.
Hi, First of all many thanks for your exceptional work! This plugin is really awesome but is there any solution to add Last Heartbeat sensor to Homekit? maybe as occupancy motion sensor? Homekit Bridge export only leak/gas and security status to homekit. Last Heartbeat is not displayed. Maybe there are something wrong with sensor settings or something wrong from the homekit side?

HACS keeps proposing v3.11 even if v4.0-beta2 is installed

Version of the custom_component and HA setup (version, OS, etc)

Configuration

Add your configuration here.

Describe the bug

A clear and concise description of what the bug is.

HACS keeps proposing v3.11 even if v4.0-beta2 is installed.
Probably a new release tag is missing ?

Debug log


Add your logs here.

Unhandled event type:

Version of the custom_component

Intalled Commit: 0289409

Configuration


sia:
port: 3000
hubs:
- name: 31 Quinn
account: ***
encryption_key: ***************
zones:
- zone: 1
name: Home
sensors:
- alarm
- zone: 2
name: Inside
sensors:
- alarm
- zone: 3
name: Outside Pet Friendly
sensors:
- alarm
- zone: 4
name: Outside Not Pet Friendly
sensors:
- alarm

*** I tried to format this YAML correctly, however it displays poorly formatted - the YAML is valid, I have format checked this via yamlint, it is just the formatting that is showing badly here. Not sure how to correct this when logging an issue - Yes, you guessed it, this is the first issue i have logged on github..

2019-09-11 20:19:13 WARNING (Thread-3) [custom_components.sia] Unhandled event type: Code: CG, Type: Close Area, Description: System has been partially armed, Concerns: Area number, Message: CG501
2019-09-11 20:19:14 WARNING (Thread-3) [custom_components.sia] Unhandled event type: Code: CF, Type: Forced Closing, Description: System armed, some zones not ready, Concerns: User number, Message: CF501
2019-09-11 20:19:14 WARNING (Thread-3) [custom_components.sia] Unhandled event type: Code: CG, Type: Close Area, Description: System has been partially armed, Concerns: Area number, Message: CG501
2019-09-11 20:19:14 WARNING (Thread-3) [custom_components.sia] Unhandled event type: Code: CG, Type: Close Area, Description: System has been partially armed, Concerns: Area number, Message: CG501



2019-09-11 20:49:26 WARNING (Thread-2) [custom_components.sia] Unhandled event type: Code: CG, Type: Close Area, Description: System has been partially armed, Concerns: Area number, Message: CG501
2019-09-11 20:49:27 WARNING (Thread-2) [custom_components.sia] Unhandled event type: Code: OG, Type: Open Area, Description: System has been partially disarmed, Concerns: Area number, Message: OG501
2019-09-11 20:49:28 WARNING (Thread-2) [custom_components.sia] Unhandled event type: Code: OG, Type: Open Area, Description: System has been partially disarmed, Concerns: Area number, Message: OG501

Describe the bug

Constantly receiving Unhandled event type error messages in the log.

I have installed the component via HACS, setup my Ajax alarm and configured HA, which I think is correct. I have not done anything special or weird, and I truly hope that I am not wasting your time by logging this.

The sensors have been setup in HA as expected, however, I believe due to the Unhandled event type, these sensors are not updating correctly. This is for basic arming and disarming events.

If you need any more testing done, please let me know, I cannot develop in python, but am more than happy to help debug and assist in any form of testing you may require.

Debug log

2019-09-11 21:00:14 DEBUG (Thread-3) [custom_components.sia] Income raw string: 12900075"*SIA-DCS"1682L0#FED[0796FD162A234FA69D50F2CECEBCB631FC055869C0081B3EE7C3A8AC37476C253BCDBBA1149E938E8CF00A20EAE6A955
2019-09-11 21:00:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line12900075"*SIA-DCS"1682L0#FED[0796FD162A234FA69D50F2CECEBCB631FC055869C0081B3EE7C3A8AC37476C253BCDBBA1149E938E8CF00A20EAE6A955
2019-09-11 21:00:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line found data: [0796FD162A234FA69D50F2CECEBCB631FC055869C0081B3EE7C3A8AC37476C253BCDBBA1149E938E8CF00A20EAE6A955
2019-09-11 21:00:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.manage_string data: dT65#\�@��|#FED|Nri0/RP0000]_19:00:13,09-11-2019
2019-09-11 21:00:14 DEBUG (Thread-3) [custom_components.sia] Parsing: |#FED|Nri0/RP0000]_19:00:13,09-11-2019
2019-09-11 21:01:14 DEBUG (Thread-3) [custom_components.sia] Income raw string: 18880075"*SIA-DCS"1683L0#FED[01AF5D6532FC084E1858765C03B2448547DFDB890BCB6D467F9973726737B35E69CADCD445A91697FB2DDF72348C35A8
2019-09-11 21:01:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line18880075"*SIA-DCS"1683L0#FED[01AF5D6532FC084E1858765C03B2448547DFDB890BCB6D467F9973726737B35E69CADCD445A91697FB2DDF72348C35A8
2019-09-11 21:01:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line found data: [01AF5D6532FC084E1858765C03B2448547DFDB890BCB6D467F9973726737B35E69CADCD445A91697FB2DDF72348C35A8
2019-09-11 21:01:14 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.manage_string data: ;X����S���|#FED|Nri0/RP0000]_19:01:13,09-11-2019
2019-09-11 21:01:14 DEBUG (Thread-3) [custom_components.sia] Parsing: |#FED|Nri0/RP0000]_19:01:13,09-11-2019
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] Income raw string: 15BB0075"*SIA-DCS"1684L0#FED[8F34A78503C3A6005D289AE5934F832B743417D0FB137BC0865AB01E6FF5DDE3706B585A13402C44A5D3BFAA143EB0D3
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line15BB0075"*SIA-DCS"1684L0#FED[8F34A78503C3A6005D289AE5934F832B743417D0FB137BC0865AB01E6FF5DDE3706B585A13402C44A5D3BFAA143EB0D3
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line found data: [8F34A78503C3A6005D289AE5934F832B743417D0FB137BC0865AB01E6FF5DDE3706B585A13402C44A5D3BFAA143EB0D3
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.manage_string data: (�_�Ek���O|#FED|Nri1/NL501]_19:01:20,09-11-2019
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] Parsing: |#FED|Nri1/NL501]_19:01:20,09-11-2019
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] Income raw string: BE980075"*SIA-DCS"1685L0#FED[FA0370307EABE5FC4AF264B0F205FCBE91D91E63E8B1840482A889DD3057089EEE4AF5995C6B1E3EE1BE5C76C820133D
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_lineBE980075"*SIA-DCS"1685L0#FED[FA0370307EABE5FC4AF264B0F205FCBE91D91E63E8B1840482A889DD3057089EEE4AF5995C6B1E3EE1BE5C76C820133D
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line found data: [FA0370307EABE5FC4AF264B0F205FCBE91D91E63E8B1840482A889DD3057089EEE4AF5995C6B1E3EE1BE5C76C820133D
|#FED|Nri3/NL501]_19:01:20,09-11-2019[custom_components.sia] EncryptedHub.manage_string data: � 4i�?��B=
2019-09-11 21:01:21 DEBUG (Thread-3) [custom_components.sia] Parsing: |#FED|Nri3/NL501]_19:01:20,09-11-2019
2019-09-11 21:01:22 DEBUG (Thread-3) [custom_components.sia] Income raw string: E69E0075"*SIA-DCS"1686L0#FED[32B6A0AC723F31107BCFCD8795AFC816705C1C400B0CEA349E40B95AD8814B18D80DB97B9F3C6DB4ABF745461E63D344
2019-09-11 21:01:22 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_lineE69E0075"*SIA-DCS"1686L0#FED[32B6A0AC723F31107BCFCD8795AFC816705C1C400B0CEA349E40B95AD8814B18D80DB97B9F3C6DB4ABF745461E63D344
2019-09-11 21:01:22 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.process_line found data: [32B6A0AC723F31107BCFCD8795AFC816705C1C400B0CEA349E40B95AD8814B18D80DB97B9F3C6DB4ABF745461E63D344
2019-09-11 21:01:22 DEBUG (Thread-3) [custom_components.sia] EncryptedHub.manage_string data: ���
2019-09-11 21:01:22 DEBUG (Thread-3) [custom_components.sia] Parsing: |#FED|Nri4/NL501]_19:01:20,09-11-2019


After install and config, getting "[custom_components.sia] list index out of range"

Just installed this component thru HACS and do receive an error saying:

image

Apart from this, Ajax app is unable to connect. It was able to connect when running the cheaterdev version (but then failing multiple zones, and therefore testing your version thru HACS).

HASSIO version: 0.99.2

Configuration

sia:
port: 8231
hubs:
- name: Alarm
account: AA

Describe the bug

A clear and concise description of what the bug is.
After installing, error message is shown under developer > logs view. The error message says

Log Details (ERROR)
Fri Sep 20 2019 21:13:20 GMT+0200 (Central European Summer Time)
list index out of range

Debug log

2019-09-20 21:23:47 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:23:48 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:23:48 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:23:48 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:24:49 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:24:51 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:24:51 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:24:51 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:25:53 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:25:54 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:25:54 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:25:54 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:26:56 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:26:57 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:26:57 ERROR (Thread-4) [custom_components.sia] list index out of range
2019-09-20 21:26:57 ERROR (Thread-4) [custom_components.sia] list index out of range

Disabling night mode doesn't work

Hi,

after setting the night mode, if I disable it using "Disarm" or "Night Mode Off", states on home assistant do not updates.

Many thanks,
Andrea

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.