Visonic Powermax and Powermaster Integration

Hi Dave,

Recently, I accidentally noticed that a sensor had run out of battery while reading the event list on the PowerMax Pro alarm screen. I must have gone several months without noticing. Previously, I received alarm notifications via SMS using the GSM-350 module integrated into the panel. But in France, 2G has practically disappeared, and SMS notifications no longer work.

Now, I’m looking for a solution to transfer the event log visible on the panel to Home Assistant. I’d like to be able to quickly identify a problem, for example, by displaying the latest events with their dates on the HA alarm dashboard. I never look at the panel directly; it’s not easily accessible. What would be the best way to achieve this?

For now, I’ve tried enabling log files in the “Alarm Panel Log File Settings” section of the integration configuration. I have filled in the path ./logs/visonic_log_file.xml and ./logs/visonic_log_file.csv, but these files are apparently not created (if they are created where I think they are). Not sure if I am in the right direction. I’m using 0.9.9.9 version of the integration.

Hi,
You don’t need to use the Event Log from the panel for this. However, if you want to then look at the visonic.alarm_panel_eventlog HA Action to create and populate the xml/csv files
Note that

  • This is nothing to do with the HA log file.
  • HA Events can be generated for this log (per row or at the end when complete), you set this as part of your configuration settings.
  • It takes time to download and generate the xml file so make use of the “Completion” HA Event in any Automation you create

There was a user years ago set up a card in HA to parse and display information from that file, you could do this too, but it’s a lot of effort so think about it.

So, like I said, you don’t need to use the Event Log from the panel. Every sensor has an attribute to tell you the battery status. However, know that this is either 0% or 100% as that is all the panel tells me i.e. battery good or bad, not the actual level. In the latest dev release the attribute is battery_level, I can’t remember what it’s called in 0.9.9.9 but have a look at the attributes of one of your sensors.

Also, in the latest dev release there’s an Action that does nothing other than return the sensor (and X10) state visonic.alarm_panel_zoneinfo. This earlier post explains a bit more about it. Notice that this includes a list of sensors with a battery level of 0%.

Does this help?

Hi Dave!

I have followed your guide integrating my Powermaster 10 with HA using a wired Ethernet device (USR-TCP232-T2). I was able to log onto the device and configure the IP/port etc. I also found the alarm and all the sensors when integrating with HACS. I can also see sensors triggered, e.g. when opening the front door the sensor toggles from closed to open.

However, now the panel says “no network” and “system error” and I cannot arm or disarm the alarm with neither the panel, remote controls nor in HA. Could this have anything to do with powering the panel with Ethernet? Do I need to configure the panel as well, like adding the IP to the broadband section? Sorry if I missed something obvious in your guide.

Hi,

When you say “Could this have anything to do with powering the panel with Ethernet?”
What do you mean? If you mean power over Ethernet then you should not be doing this! Are you powering the USR-TCP from the panels connector?

“Do I need to configure the panel as well, like adding the IP to the broadband section?”
No, for PowerMaster panels there are no panel settings that you need to get it working.

If you think that its a software/integration problem then can you please create an Issue in Github for this and if you want to then you can help work out what’s going wrong. I’ll need a Home Assistant log file uploading (winzip it first) in to the issue, please put this in to your configuration.yaml (and comment out any existing logger: entry)

To create an issue on Github go to Issues · davesmeghead/visonic and click the green new issue, give it a title, remind me about the problem and include a log file.

Thanks

Thank you for your reply!

Sorry, no I do not power over Ethernet. I simply meant connecting the panel with the Ethernet cable.

I’d love to get a second opinion on my work so far :slight_smile:

Hi @davesmeghead
I was just about to download and test 0.11.0.3 but I see you are already at 0.11.0.7.
Do you still want us to test 0.11.0.3 or should we test the latest 0.11.0.7?
I have a PowerMaster 30 if relevant.

Best regards

Hi, always use the latest dev release so 0.11.0.7 please

Just tried and now, for some reason, my original device has no entities, and I got 3 new devices.
Visonic Alarm Partition 1
Visonic Alarm Partition 2
Visonic Alarm Partition 3
The Visonic Alarm Partition 1 has the same entity as my original device:
alarm_control_panel.visonic_alarm

