dlatego mam symulację i czekam na rachunek żeby zrobić ewentualne poprawki. jak mnie najdzie to zrobie magazyn DIY 1kWh z aku do monitoringu żeby zobaczyć jak wychodzi, bo na chwilę obecną to prawie wszystko zrobiłem co mogę w bloku a najlepiej mi się pracuje na żywym organizmie. możesz uruchomić kopię HA do zasymulowania taryf u siebie.
edit: 01:30
!!! uwaga brak danych z energy instrat !!! zorientowałem się o północy 
utwórz plik new.json z zawartością:
[{"date":"2024-10-27T00:00:00Z","fixing_i":{"price":420}},{"date":"2024-10-27T01:00:00Z","fixing_i":{"price":392.07}},{"date":"2024-10-27T02:00:00Z","fixing_i":{"price":384}},{"date":"2024-10-27T03:00:00Z","fixing_i":{"prce":390}},{"date":"2024-10-27T04:00:00Z","fixing_i":{"price":386}},{"date":"2024-10-27T05:00:00Z","fixing_i":{"price":388}},{"date":"2024-10-27T06:00:00Z","fixing_i":{"price":398}},{"date":"2024-10-27T07:00:00Z","fixing_i":{"price":404}},{"date":"2024-10-27T08:00:00Z","fixing_i":{"price":416}},{"date":"2024-10-27T09:00:00Z","fixing_i":{"price":367.56}},{"date":"2024-10-27T10:00:00Z","fixing_i":{"price":300}},{"date":"2024-10-27T11:00:00Z","fixing_i":{"price":313.99}},{"date":"2024-10-27T12:00:00Z","fixing_i":{"price":309.99}},{"date":"2024-10-27T13:00:00Z","fixing_i":{"price":350}},{"date":"2024-10-27T14:00:00Z","fixing_i":{"price":445.18}},{"date":"2024-10-27T15:00:00Z","fixing_i":{"price":472}},{"date":"2024-10-27T16:00:00Z","fixing_i":{"price":568}},{"date":"2024-10-27T17:00:00Z","fixing_i":{"price":610}},{"date":"2024-10-27T18:00:00Z","fixing_i":{"price":587.8}},{"date":"2024-10-27T19:00:00Z","fixing_i":{"price":560.82}},{"date":"2024-10-27T20:00:00Z","fixing_i":{"price":472.7}},{"date":"2024-10-27T21:00:00Z","fixing_i":{"price":450}},{"date":"2024-10-27T22:00:00Z","fixing_i":{"price":420}},{"date":"2024-10-27T23:00:00Z","fixing_i":{"price":384}},{"date":"2024-10-28T00:00:00Z","fixing_i":{"price":396}},{"date":"2024-10-28T01:00:00Z","fixing_i":{"price":384.99}},{"date":"2024-10-28T02:00:00Z","fixing_i":{"price":378}},{"date":"2024-10-28T03:00:00Z","fixing_i":{"price":382}},{"date":"2024-10-28T04:00:00Z","fixing_i":{"price":404}},{"date":"2024-10-28T05:00:00Z","fixing_i":{"price":455}},{"date":"2024-10-28T06:00:00Z","fixing_i":{"price":649}},{"date":"2024-10-28T07:00:00Z","fixing_i":{"price":798.57}},{"date":"2024-10-28T08:00:00Z","fixing_i":{"price":671.42}},{"date":"2024-10-28T09:00:00Z","fixing_i":{"price":524}},{"date":"2024-10-28T10:00:00Z","fixing_i":{"price":454}},{"date":"2024-10-28T11:00:00Z","fixing_i":{"price":434.84}},{"date":"2024-10-28T12:00:00Z","fixing_i":{"price":430}},{"date":"2024-10-28T13:00:00Z","fixing_i":{"price":443.37}},{"date":"2024-10-28T14:00:00Z","fixing_i":{"price":501.91}},{"date":"2024-10-28T15:00:00Z","fixing_i":{"price":632}},{"date":"2024-10-28T16:00:00Z","fixing_i":{"price":948}},{"date":"2024-10-28T17:00:00Z","fixing_i":{"price":1100}},{"date":"2024-10-28T18:00:00Z","fixing_i":{"price":1044}},{"date":"2024-10-28T19:00:00Z","fixing_i":{"price":874.12}},{"date":"2024-10-28T20:00:00Z","fixing_i":{"price":670.72}},{"date":"2024-10-28T21:00:00Z","fixing_i":{"price":534.52}},{"date":"2024-10-28T22:00:00Z","fixing_i":{"price":490}},{"date":"2024-10-28T23:00:00Z","fixing_i":{"price":439}},{"date":"2024-10-29T00:00:00Z","fixing_i":{"price":444.00}},{"date":"2024-10-29T01:00:00Z","fixing_i":{"price":416.30}},{"date":"2024-10-29T02:00:00Z","fixing_i":{"price":404.00}},{"date":"2024-10-29T03:00:00Z","fixing_i":{"price":410.00}},{"date":"2024-10-29T04:00:00Z","fixing_i":{"price":430.00}},{"date":"2024-10-29T05:00:00Z","fixing_i":{"price":470.00}},{"date":"2024-10-29T06:00:00Z","fixing_i":{"price":642.96}},{"date":"2024-10-29T07:00:00Z","fixing_i":{"price":830.00}},{"date":"2024-10-29T08:00:00Z","fixing_i":{"price":802.01}},{"date":"2024-10-29T09:00:00Z","fixing_i":{"price":635.00}},{"date":"2024-10-29T10:00:00Z","fixing_i":{"price":576.00}},{"date":"2024-10-29T11:00:00Z","fixing_i":{"price":559.89}},{"date":"2024-10-29T12:00:00Z","fixing_i":{"price":555.00}},{"date":"2024-10-29T13:00:00Z","fixing_i":{"price":573.00}},{"date":"2024-10-29T14:00:00Z","fixing_i":{"price":621.10}},{"date":"2024-10-29T15:00:00Z","fixing_i":{"price":738.80}},{"date":"2024-10-29T16:00:00Z","fixing_i":{"price":1023.00}},{"date":"2024-10-29T17:00:00Z","fixing_i":{"price":1080.00}},{"date":"2024-10-29T18:00:00Z","fixing_i":{"price":1000.00}},{"date":"2024-10-29T19:00:00Z","fixing_i":{"price":870.00}},{"date":"2024-10-29T20:00:00Z","fixing_i":{"price":680.00}},{"date":"2024-10-29T21:00:00Z","fixing_i":{"price":551.37}},{"date":"2024-10-29T22:00:00Z","fixing_i":{"price":504.84}},{"date":"2024-10-29T23:00:00Z","fixing_i":{"price":444.00}},{"date":"2024-10-30T00:00:00Z","fixing_i":{"price":452.90}},{"date":"2024-10-30T01:00:00Z","fixing_i":{"price":427.30}},{"date":"2024-10-30T02:00:00Z","fixing_i":{"price":414.99}},{"date":"2024-10-30T03:00:00Z","fixing_i":{"price":413.38}},{"date":"2024-10-30T04:00:00Z","fixing_i":{"price":425.00}},{"date":"2024-10-30T05:00:00Z","fixing_i":{"price":456.85}},{"date":"2024-10-30T06:00:00Z","fixing_i":{"price":546.14}},{"date":"2024-10-30T07:00:00Z","fixing_i":{"price":630.00}},{"date":"2024-10-30T08:00:00Z","fixing_i":{"price":630.00}},{"date":"2024-10-30T09:00:00Z","fixing_i":{"price":546.00}},{"date":"2024-10-30T10:00:00Z","fixing_i":{"price":499.40}},{"date":"2024-10-30T11:00:00Z","fixing_i":{"price":475.11}},{"date":"2024-10-30T12:00:00Z","fixing_i":{"price":457.92}},{"date":"2024-10-30T13:00:00Z","fixing_i":{"price":460.00}},{"date":"2024-10-30T14:00:00Z","fixing_i":{"price":499.40}},{"date":"2024-10-30T15:00:00Z","fixing_i":{"price":570.00}},{"date":"2024-10-30T16:00:00Z","fixing_i":{"price":720.00}},{"date":"2024-10-30T17:00:00Z","fixing_i":{"price":841.20}},{"date":"2024-10-30T18:00:00Z","fixing_i":{"price":837.90}},{"date":"2024-10-30T19:00:00Z","fixing_i":{"price":745.00}},{"date":"2024-10-30T20:00:00Z","fixing_i":{"price":571.88}},{"date":"2024-10-30T21:00:00Z","fixing_i":{"price":500.11}},{"date":"2024-10-30T22:00:00Z","fixing_i":{"price":499.43}},{"date":"2024-10-30T23:00:00Z","fixing_i":{"price":442.37}}]
a w terminalu wykonujemy polecenia:
cp energy_instrat.json old_energy_instrat.json
jq -sc '.[0] + .[1] | unique_by(.date)' old_energy_instrat.json new.json > energy_instrat.json
można też zawartość pliku skopiować ręcznie do istniejącego, najlepiej w jakimś edytorze np. jsonpathfinder.com
dane będę wrzucał do tego wpisu
18:30 dodane dane na 28.10. do jutra skoncze parser ze strony tge bo tak nie może być
dodane dane na 29.10
dodane dane na 30.10
edit: 31.10
z powodu kolejnego braku danych z energy instrat napisałem w końcu pobieranie danych z innych źródeł. skrypt pobiera dane z trzech źródeł (do wyboru) i tworzy z nich pliki JSON w jedynym właściwym formacie (jak w energy instrat). dane pse_rce pobiera z api pse a tge_rdn2 z tge.pl z html. wszystko pobierane jest poleceniem ‘curl’ i przetwarzane poleceniami ‘jq grep sed cut’. jesli macie HAOS to w skrypcie są linijki polecenia ‘pup’ (są oznaczone, a pup trzeba doinstalować) możecie sprawdzić czy działa bo w dockerze działa w terminalu a w ‘shell_command’ już nie. oprócz energy_energy instrat dane pobierane są przyrostowo, a parametr drugi pilnuje ilości danych w plikach.
do dzieła:
w skrypcie, w pierwszych linijkach możecie zmienić kilka parametrów: nazwy plików, atrybutow json, pobrać wcześniejsze dane
skrypt uruchamia się z parametrami:
1 . nazwa danych lub lista po przecinkach: energy_instrat,tge_rdn,pse_rce
2 . ilość danych w dniach: 7days (wystarczy sama cyfra) wczesniejsze dane można pobrać odkomentowując linijkę #25 #data_day=“2024-10-27” i uruchamiając ręcznie automatyzację kilka razy
3. 4. kolejność dowolna: merge i verbose
merge: łączy dane z pierwszego parametru w jeden plik do wykorzystania np w jednej encjii z atrybutami (poszczególne pliki nadal będą dostępne)
edit: okazało się że merge nie jest potrzebne. robi się to tworząc sensor command_line. można też wczytać z pliku energy_prices.json metodą jak wyżej
verbose: tylko do używania w ręcznym uruchamianiu skryptu. wypisuje wszystko na terminal.
podstawowe informacje po każdym uruchomieniu znajdują się w pliku .log tam gdzie skrypt
w configuration.yaml:
shell_command:
energy_prices_scrapper: bash /config/downloader/energy_prices/energy_prices_scrapper.sh energy_instrat,tge_rdn,pse_rce 7days
command_line:
- sensor:
unique_id: 20241031000001
name: TGE RDN
command: "cat /config/downloader/energy_prices/instrat.json"
value_template: "{{ value_json.tge_rdn[-1].date | as_timestamp | | timestamp_custom('%Y-%m-%dT%H:%M:%SZ', False) }}"
# value_template: "{{ value_json.tge_rdn[0].price }}"
# unit_of_measurement: "PLN/MWh"
json_attributes:
- tge_rdn
- sensor:
unique_id: 20241031000002
name: TGE RDN2
command: "cat /config/downloader/energy_prices/tge_rdn.json"
value_template: "{{ value_json.tge_rdn2[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%M:%SZ', False) }}"
# value_template: "{{ value_json.tge_rdn2[0].price }}"
# unit_of_measurement: "PLN/MWh"
json_attributes:
- tge_rdn2
- sensor:
unique_id: 20241031000003
name: PSE RCE
command: "cat /config/downloader/energy_prices/pse_rce.json"
#nizej zamienna linijka ktora laczy ze soba wszystkie okresy po 15min bo przy 7dniach jest warning w logach o rozmiarze
# command: "cd /config/downloader/energy_prices/ && jq -c '.pse_rce[] | {date: \"\\(.date[0:14])00:00Z\", price: .price}' pse_rce.json | jq -sc 'unique_by(.date) | {pse_rce: .}'"
value_template: "{{ value_json.pse_rce[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%M:%SZ', False) }}"
# value_template: "{{ value_json.pse_rce[0].price }}"
# unit_of_measurement: "PLN/MWh"
json_attributes:
- pse_rce
- sensor:
unique_id: 20241031000010
name: Energy Prices
command: "cd /config/downloader/energy_prices/ && jq -sc '.[0] +.[1] + .[2]' instrat.json tge_rdn.json pse_rce.json"
value_template: >
"{{ value_json.tge_rdn[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%MZ', False) ~ '/'
~ value_json.tge_rdn2[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%MZ', False) ~ '/'
~ value_json.pse_rce[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%MZ', False)}}"
# value_template: "{{ value_json.tge_rdn[0].price }}"
# unit_of_measurement: "PLN/MWh"
json_attributes:
- tge_rdn
- tge_rdn2
- pse_rce
edit: znalazłem właśnie taki zapis (timestamp konca), pomoże w rozpoznawaniu awarii źrodła danych
value_template: "{{ value_json.tge_rdn[-1].date | as_timestamp | timestamp_custom('%Y-%m-%dT%H:%M:%SZ', False) }}"
dane publikowane są:
energy_intrat po 16
tge_rdn na stronie po 14
pse_rce nie wiem
w skrypcie w linijce #28 if [ $verify_h -lt 16 ] , 16 to godzina zmiany odczytu danych z dzisiaj na jutro, więc w automations.yaml jest po 16
- id: '2024103100020'
alias: EnergyPrices
description: ''
triggers:
- hours: '16'
minutes: '0'
seconds: '5'
trigger: time_pattern
actions:
- action: shell_command.energy_prices_scrapper
data: {}
mode: single
w katalogu downloader/energy_prices tworzymy plik energy_prices_scrapper.sh i wrzucamy poniższą zawartość. restart HA i zrobione. automatyczne przełączanie się pomiędzy danymi w przypadku awarii któregoś źródła zróbcie we własnym zakresie bo jeszcze tego nie umiem.(jest niżej), ale bash’a jak najbardziej i go lubie :). tak na marginesie wypasione są komendy użyte razem (grep sed cut), bo wyciągnięcie danych ze strony tge.pl to 3 linijki 
duży edit: 03.11
optymalizacja całości (chyba ze zmęczenia wkradł się mały chaos), 03.11 albo pse się zacinało albo u mnie było coś z netem. dodane: pse_ilosc_prob_pobrania i zmiana formatu danych z M15 na H1, dodana weryfikacja nowych danych. skrypt może być gdziekolwiek, DATAPATH załatwia temat. całość działa jak wcześniej
#!/bin/bash
SCRIPTPATH=$(dirname `realpath "$0"`)
DATAPATH="/homeassistant/downloader/energy_prices/"
cd $DATAPATH
attrib=(tge_rdn tge_rdn2 pse_rce)
file_name=(instrat.json tge_rdn.json pse_rce.json)
pse_rce_format=1 # M15=4, H1=1
pse_ilosc_prob_pobrania=5
merge_filename=energy_prices.json
echo "-------------------------------" > $0.log
echo "script path/name: "$(realpath $0) >> $0.log
echo " data path: "$DATAPATH >> $0.log
echo " executed at: "`date` >> $0.log
if [[ ! $1 == *"energy_instrat"* && ! $1 == *"tge_rdn"* && ! $1 == *"pse_rce"* ]]; then
echo error: blad parametru \"'$1'\"=$1 powinien byc jeden: z energy_instrat,tge_rdn,pse_rce lub wszystkie oddzielone przecinkami >> $0.log
cat $0.log
exit 1
fi
if [[ ! ${2//[!0-9]} =~ ^-?[0-9]+$ ]]; then
echo error: zmienna \"'$2'\"=$2, nie ma cyfry >> $0.log
cat $0.log
exit 1
fi
verify_h=`date +%H`
if [ $verify_h -lt 16 ]; then
data_day=`date +%Y-%m-%d -d @$(($(date +%s)+(0*24*3600)))` # end=`date +%Y-%m-%d -d @$(($(date +%s)+(0*24*3600)))`
start_range=`date +%Y-%m-%d -d @$(($(date +%s)-((${2//[!0-9]}-1)*24*3600)))`
else
data_day=`date +%Y-%m-%d -d @$(($(date +%s)+(1*24*3600)))` # end=`date +%Y-%m-%d -d @$(($(date +%s)+(1*24*3600)))`
start_range=`date +%Y-%m-%d -d @$(($(date +%s)-((${2//[!0-9]}-2)*24*3600)))`
fi
#data_day="2024-11-03" #pobieranie zaleglych danych
#echo "* date range: "$start_range do $data_day
####################################################################################################################################################
if [[ $1 == *"energy_instrat"* ]]; then
start_range_dd=`date -d $start_range +%d-%m-%YT00:00:00Z`
end_range_dd=`date -d $data_day +%d-%m-%YT23:59:59Z`
energy_instrat_url="https://energy-instrat-api.azurewebsites.net/api/prices/energy_price_rdn_hourly?&date_from=$start_range_dd&date_to=$end_range_dd"
result1=`curl -H "Accept: application/json" -s $energy_instrat_url | jq 'del (..|objects|.fixing_ii, .volume) | (.[] | {date: (.date),price: (.fixing_i.price)})' | jq -sc --arg attr "${attrib[0]}" '{$attr: .}'` #> ${file_name[0]}
if [[ `jq -c '.[] | length' <<< $result1` -ne 0 ]]; then
echo $result1 > ${file_name[0]}
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then tomerge1=$result1
fi
error_msg="no error"
else
error_msg="blad danych"
fi
msg="-------------------------------"
msg+=" json attribute: "${attrib[0]}" filename: "${file_name[0]}" filesize: "`wc -c ${file_name[0]} | cut -d ' ' -f1`
msg+=" date range: "$start_range" to "$data_day
msg+=" data source: "$energy_instrat_url
msg+=" error: "$error_msg
msg+=" -------------------------------"
if [[ $3 == *"verbose"* || $4 == *"verbose"* ]]; then
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s \n%s%s\n" $msg
jq -sc '.[]' <<< $result1
fi
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s \n%s%s\n" $msg >> $0.log
fi
#=================================================================================================================================================
if [[ $1 == *"tge_rdn"* ]]; then
data_day_dd=`date -d $data_day +%d-%m-%Y`
tge_rdn_url="https://tge.pl/energia-elektryczna-rdn?dateShow=$data_day_dd"
curl -s $tge_rdn_url > .tge_rdn.tmp
date_from_file=`cat .tge_rdn.tmp | grep "dostawy w dniu" | sed 's/<small>dla dostawy w dniu /x/g;s/<\/small><\/h4>/x/g' | cut -d 'x' -f2 | grep '[0:9]'`
date_convert=`date -d $(awk -F'-' '{printf("%04d-%02d-%02d\n",$3,$2,$1)}' <<< $date_from_file) +%Y-%m-%d`
hours=(`cat .tge_rdn.tmp | grep "\"date\":" | grep -v parseInt | cut -d ' ' -f7 | grep '[0:9]' | sed 's/\",//g'`)
prices=(`cat .tge_rdn.tmp | grep kurs1 | sed 's/\t\t\t\t\t\t\t\t/x/g;s/'\''/_/g' | grep -v 'x\|value' | cut -d '_' -f2`)
# date_from_file=`cat .tge_rdn.tmp | pup 'h4 :contains("dostawy") text{}' | grep -v '^ ' | cut -d ' ' -f5` #pup
# hours=(` cat .tge_rdn.tmp | pup 'div table#footable_kontrakty_godzinowe tr :nth-of-type(1) text{}' | grep '[0-9]'`) #pup
# prices=(`cat .tge_rdn.tmp | pup 'div table#footable_kontrakty_godzinowe tr :nth-of-type(2) text{}' | sed 's/,/./g;s/-/9999/' | grep '[0-9]'`) #pup
for index in ${!hours[*]}; do
if [[ ${hours[$index]} == *"a"* ]]; then
unset "hours[$index]"
# if [[ ${hours[$index]} != "9999" ]]; then #pup
if [[ ${#hours[@]} != ${#prices[@]} ]]; then
unset "prices[$index]"
prices=( ${prices[@]} )
fi
hours=( ${hours[@]} )
fi
done
for index in ${!hours[*]}; do
date_for_json=`date -d "$date_convert $index" +%Y-%m-%dT%H:%M:%SZ`
j_fixing_i+=` jq -nc --arg d "$date_for_json" --argjson p "${prices[$index]}" '{"date": $d, "price": $p}'`
html_data+=`echo ${hours[$index]} " - " ${prices[$index]} "("${#hours[@]}")" - "("${#prices[@]}") "`
done
new=`jq -c '.' <<< $j_fixing_i | jq -sc '.'`
#-------------------------------------------------------------------------------------------------------------------------------------------------
if [[ -f ${file_name[1]} ]]; then
old=`jq -c '.[]' ${file_name[1]}`
end_range=`date +%Y-%m-%d -d @$(($(date +%s)+(1*24*3600)))`
if [[ `jq '. | length' <<< $new` -eq 24 ]]; then
result2=`jq -sc 'add | unique_by(.date) | .[]' <<< $old$new | jq -sc --arg s $start_range --arg e $end_range 'map(select(.date | . >= $s and . <= $e + "z"))' | jq -sc --arg attr "${attrib[1]}" '{$attr: .[]}'` #to z dolu
echo $result2 > ${file_name[1]}
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then tomerge2=$result2
fi
error_msg="no error2"
else
error_msg="blad danych2"
fi
else
if [[ `jq '. | length' <<< $new` -eq 24 ]]; then
result2=`jq -sc --arg attr "${attrib[1]}" ' {$attr: .[]}' <<< $new`
echo $result2 > ${file_name[1]}
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then tomerge2=$result2
fi
error_msg="no error1"
else
error_msg="blad danych1"
fi
fi
msg="-------------------------------"
msg+=" json attribute: "${attrib[1]}" filename: "${file_name[1]}" filesize: "`wc -c ${file_name[1]} | cut -d ' ' -f1`
msg+=" data day: "$data_day_dd" date from html: "$date_from_file" date converted: "$date_convert" date range: "$start_range" to "$end_range
msg+=" data source: "$tge_rdn_url
msg+=" error: "$error_msg
msg+=" -------------------------------"
if [[ $3 == *"verbose"* || $4 == *"verbose"* ]]; then
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%10s %s %s\n%s %s %s %s\n%s %s %s\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s\n%s\n" $msg
printf "%8s %2s %7s %s %s %s \n" $html_data-------------------------------
jq -sc '.[]' <<< $result2
fi
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%10s %s %s\n%s %s %s %s\n%s %s %s\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s\n%s\n" $msg >> $0.log
printf "%8s %2s %7s %s %s %s \n" $html_data------------------------------- >> $0.log
rm .tge_rdn.tmp
fi
# #=================================================================================================================================================
if [[ $1 == *"pse_rce"* ]]; then
operator=eq
select="%24select=doba,rce_pln,udtczas_oreb"
filter="%24filter=doba%20$operator%20%27$data_day%27"
pse_rce_url="https://api.raporty.pse.pl/api/rce-pln?$select&$filter"
for i in $(seq 1 $pse_ilosc_prob_pobrania); do
case $pse_rce_format in
4) new=`curl -H "Accept: application/json" -s $pse_rce_url | sed 's/a:/:/g' | jq -c '.value[] | {date: "\(.doba)T\(.udtczas_oreb[0:5]):00Z", price: (.rce_pln*100 | round/100)}' | jq -sc '.'`
data_format=M15 ;;
1) new=`curl -H "Accept: application/json" -s $pse_rce_url | sed 's/a:/:/g' | jq -c '.value[] | {date: "\(.doba)T\(.udtczas_oreb[0:2]):00:00Z", price: (.rce_pln*100 | round/100)}' | jq -sc '. | unique_by(.date)'`
data_format=H1 ;;
*) new=`curl -H "Accept: application/json" -s $pse_rce_url | sed 's/a:/:/g' | jq -c '.value[] | {date: "\(.doba)T\(.udtczas_oreb[0:5]):00Z", price: (.rce_pln*100 | round/100)}' | jq -sc '.'`
data_format=M15 ;;
esac
if [[ `jq '. | length' <<< $new` -ne 0 ]]; then break
fi
sleep 2
done
if [[ -f ${file_name[2]} ]]; then
old=`jq -c '.[]' ${file_name[2]}`
if [[ `jq '. | length' <<< $new` -eq pse_rce_format*24 ]]; then
result3=`jq -sc 'add | unique_by(.date) | .[]' <<< $old$new | jq -sc --arg s $start_range --arg e $data_day 'map(select(.date | . >= $s and . <= $e + "z"))' | jq -sc --arg attr "${attrib[2]}" '{$attr: .[]}'`
echo $result3 > ${file_name[2]}
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then tomerge3=$result3
fi
error_msg="no error2"
else
error_msg="blad danych2"
fi
else
if [[ `jq '. | length' <<< $new` -eq pse_rce_format*24 ]]; then #result3=`jq -c '.' <<< $new | jq -sc --arg attr "${attrib[2]}" ' {$attr: .[]}'` #to jest ok
result3=`jq -sc --arg attr "${attrib[2]}" ' {$attr: .[]}' <<< $new`
echo $result3 > ${file_name[2]}
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then tomerge3=$result3
fi
error_msg="no error1"
else
error_msg="blad danych1"
fi
fi
msg="-------------------------------"
msg+=" json attribute: "${attrib[2]}" filename: "${file_name[2]}" filesize: "`wc -c ${file_name[2]} | cut -d ' ' -f1`
msg+=" data format: "$data_format
msg+=" data day: "$data_day" date range: "$start_range" to "$data_day
msg+=" data source: "$pse_rce_url
msg+=" error: "$error_msg
msg+=" -------------------------------"
if [[ $3 == *"verbose"* || $4 == *"verbose"* ]]; then
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%7s %s %s\n%10s %s %s\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s\n%s\n" $msg
jq -sc '.[]' <<< $result3
fi
printf "%s\n%s %s %s\n%15s %s\n%15s %s bytes\n%7s %s %s\n%10s %s %s\n%8s %s %s %s %s\n%7s %s %s\n%15s %s %s\n%s\n" $msg >> $0.log
fi
# #=================================================================================================================================================
if [[ $3 == *"merge"* || $4 == *"merge"* ]]; then
jq -sc 'add' <<< $tomerge1$tomerge2$tomerge3 > $merge_filename
if [[ $3 == *"verbose"* || $4 == *"verbose"* ]]; then
echo -e '\n'"#################################################### merged ####################################################"'\n'
jq -sc '.[]' $merge_filename
fi
fi
#script by © bialy
#https://forum.arturhome.pl/t/rynkowe-ceny-energii-elektrycznej/12051/117
#https://stackoverflow.com/questions/49181898/jq-replace-part-of-value-in-json
#new=`curl -H "Accept: application/json" -s $pse_rce_url | jq '.value[]' | jq '{date: "\(.doba)T\(.udtczas_oreb[0:6] | sub("a"; "")):00Z", price: .rce_pln}' | jq -nc '. |= [inputs]'`
efekt końcowy
edit:
poniżej sensor przełączający się pomiędzy źródłami: energy_instrat > tge_rdn > pse_rce (6h przed północą). dla pse_rce w formacie danych M15 jest parametr pse_rce_format = 4, dla H1 pse_rce_format=1. dla H1 nie trzeba tego zmieniać, ale wtedy zakres wczytanych danych jest spoza zakresu. i pomimo że działa to nigdy nie wiadomo. sprawdzałem działanie ręcznie usuwając dane i było ok. przydałoby się jakieś powiadomienie do jeśli nastąpi przełączenie, no ale tego już chyba nie ogarnę
w configuration.yaml
template:
- sensor:
- name: "Crurrent TGE Prices extended"
unique_id: 20241002000001
unit_of_measurement: "PLN/MWh"
state: >
{% set current_time = now().strftime('%Y-%m-%dT%H:00:00Z') %}
{% set delta = ((states('sensor.tge_rdn') | as_timestamp - current_time | as_timestamp)/3600 ) | int +1 %}
{% set dates = state_attr('sensor.tge_rdn', 'tge_rdn')[-delta:] %}
{% if delta <= 6 %}
{% set delta = ((states('sensor.tge_rdn2') | as_timestamp - current_time | as_timestamp)/3600 ) | int +1 %}
{% set dates = state_attr('sensor.tge_rdn2', 'tge_rdn2')[-delta:] %}
{% if delta <= 6 %}
{% set pse_rce_format = 4 %}
{% set delta = (pse_rce_format * (states('sensor.pse_rce') | as_timestamp - current_time | as_timestamp) / 3600) | int+1 %}
{% set current_quarter = ( now().strftime('%M') | int / 15) | int %}
{% set delta = delta-current_quarter %}
{% set dates = state_attr('sensor.pse_rce', 'pse_rce')[-delta:] %}
{% endif %}
{% endif %}
{% for date in dates %}
{% set start_time = date.date %}
{% if start_time >= current_time %}
{{ date.price }}
{% break %}
{% endif %}
{% endfor %}
icon: mdi:cash-100
poprzedni skrypt który tu był HighestLowest będę teraz dostosowywał do danych powyżej, wrzuciłem tylko do wglądu i ewentualnych uwag