I’ve found a code snippet to setup a custom logging into the database.
I setup recorder:
# recorder
db_url: !secret recorder_maria_db
purge_keep_days: 7
include:
entity_globs:
- sensor.energy_*
- sensor.fritz_box_7690_*
- sensor.pv_*
- sensor.solakon_*
- sensor.user_log
I defined this template in template.yaml:
# TRIGGER-BASIERTER LOG-SENSOR
- trigger:
- platform: event
event_type: custom_log
sensor:
- name: "User Log"
unique_id: sensor.user_log
state: "{{ trigger.event.data.message }}"
attributes:
channel: "{{ trigger.event.data.channel }}"
level: "{{ trigger.event.data.level }}"
timestamp: "{{ now().isoformat() }}"
And basically it works:
Unfortunately, it doesn’t work reliably.
I’m working on automation for Solakon One.
Some logs are recorded correctly, others are not, even though the branches are processed correctly.
The project is not yet complete. So far, only the first two modes have been implemented.
The image shows that the switch to PV protect mode was logged, but the log from lines 237 onwards should also have appeared, as the switch from 600 W to 0 also took place.
alias: Solakon One Steuerung
description: Solakon One Steuerung
mode: restart
triggers:
- trigger: state
entity_id: sensor.energy_power_current_demand
- trigger: state
entity_id: sensor.solakon_one_remote_timeout_countdown
- trigger: state
entity_id: sensor.solakon_one_battery_soc
trigger_variables:
# max house grit feed-in power
max_active_power: 800
# max power when charging from grid
max_grid_charge: 600
max_remote_timeout: 60
# min value we want to consume from grid
min_net_power: 5
# below this value the Solakon One seems to have wrong data, there is not enough power to charge battery or house feed-in
min_pv_charge_power: 40
# absolute minimum value of SOC, start charging with any available power to get back to a healthy level
min_soc: 10
# minimum value of SOC to be kept if PV available, no house feed-in below that value
min_soc_pv_charge: 20
variables:
current_demand: "{{ states('sensor.energy_power_current_demand') | int(0) }}"
current_pv: "{{ states('sensor.solakon_one_total_pv_power') | int(0) }}"
current_soc: "{{ states('sensor.solakon_one_battery_soc') | int(0) }}"
current_timeout: "{{ states('sensor.solakon_one_remote_timeout_countdown') | int(0) }}"
# soc_above_threshold: "{{ current_soc > min_soc }}"
conditions: [ ]
actions:
- choose:
# active CHARGE mode with grid energy if SOC is below minimum
- conditions:
- condition: template
value_template: >
{{ current_soc < min_soc
and states('input_select.solakon_one_charge_mode') != 'safety_charge' }}
sequence:
- action: input_select.select_option
target:
entity_id: input_select.solakon_one_charge_mode
data:
option: safety_charge
- event: custom_log
event_data:
level: debug
channel: solakon
message: "SOC < {{ min_soc }}% -> (Grid) charge mode enabled"
- choose:
# use PV to charge the battery without exporting to the home grid
- conditions:
- condition: template
value_template: >
{{ current_soc >= min_soc + 5
and current_soc < min_soc_pv_charge
and states('input_select.solakon_one_charge_mode') != 'pv_protect' }}
sequence:
- action: input_select.select_option
target:
entity_id: input_select.solakon_one_charge_mode
data:
option: pv_protect
- event: custom_log
event_data:
level: debug
channel: solakon
message: "SOC between {{ min_soc + 5 }}% and {{ min_soc_pv_charge }}% -> PV protect mode enabled"
- choose:
# exporting PV into the home grid
- conditions:
- condition: template
value_template: >
{{ current_soc >= min_soc_pv_charge
and states('input_select.solakon_one_charge_mode') != 'eco_feed'
and states('input_select.solakon_one_charge_mode') != 'power_boost' }}
sequence:
- action: input_select.select_option
target:
entity_id: input_select.solakon_one_charge_mode
data:
option: eco_feed
- event: custom_log
event_data:
level: debug
channel: solakon
message: "SOC >= {{ min_soc_pv_charge }}% -> ECO feed mode enabled"
- choose:
# disabling Power Boost
- conditions:
- condition: template
value_template: >
{{ current_soc < 30
and states('input_select.solakon_one_charge_mode') == 'power_boost' }}
sequence:
- action: input_select.select_option
target:
entity_id: input_select.solakon_one_charge_mode
data:
option: eco_feed
- event: custom_log
event_data:
level: debug
channel: solakon
message: "SOC < 30% -> Power Boost mode disabled"
- choose:
# set remote timer if necessary
- conditions:
- condition: template
value_template: "{{ current_timeout < (max_remote_timeout / 2) }}"
sequence:
- action: number.set_value
target:
entity_id: number.solakon_one_remote_timeout_set
data:
value: "{{ max_remote_timeout }}"
- event: custom_log
event_data:
level: debug
channel: solakon
message: "set timeout -> {{ max_remote_timeout }}"
- choose:
# configure Solakon One for safety_charge mode
- conditions:
- condition: template
value_template: "{{ states('input_select.solakon_one_charge_mode') == 'safety_charge' }}"
sequence:
# ensure PV-priority charge mode (set only if necessary)
- choose:
- conditions:
- condition: template
value_template: "{{ states('select.solakon_one_remote_control_mode') != 'INV Charge (PV Priority)' }}"
sequence:
- action: select.select_option
target:
entity_id: select.solakon_one_remote_control_mode
data:
option: INV Charge (PV Priority)
# ensure no discharge (set only if necessary)
- choose:
- conditions:
- condition: template
value_template: "{{ states('number.solakon_one_battery_max_discharge_current') | float(0) != 0 }}"
sequence:
- action: number.set_value
target:
entity_id: number.solakon_one_battery_max_discharge_current
data:
value: 0
# decide grid usage based on PV power
- choose:
# PV sufficient -> no grid power
- conditions:
- condition: template
value_template: "{{ current_pv > min_pv_charge_power }}"
sequence:
- condition: template
value_template: "{{ states('number.solakon_one_remote_active_power') | int(0) != 0 }}"
- action: number.set_value
target:
entity_id: number.solakon_one_remote_active_power
data:
value: 0
- event: custom_log
event_data:
level: debug
channel: solakon
message: "safety_charge: PV {{ current_pv }} W -> grid 0 W"
# PV not sufficient -> use grid assist
- conditions:
- condition: template
value_template: "{{ current_pv <= min_pv_charge_power }}"
sequence:
- condition: template
value_template: "{{ states('number.solakon_one_remote_active_power') | int(0) != max_grid_charge }}"
- action: number.set_value
target:
entity_id: number.solakon_one_remote_active_power
data:
value: "{{ max_grid_charge }}"
- event: custom_log
event_data:
level: debug
channel: solakon
message: "safety_charge: PV {{ current_pv }} W -> grid {{ max_grid_charge }} W"
- choose:
# configure Solakon One for pv_protect mode
- conditions:
- condition: template
value_template: "{{ states('input_select.solakon_one_charge_mode') == 'pv_protect' }}"
sequence:
# ensure PV-priority charge mode (set only if necessary)
- choose:
- conditions:
- condition: template
value_template: "{{ states('select.solakon_one_remote_control_mode') != 'INV Charge (PV Priority)' }}"
sequence:
- action: select.select_option
target:
entity_id: select.solakon_one_remote_control_mode
data:
option: INV Charge (PV Priority)
# ensure no discharge (set only if necessary)
- choose:
- conditions:
- condition: template
value_template: "{{ states('number.solakon_one_battery_max_discharge_current') | float(0) != 0 }}"
sequence:
- action: number.set_value
target:
entity_id: number.solakon_one_battery_max_discharge_current
data:
value: 0
# ensure no grid usage (set only if necessary)
- choose:
- conditions:
- condition: template
value_template: "{{ states('number.solakon_one_remote_active_power') | int(0) != 0 }}"
sequence:
- action: number.set_value
target:
entity_id: number.solakon_one_remote_active_power
data:
value: 0
- event: custom_log
event_data:
level: debug
channel: solakon
message: "pv_protect: PV {{ current_pv }} W -> grid 0 W"