The 2 and 3 have: alarm_control_panel.visonic_alarm_partition_2 and alarm_control_panel.visonic_alarm_partition_3.

As far as I know, I do not use partitions in my install.

Is this expected?

Best regards

Edit 1: here is a log after integration reload:

Edit 2: I double checked my panel and partitioning is disabled.

Thank you Dave.
Here is what I have done. It may be useful for others !
First, I created a template sensor reading the Battery_level attributes of all Visonic sensors (binary_sensor.visonic_zxx) when they change and when HA starts. It then lists all entities whose attribute is 0. Finally, it keeps the friendly name of these entities for display. Here is the template :

Template
  - trigger:
      - platform: state
        entity_id:
          - binary_sensor.visonic_z01
          - binary_sensor.visonic_z02
          - binary_sensor.visonic_z03
          - binary_sensor.visonic_z04
          - binary_sensor.visonic_z05
        attribute: battery_level
      - platform: homeassistant
        event: start
    sensor:
      - name: "Piles faibles Visonic"
        unique_id: visonic_low_battery
        state: >
          {% set entities = [
            'binary_sensor.visonic_z01',
            'binary_sensor.visonic_z02',
            'binary_sensor.visonic_z03',
            'binary_sensor.visonic_z04',
            'binary_sensor.visonic_z05'
          ] %}
          {{ entities
              | select('is_state_attr', 'battery_level', 0)
              | list
              | count }}
        attributes:
          friendly_names: >
            {% set entities = [
              'binary_sensor.visonic_z01',
              'binary_sensor.visonic_z02',
              'binary_sensor.visonic_z03',
              'binary_sensor.visonic_z04',
              'binary_sensor.visonic_z05'
            ] %}
            {{ entities
              | select('is_state_attr', 'battery_level', 0)
              | map('state_attr', 'friendly_name')
              | list }}

Next, I use a Markdown card to display the result (the code bellow is embedded in a vertical-stack-in-card with other stuff…) :
:

  - type: markdown
    content: >
      {% set noms = state_attr('sensor.piles_faibles_visonic', 'friendly_names') %}
      {% if noms %}
      **Capteurs avec une batterie faible :** {{ noms | join(', ') }}
      {% else %}
      aucun ✅
      {% endif %}

Finally, you were right, it’s not that hard to do.
Thanks again :slight_smile:

Between your log file and a couple of others I’ve updated the partition logic and uploaded dev release 0.11.0.8 to Github, can you please give it a try, thanks

For me, 0.11.0.10 is not working at all, waited just like 2 minutes and reverted to “stable”, can try more tomorrow.

This was repeating at the end of the log:

2025-05-07 17:21:51.668 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_sequencer] SeqState=EPROMDoingDownload     Counter=9      PanelMode=DOWNLOAD     PanelState=['DOWNLOADING', 'UNKNOWN', 'UNKNOWN']     SendQueue=1
2025-05-07 17:21:51.731 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [sendPdu] Sent Command (Download Data Set)    waiting for message response ['0X2', '0X3F']
2025-05-07 17:21:51.762 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:51.852 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [processReceivedMessage] Received Download Block   raw data 3f c0 0b          response list []
2025-05-07 17:21:51.852 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:52.032 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [sendPdu] Sent Command (Download Data Set)    waiting for message response ['0X2', '0X3F']
2025-05-07 17:21:52.063 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:52.283 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [processReceivedMessage] Received Download Block   raw data 3f 00 19          response list []
2025-05-07 17:21:52.284 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:52.438 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [sendPdu] Sent Command (Download Data Set)    waiting for message response ['0X2', '0X3F']
2025-05-07 17:21:52.469 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:52.670 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_sequencer] SeqState=EPROMDoingDownload     Counter=10      PanelMode=DOWNLOAD     PanelState=['DOWNLOADING', 'UNKNOWN', 'UNKNOWN']     SendQueue=0
2025-05-07 17:21:52.690 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [processReceivedMessage] Received Download Block   raw data 3f b0 19          response list []
2025-05-07 17:21:52.690 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:52.844 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [sendPdu] Sent Command (Download Data Set)    waiting for message response ['0X2', '0X3F']
2025-05-07 17:21:52.877 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:53.078 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [processReceivedMessage] Received Download Block   raw data 3f 60 1a          response list []
2025-05-07 17:21:53.078 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:53.231 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [sendPdu] Sent Command (Download Data Set)    waiting for message response ['0X2', '0X3F']
2025-05-07 17:21:53.263 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True
2025-05-07 17:21:53.483 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [processReceivedMessage] Received Download Block   raw data 3f 00 b6          response list []
2025-05-07 17:21:53.483 DEBUG (MainThread) [custom_components.visonic.pyvisonic] [_processReceivedPacket] processAB=False processB0=False processNormalData=False    self.pmDownloadMode=True

