Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

DonateDonate

Home Assistant SAJ eSolar Custom Integration

This integration uses cloud polling from the SAJ eSolar portal using a reverse engineered private API. Thanks to SAJ eSolar for inspiration.

This integration today support SAJ R5 and SAJ H1. SAJ SEC has not yet been implemented mainly due to lack of access to a SEC system,

The focus on this integration is to reduce the amount of sensors published while at the same time maximize the information available and provide them as attributes.

As an example, the H1 Inverter Power sensor has 50 information elements (15 x 3 + 5) published as attributes. This is a bit against the nature of Home Assistant development, but given a system comprising two plants, one R5 and two H1 - the amount of sensors would easly be in the hundreds. Therefore, this integration aims to publish only what is relevant as sensors.

alt text

These attributes can be fetched by implementing a template sensor using jinja2. An example of that can be found in the advanced section below.

Installation

HACS

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Manual

  • Copy directory custom_components/saj_esolar_air to your <config dir>/custom_components directory.
  • Restart Home-Assistant.

Enable the integration

Go to Settings / Devices & Services / Integrations. Click + ADD INTERATION

alt text

Search for eSolar and click on it

alt text

Enter your SAJ eSolar username and password

alt text

If you have more than one site, select which of the sites that shall be installed

alt text

Following a succesful installation, a device per plant will be created

alt text

You can see that a number of devices and entites has been created at the SAJ eSolar integration

alt text

If you click on the devices, you can see this also in the Devices section

alt text

Your home screen will now have a number of new entities depending on your system. A R5 system will have two sensors (Status and Energy) and a H1 System will have five sensors (Status, Sell Energy, Buy, Energy, Charge Energy, Discharge Energy)

alt text

Configuration

If you need more sensor and more detailed attributes in the sensors, you can configure the integration as follows

Go to Settings / Devices & Services / SAL eSolar. Click CONFIGURE.

Select if you want additional inverter sensors and if you want Photovoltaics and Grid attributes. Take note that the Photovoltaics and Grid attributes will pull additional data from the SAJ servers.

alt text

After the configuration is done you need to restart the integration. Click ... and select Reload

alt text

The system will now reload and add two-tre new sensors per inverter (Energy Total, Power and for H1 system Battery SoC)

alt text

Final result

When the system is fully set-up it can look something like this

alt text

Advanced

Creating a template sensor based on sensor attributes.

The below example will fetch the battery direction from the inverter energy total sensor and publish that as a new sensor

template:
- sensor:
- name: "Battery Direction"
unique_id: inverter_ass111111111111111_energy_total_battery_direction
state: >
{{state_attr('sensor.inverter_ass111111111111111_energy_total', 'Battery Direction')}}

Donations

I mainly did this project as a learning experience for myself and have no expectations from anyone.

If you like what have been done here and want to help I would recommend that you firstly look into supporting Home Assistant.

You can do this by purchasing some swag from their store or paying for a Nabu Casa subscription. None of this could happen without them.

After you have done that if you still feel this work has been valuable to you I welcome your support through BuyMeACoffee or Paypal.

Paypal