update readme & add example HA config files

This commit is contained in:
David
2019-05-29 11:37:38 +10:00
parent f6c8d92f5e
commit 5edafe0ddc
16 changed files with 303 additions and 39 deletions
Vendored
BIN
View File
Binary file not shown.
+17 -1
View File
@@ -8,6 +8,9 @@ By remotely setting values via MQTT you can for example, change the power mode t
The program is designed to be run in a Docker Container, and can be deployed on a lightweight SBC next to your Inverter (i.e. an Orange Pi Zero running Arabian), and read data via the RS232 or USB ports on the back of the Inverter. The program is designed to be run in a Docker Container, and can be deployed on a lightweight SBC next to your Inverter (i.e. an Orange Pi Zero running Arabian), and read data via the RS232 or USB ports on the back of the Inverter.
![Example Lovelace Dashboard](images/lovelace-dashboard.jpg "Example Lovelace Dashboard")
_Example: My "Lovelace" dashboard using data collected from the Inverter._
---- ----
**Docker Hub:** [`bushrangers/ha-voltronic-mqtt`](https://hub.docker.com/r/bushrangers/ha-voltronic-mqtt/) **Docker Hub:** [`bushrangers/ha-voltronic-mqtt`](https://hub.docker.com/r/bushrangers/ha-voltronic-mqtt/)
@@ -63,6 +66,8 @@ _(see [protocol manual](http://forums.aeva.asn.au/uploads/293/HS_MS_MSX_RS232_Pr
``` ```
DESCRIPTION: PAYLOAD: OPTIONS:
----------------------------------------------------------------
Set output source priority POP00 (Utility first) Set output source priority POP00 (Utility first)
POP01 (Solar first) POP01 (Solar first)
POP02 (SBU) POP02 (SBU)
@@ -77,4 +82,15 @@ Set other commands PEa / PDa (Enable/disable buzzer)
PEj / PDj (Enable/disable power saving) PEj / PDj (Enable/disable power saving)
PEu / PDu (Enable/disable overload restart); PEu / PDu (Enable/disable overload restart);
PEx / PDx (Enable/disable backlight) PEx / PDx (Enable/disable backlight)
``` ```
### Bonus: Lovelace Dashboard Files
_**Please refer to the screenshot above for an example of the dashboard.**_
I've included some Lovelace dashboard files in the `homeassistant/` directory, however you will need to need to adapt to your own Home Assistant configuration and/or name of the inverter if you have changed it in the `mqtt.json` config file.
Note that in addition to merging the sample Yaml files with your Home Assistant, you will need the following custom Lovelace cards installed if you wish to use my templates:
- [vertical-stack-in-card](https://github.com/custom-cards/vertical-stack-in-card)
- [circle-sensor-card](https://github.com/custom-cards/circle-sensor-card)
+90
View File
@@ -0,0 +1,90 @@
# You will need to merge with your own Home Assistant configuration.yml file...
input_select:
solar_output_source_priority:
name: Solar Output Source Priority
options:
- POP00 (Utility first)
- POP01 (Solar first)
- POP02 (SBU)
solar_charger_priority:
name: Solar Charger Priority Order
options:
- PCP00 (Utility first)
- PCP01 (Solar first)
- PCP02 (Solar and utility)
- PCP03 (Solar only)
# Automations of Solar PV Inverter (such as when to charge batteries off grid / from PV etc)...
# This will automatically fire off the event to the inverter when changed in the UI.
automation:
- id: 'set_solar_output_source'
alias: Solar Trigger Output Source Change
trigger:
platform: state
entity_id: input_select.solar_output_source_priority
action:
service: mqtt.publish
data_template:
topic: 'homeassistant/sensor/voltronic'
payload: >
{% if is_state("input_select.solar_output_source_priority", "POP00 (Utility first)") %}
POP00
{% elif is_state("input_select.solar_output_source_priority", "POP01 (Solar first)") %}
POP01
{% elif is_state("input_select.solar_output_source_priority", "POP02 (SBU)") %}
POP02
{% endif %}
- id: 'set_solar_charge_priority'
alias: Stolar Trigger Charge Priority Change
trigger:
platform: state
entity_id: input_select.solar_charger_priority
action:
service: mqtt.publish
data_template:
topic: 'homeassistant/sensor/voltronic'
payload: >
{% if is_state("input_select.solar_charger_priority", "PCP00 (Utility first)") %}
PCP00
{% elif is_state("input_select.solar_charger_priority", "PCP01 (Solar first)") %}
PCP01
{% elif is_state("input_select.solar_charger_priority", "PCP02 (Solar and utility)") %}
PCP02
{% elif is_state("input_select.solar_charger_priority", "PCP03 (Solar only)") %}
PCP03
{% endif %}
# Auto Switch to 'Solar based charging ONLY at sunrise' (will not charge batteries from the Grid to save power...)
- id: 'switch_solar_only_charging_am'
alias: Auto switch to "Solar Only" charging at Sunrise
trigger:
- event: sunrise
platform: sun
offset: "00:15:00"
condition: []
action:
- service: input_select.select_option
data:
entity_id: input_select.solar_charger_priority
option: "PCP01 (Solar first)"
- service: input_select.select_option
data:
entity_id: input_select.solar_output_source_priority
option: "POP01 (Solar first)"
- id: 'switch_battery_late_evenings'
# Running on UPS mode seems to fuck up the 8 port tplink switch (it drops out from time to time) so it's best that we change mode after 2AM when less people are using Plex etc...
alias: Switch to battery preferred output late evenings
trigger:
- at: '02:00'
platform: time
condition: []
action:
- service: input_select.select_option
data:
entity_id: input_select.solar_output_source_priority
option: "POP02 (SBU)"
+152
View File
@@ -0,0 +1,152 @@
resources:
- type: js
url: /local/vertical-stack-in-card.js?v=0.1.2
- type: module
url: /local/circle-sensor-card.js?v=0
title: Solar Dashboard
views:
- badges: []
cards:
- cards:
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '1'
card:
type: picture
image: /local/inverter-modes/1.png
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '2'
card:
type: picture
image: /local/inverter-modes/2.png
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '3'
card:
type: picture
image: /local/inverter-modes/3.png
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '4'
card:
type: picture
image: /local/inverter-modes/4.png
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '5'
card:
type: picture
image: /local/inverter-modes/5.png
- type: conditional
conditions:
- entity: sensor.voltronic_inverter_mode
state: '6'
card:
type: picture
image: /local/inverter-modes/6.png
- content: |
---
type: markdown
- type: entities
entities:
- entity: input_select.solar_output_source_priority
icon: 'mdi:battery'
- entity: input_select.solar_charger_priority
icon: 'mdi:format-list-numbered'
- entity: automation.auto_switch_to_solar_only_charging_at_sunrise
- entity: automation.switch_to_battery_preferred_output_late_evenings
show_header_toggle: false
title: null
type: 'custom:vertical-stack-in-card'
- cards:
- entities:
- entity: sensor.voltronic_pv_in_voltage
name: PV Voltage (V)
icon: 'mdi:grid'
type: sensor
- entity: sensor.voltronic_pv_in_watts
name: PV Watts (W)
icon: 'mdi:battery-charging-70'
type: sensor
type: glance
- entities:
- entity: sensor.voltronic_load_watt
name: Inverter Output Load
type: history-graph
- entities:
- entity: sensor.voltronic_ac_grid_frequency
icon: 'mdi:current-ac'
name: Grid Frequency
- entity: sensor.voltronic_ac_grid_voltage
icon: 'mdi:power-plug'
name: Grid Voltage
- entity: sensor.voltronic_ac_out_frequency
icon: 'mdi:current-ac'
name: Output Freq
- entity: sensor.voltronic_ac_out_voltage
icon: 'mdi:power-plug'
name: Output Voltage
type: glance
show_header_toggle: false
title: System Overview
type: 'custom:vertical-stack-in-card'
- cards:
- cards:
- color_stops:
'40': '#00dc10'
'60': '#ff0000'
'80': '#ffe400'
entity: sensor.voltronic_load_pct
font_style:
font-size: 1.5em
gradient: true
name: System Load (%)
stroke_width: 10
type: 'custom:circle-sensor-card'
- color_stops:
'50': '#ff0000'
'75': '#ffe400'
'100': '#00dc10'
entity: sensor.voltronic_battery_capacity
font_style:
font-size: 1.5em
gradient: true
name: Battery Capacity
stroke_width: 10
type: 'custom:circle-sensor-card'
type: horizontal-stack
- entities:
- entity: sensor.voltronic_battery_charge_current
name: Battery Charge Current (A)
- entity: sensor.voltronic_battery_discharge_current
name: Battery Discharge Current (A)
type: history-graph
- entities:
- entity: sensor.voltronic_battery_float_voltage
icon: 'mdi:battery-charging'
name: Float Point
- entity: sensor.voltronic_battery_recharge_voltage
icon: 'mdi:battery-negative'
name: Recharge Lvl
- entity: sensor.voltronic_battery_redischarge_voltage
icon: 'mdi:battery-plus'
name: Discharge Lvl
- entity: sensor.voltronic_battery_under_voltage
icon: 'mdi:battery-charging-wireless-outline'
name: Critical Cutoff
type: glance
- entity: sensor.voltronic_battery_voltage
name: Battery Voltage (V)
type: sensor
show_header_toggle: false
title: null
type: 'custom:vertical-stack-in-card'
icon: 'mdi:grid'
title: Solar Configuration
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

+5 -4
View File
@@ -1,11 +1,12 @@
#!/bin/bash #!/bin/bash
export TERM=xterm export TERM=xterm
# Init the mqtt server for the first time... # Init the mqtt server for the first time, then every 5 minutes
bash /opt/voltronic-mqtt/mqtt-init.sh # This will re-create the auto-created topics in the MQTT server if HA is restarted...
watch -n 300 /opt/voltronic-mqtt/mqtt-init.sh > /dev/null 2>&1 &
# Run the MQTT Subscriber process in the background (so that way we can change the configuration on the inverter from home assistant) # Run the MQTT Subscriber process in the background (so that way we can change the configuration on the inverter from home assistant)
/opt/voltronic-mqtt/mqtt-subscriber.sh & /opt/voltronic-mqtt/mqtt-subscriber.sh &
# execute exactly ever minute... # execute exactly every 30 seconds...
watch -n 30 /opt/voltronic-mqtt/mqtt-push.sh # > /dev/null 2>&1 watch -n 30 /opt/voltronic-mqtt/mqtt-push.sh > /dev/null 2>&1
+36 -34
View File
@@ -16,7 +16,8 @@ registerTopic () {
\"name\": \""$MQTT_DEVICENAME"_$1\", \"name\": \""$MQTT_DEVICENAME"_$1\",
\"unit_of_measurement\": \"$2\", \"unit_of_measurement\": \"$2\",
\"state_topic\": \"$MQTT_TOPIC/sensor/"$MQTT_DEVICENAME"_$1\", \"state_topic\": \"$MQTT_TOPIC/sensor/"$MQTT_DEVICENAME"_$1\",
\"icon\": \"mdi:$3\" \"icon\": \"mdi:$3\",
\"retain\": true
}" }"
} }
@@ -27,42 +28,43 @@ registerInverterRawCMD () {
-t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME/config" \ -t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME/config" \
-m "{ -m "{
\"name\": \""$MQTT_DEVICENAME"\", \"name\": \""$MQTT_DEVICENAME"\",
\"state_topic\": \"$MQTT_TOPIC/sensor/$MQTT_DEVICENAME\" \"state_topic\": \"$MQTT_TOPIC/sensor/$MQTT_DEVICENAME\",
\"retain\": true
}" }"
} }
registerTopic "Inverter_mode" "" "mdi-solar-power" # 1 = Power_On, 2 = Standby, 3 = Line, 4 = Battery, 5 = Fault, 6 = Power_Saving, 7 = Unknown registerTopic "Inverter_mode" "" "solar-power" # 1 = Power_On, 2 = Standby, 3 = Line, 4 = Battery, 5 = Fault, 6 = Power_Saving, 7 = Unknown
registerTopic "AC_grid_voltage" "V" "mdi-power-plug" registerTopic "AC_grid_voltage" "V" "power-plug"
registerTopic "AC_grid_frequency" "Hz" "mdi-current-ac" registerTopic "AC_grid_frequency" "Hz" "current-ac"
registerTopic "AC_out_voltage" "V" "mdi-power-plug" registerTopic "AC_out_voltage" "V" "power-plug"
registerTopic "AC_out_frequency" "Hz" "mdi-current-ac" registerTopic "AC_out_frequency" "Hz" "current-ac"
registerTopic "PV_in_voltage" "V" "mdi-solar-panel-large" registerTopic "PV_in_voltage" "V" "solar-panel-large"
registerTopic "PV_in_current" "A" "mdi-solar-panel-large" registerTopic "PV_in_current" "A" "solar-panel-large"
registerTopic "PV_in_watts" "W" "mdi-solar-panel-large" registerTopic "PV_in_watts" "W" "solar-panel-large"
registerTopic "PV_in_watthour" "Wh" "mdi-solar-panel-large" registerTopic "PV_in_watthour" "Wh" "solar-panel-large"
registerTopic "SCC_voltage" "V" "mdi-current-dc" registerTopic "SCC_voltage" "V" "current-dc"
registerTopic "Load_pct" "%" "mdi-brightness-percent" registerTopic "Load_pct" "%" "brightness-percent"
registerTopic "Load_watt" "W" "mdi-chart-bell-curve" registerTopic "Load_watt" "W" "chart-bell-curve"
registerTopic "Load_watthour" "Wh" "mdi-chart-bell-curve" registerTopic "Load_watthour" "Wh" "chart-bell-curve"
registerTopic "Load_va" "VA" "mdi-chart-bell-curve" registerTopic "Load_va" "VA" "chart-bell-curve"
registerTopic "Bus_voltage" "V" "mdi-details" registerTopic "Bus_voltage" "V" "details"
registerTopic "Heatsink_temperature" "" "mdi-details" registerTopic "Heatsink_temperature" "" "details"
registerTopic "Battery_capacity" "%" "mdi-battery-outline" registerTopic "Battery_capacity" "%" "battery-outline"
registerTopic "Battery_voltage" "V" "mdi-battery-outline" registerTopic "Battery_voltage" "V" "battery-outline"
registerTopic "Battery_charge_current" "A" "mdi-current-dc" registerTopic "Battery_charge_current" "A" "current-dc"
registerTopic "Battery_discharge_current" "A" "mdi-current-dc" registerTopic "Battery_discharge_current" "A" "current-dc"
registerTopic "Load_status_on" "" "mdi-power" registerTopic "Load_status_on" "" "power"
registerTopic "SCC_charge_on" "" "mdi-power" registerTopic "SCC_charge_on" "" "power"
registerTopic "AC_charge_on" "" "mdi-power" registerTopic "AC_charge_on" "" "power"
registerTopic "Battery_recharge_voltage" "V" "mdi-current-dc" registerTopic "Battery_recharge_voltage" "V" "current-dc"
registerTopic "Battery_under_voltage" "V" "mdi-current-dc" registerTopic "Battery_under_voltage" "V" "current-dc"
registerTopic "Battery_bulk_voltage" "V" "mdi-current-dc" registerTopic "Battery_bulk_voltage" "V" "current-dc"
registerTopic "Battery_float_voltage" "V" "mdi-current-dc" registerTopic "Battery_float_voltage" "V" "current-dc"
registerTopic "Max_grid_charge_current" "A" "mdi-current-ac" registerTopic "Max_grid_charge_current" "A" "current-ac"
registerTopic "Max_charge_current" "A" "mdi-current-ac" registerTopic "Max_charge_current" "A" "current-ac"
registerTopic "Out_source_priority" "" "mdi-grid" registerTopic "Out_source_priority" "" "grid"
registerTopic "Charger_source_priority" "" "mdi-solar-power" registerTopic "Charger_source_priority" "" "solar-power"
registerTopic "Battery_redischarge_voltage" "V" "mdi-battery-negative" registerTopic "Battery_redischarge_voltage" "V" "battery-negative"
# Add in a separate topic so we can send raw commands from assistant back to the inverter via MQTT (such as changing power modes etc)... # Add in a separate topic so we can send raw commands from assistant back to the inverter via MQTT (such as changing power modes etc)...
registerInverterRawCMD registerInverterRawCMD
+3
View File
@@ -19,6 +19,9 @@ INVERTER_DATA=`timeout 10 /opt/voltronic-cli/bin/skymax`
##################################################################################### #####################################################################################
Inverter_mode=`echo $INVERTER_DATA | jq '.Inverter_mode' -r` Inverter_mode=`echo $INVERTER_DATA | jq '.Inverter_mode' -r`
# 1 = Power_On, 2 = Standby, 3 = Line, 4 = Battery, 5 = Fault, 6 = Power_Saving, 7 = Unknown
[ ! -z "$Inverter_mode" ] && pushMQTTData "Inverter_mode" "$Inverter_mode" [ ! -z "$Inverter_mode" ] && pushMQTTData "Inverter_mode" "$Inverter_mode"
AC_grid_voltage=`echo $INVERTER_DATA | jq '.AC_grid_voltage' -r` AC_grid_voltage=`echo $INVERTER_DATA | jq '.AC_grid_voltage' -r`