I must admit that I’ve never before seen it fail during the EPROM download like that, any chance you still have a proper log file from a restart?

Yes, I think I have the full log after restart on my PC, will upload it tomorrow evening.
If I don’t have it I will for sure reinstall the dev version again and save the log.

Actually, using another persons log I think I’ve spotted the issue, just uploaded dev 0.11.0.11 to github so please try that :slight_smile:

EDIT: ignore 0.11.0.11, try 0.11.0.12 uploaded this morning to dev on github

Sorry, did not mange to find time for testing today, will try to test and report tomorrow evening.

@davesmeghead

I just tried 0.11.0.12 and this time it works a little better than previous dev versions but still some issues:

  1. My original entity “alarm_control_panel.visonic_alarm” is unavailable while a new entity got created “alarm_control_panel.visonic_alarm_2
  2. It takes much longer to connect than 0.9.9.9
  3. switch.visonic_pgm is unavailable
  4. All of my select.visonic_z01 - select.visonic_z12 are unavailable

Here is a full log after integration reload:

I just tried 0.11.0.12 and it seems that I achieved Powerlink mode without any issue.
The only issue I noticed is that one of my sensor is detected as a MAGNET instead of a MOTION.

Previously here was the relevant log:

2025-04-19 16:04:47.300 DEBUG (Dummy-1) [custom_components.visonic.pyvisonic] [Process Settings]      Z06 :  VisonicSensorRef=0X75   zoneInfo=0X7   ZTypeName=Perimeter   Chime=Off   SensorType=Motion   zoneName=Play room

Now I get

2025-05-09 21:51:46.802 DEBUG (Dummy-1) [custom_components.visonic.pyhelper]      key 5  Sensor id=6  partition=        bypass=0  lowbatt=0  status=0  tamper=0  enrolled=1  triggered=0  ztamper=0  ztrip=0  stype=MAGNET       model=MCT-302      sid=117 ztype=7  Loc=play_room      ztypeName=perimeter  zchime=chime_off

Thanks for trying it and confirming that it works OK.
Also, wow, you’re using an old version of the code, these 2 lines are in the current pyvisonic.py file if you care to take a look:

#   0x75 : ZoneSensorType("Next K9-85", AlSensorType.MOTION ),      # thermostat (Visonic part number 0-3592-B, NEXT K9-85 DDMCW)
   0x75 : ZoneSensorType("MCT-302", AlSensorType.MAGNET ),         # 15/9/23 rogerthn2019 (Powermax Pro) and others have this sensor so removed the previous setting, also ending in 5 should be a magnet

I changed this in September 2023 as many other users have device type 0x75 hex (decimal sid=117) as a Magnet MCT-302 sensor. So I’m sorry but I’m leaving it as a magnetic sensor, you seem to be the only one to have it as a motion sensor, but you can override it in Home Assistant to make it a Motion sensor.

Yes the integration was working perfectly so I didn’t feel the need to upgrade.
It is a bit weird that we have different sensors but with the same identifiers.
Anyway as you said, this is no big deal.
Thanks !

@davesmeghead would you prefer if I create an issue at GitHub for easier tracking?
Currently and for the past months 0.9.9.9 has been working absolutely perfectly with my panel so I really hope future versions can continue to work.
I’ve been using your custom component for years and will happily help with any tests and logs that you might need :blush: