### Register DuloNode Hub Node Source: https://github.com/dulonode/node-red-contrib-dulonode/blob/master/nodes/dulonode-hub.html Registers the DuloNode Hub node type with Node-RED, defining its category, color, default properties, credentials, and input/output configuration. It also includes the `oneditprepare` function to dynamically load installation and subscription details when the node's editor is opened. ```javascript RED.nodes.registerType('DuloNodeHub', { category: 'function', color: '#D3C89E', defaults: { name: { value: '' }, installation: { value: 'standalone' } }, credentials: { email: { type: 'text' }, password: { type: 'password' } }, inputs: 1, outputs: 1, icon: 'hub.svg', label: function() { return this.name || 'DuloNode Hub'; }, oneditprepare: function() { const node = this; let endpointPrefix = ''; // Get instalation type $.getJSON('dulonode/installation') .done(function (data) { subscriptionPanel(data.installation); }) .fail(function () { // Fallback to second endpoint $.getJSON('endpoint/dulonode/installation') .done(function (data) { subscriptionPanel(data.installation); }) .fail(function () { subscriptionPanel('standalone'); }); }); // Load subscription details function subscriptionPanel(installation) { console.log("Installation type:", installation); endpointPrefix = installation == 'homeassistant' ? 'endpoint/' : ''; let plan = 'Unknown' $.getJSON(`${endpointPrefix}dulonode/subscription/details`) .done(function(data) { plan = data.plan?.name || 'Unknown'; $('#subscription-plan').text(plan); $('#subscription-plan').show(); if (plan == 'Free') { $('#subscription-upgrade').show(); } else { $('#subscription-manage').show(); } }) .fail(function() { $('#subscription-plan').text('Error loading plan'); }) .always(function() { if (plan != 'Unknown') { $('#subscription').show(); $('#subscription-loading').hide(); } else { $('#subscription').hide(); } }); // Handle Manage and Upgrade button clicks $('#subscription-manage').on('click', function() { window.open(`${endpointPrefix}dulonode/subscription/manage`, '_blank'); $("#node-dialog-cancel").click(); }); $('#subscription-upgrade').on('click', function() { window.open(`${endpointPrefix}dulonode/subscription/upgrade`, '_blank'); $("#node-dialog-cancel").click(); }); } } }); ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.