Create Syncback Sensors
Home Assistant General

The following script can be added to Syncback Pro to set a sensor for each Profile when the backup completes each will be prefixed with sensor.syncback_, when attached to a profile the script will create or update a sensor for the backup selected.
The friendly name will be set to the Profile name and the Result set to the result of the run.
To use create Long access Token in your Home Assistant Profile and replace TOKEN in the script with your token.
Note: The datetime field in the attributes is to ensure the Last Updated time on the entity is updated.
The Json string sent to Home assistant looks like this
{"entity_id": "sensor.syncback_home_assistant", "state": "ok", "attributes": {"result": "Success", "friendly_name": "Home Assistant", "area": "syncback", "count": "9", "datetime": "Wed 24 03 2021 09:08:08"}
Syncback Pro Basic Script
' ' Send Result of run to Home Assistant ' after a profile runs (if the run is simulated then it does not). ' ' SBLang=Basic ' ' ' The connection details for Home Assistant to send a message const HAToken = "TOKEN" const HAEntity = "sensor.syncback" ' ' This is a runtime script ' Function Description(ByRef ScriptType) Description = "Send Home Assistant Update" ScriptType = SCRIPTTYPE_RUN End Function ' ' This routine is called after the profile has finished. ' Sub RunProfileResult(ProfileResult, ErrMsg) Dim sUrl Dim sText Dim sJson Dim oXMLHTTP, sResult Dim SendHA Dim sAuth Dim sAttribute Dim sStatus Dim sDesc ' Check to see if the profile has run If SBRunning.Simulated then Exit Sub End If ' Get profile result SendHA = True Select Case ProfileResult Case 0 ' 0 = No result (ELR_None) SendHA = False Case 1 ' 1 = Unknown profile (ELR_UnknownProfile) SendHA = False Case 2 ' 2 = Profile is already running (ELR_AlreadyRunning) SendHA = False Case 3 ' 3 = Profile has been imported and not run yet (ELR_Imported) SendHA = False Case 4 ' 4 = Profile is running (ELR_Running) SendHA = False End Select ' Are we going to update HA? If SendHA = False then Exit Sub End If sStatus = "error" ' Build the Home Assistant message sDesc = "Profile " & SBRunning.Name & " finished on " & FormatDateTime(Now(), 0) & ":" sText = "" Select Case ProfileResult Case 5 sText = sText & "Internal error" Case 9 sText = sText & "Restore aborted" Case 10 sText = sText & "Restore failed" Case 11 sText = sText & "Restore success" Case 12 sText = sText & "Aborted" Case 13 sText = sText & "Failed" Case 14 sText = sText & "Success" sStatus = "ok" Case 15 sText = sText & "Network failure" Case 16 sText = sText & "Scan failure" Case 17 sText = sText & "Compare failure" Case 18 sText = sText & "Run Before stopped profile" Case 19 sText = sText & "Profile disabled" Case 20 sText = sText & "SMART drive errors" Case 21 sText = sText & "Could not email log" Case 22 sText = sText & "Volume Shadow Copy snapshot failed" End Select sAttribute = Lcase(replace(SBRunning.Name," ","_")) sAttribute = replace(sAttribute,".","_") sAttribute = replace(sAttribute,"-","_") dim sCount dim sDT sDT = DateToStr(Date) & " " & TimeToStr(Time) sCount = SBRunning.GetRuntimeValueStr(1) sJson = "{'state': '" & sStatus & "', 'attributes': {'result': '" & sText & "'" sJson = sJson & ",'friendly_name': '"& SBRunning.Name & "'" sJson = sJson & ",'area': 'syncback'" sJson = sJson & ",'count': '" & sCount & "'" sJson = sJson & ",'datetime': '" & sDT & "'" sJson = sJson & "}}" sJson = replace(sJson,"'","""") SBRunning.DebugOut("HAResult", sJson, 1) ' Send HA message sUrl = "http://homeassistant.local:8123/api/states/" & HAEntity & "_" & sAttribute sAuth = "Bearer " & HAToken set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") oXMLHTTP.open("POST", sUrl, false) oXMLHTTP.SetRequestHeader("Content-Type", "application/json") oXMLHTTP.SetRequestHeader("Authorization", sAuth) oXMLHTTP.send(sJson) sResult = oXMLHTTP.responseText SBRunning.DebugOut("HAResult", sResult, 1) Set oXMLHTTP = nothing End Sub
To display the backup information the follow was used, this includes the custom:flex-table-card from Custom cards for Home Assistant installed via HACS.
- type: vertical-stack cards: - type: markdown content: '# Backups' - type: horizontal-stack cards: - type: markdown content: >- **Last Snapshot** {{ as_timestamp(state_attr('sensor.snapshot_backup', 'last_snapshot')) | timestamp_custom('%A at %H:%M (%d-%m-%y)') }} - type: markdown content: >- **Syncback** {%set errors = states.sensor| selectattr('state','eq','error') | selectattr('attributes.area','eq','syncback') |map(attribute='entity_id')|list |count %}{%set good = states.sensor| selectattr('state','eq','ok') | selectattr('attributes.area','eq','syncback') |map(attribute='entity_id')|list |count %}{% if errors > 0 %}<font color="red">{{errors}} Backup{% if errors > 1 %}s{% endif %} error</font> {%endif%}{{good}} Good backup{% if not(good == 1) %}s{% endif %} - type: 'custom:flex-table-card' clickable: true sort: last_updated entities: include: sensor.sync* columns: - name: Profile data: friendly_name - name: Result data: result modify: >- const color = (x == "Success") ? 'green' : 'red'; '<span style="color:' + color + ';">' + x + '</span>' - name: Age (h) data: last_updated modify: Math.round((Date.now() - Date.parse(x)) / 36000.) / 100.