Pompa ciepła – wybranie optymalnego czasu grzania wody CWU na podstawie prognozy pogody

Ten kto ma pompę ciepła, to wie iż im wyższa temperatura na zewnątrz to pompa ma większą wydajność, czyli jest taniej.

Potrzebuję zrobić automatyzację, który sprawdzi mi prognozowane temperatury w dniu dzisiejszym (co godzinę), i wybierze najlepszy czas na zagrzanie wody CWU.

Zakładam ten temat licząc że ktoś już ma coś takiego i się może podzieli, bo jak zacząłem rozeznawać temat, to jest to dość trudne do zrobienia.

Warunki:

Mamy prognozę pogody co godzinę: sensor.weather.dom_hourly

Pompa grzeję mi wodę około 2 godziny, więc nie powinno to być szczytowa wartość, ale np. -1h od szczytowej

No i ma być pochmurno (jak jest słońce to mam solary :slight_smile:

Temperatury mamy zaszyte w atrybutach, ale jak zrobić całą automatyzacje, która wyciągnie najwyższe wartości i wskaże godzinę?

obraz

Nie jest… masz tablicę T(i) = data.atributes.forecast[0…23].temperature. Przeglądasz po wszystkich indeksach i od 0 do 23. Zaczynasz od 0 i porównujesz czy kolejna temperatura jest wyższa od poprzedniej - jeśli tak to zapamiętujesz index i nową temperaturę (jako bazową do następnego porównania) itd. do ostatniego indeksu - ostatecznie na koniec otrzymasz najwyższe wystąpienie.
Daj przykładowe dane to Ci napiszę - będzie łatwiej i szybciej niż o tym opowiedzieć.

1 polubienie

w zasadzie to dane zaciągam z tego:
flows.json (1,4 KB)
jak sama funkcję porównania tej tablicy zrobisz to lwia część roboty z głowy…

… proszę czekać, proces w toku :slight_smile:
@luki25 … wynik otrzymujesz w msg.godz i msg.temp_max

//msg.data.attributes.forecast[0].temperature
var temp_max = -50;
var temp_h;
var godz =-1;
var i;

for (i = 0; i <= 23; i++) {
    temp_h = msg.data.attributes.forecast[i].temperature;
    if (temp_h > temp_max){
        temp_max = temp_h;
        godz = i;
    }

}    
msg.temp_max=temp_max;
msg.godz = godz;
return msg;

Mistrzu, a co się stanie gdy w ciągu np 2 h prognoza się radykalnie zmieni ? Czy ta pętla sobie z tym poradzi ? Pytam bo moja wyobraźnia jeszcze nie sięga tak daleko :slight_smile:

:thinking: weź nie utrudniaj na samym początku… :wink:. Narazie liczę, że prognoza nie powinna się zmienić w ciągu dnia, wydaję mi się że tak krótki czas powinien być pewny

@RobinI30 dzięki za funkcje, za chwilę przystąpię do klejenia czegoś.

haha… właśnie się zmieniła :slight_smile:
Tak może okazać się, że najcieplej już było. Można wprowadzić drobną modyfikację i startować z indesem nie od 0 a od aktualnej godziny ( to ma sens) :slight_smile:

1 polubienie

Nie chcę utrudniać , ani oceniać pomysłu. Tak sobie głośno myślę tylko.
Sprawdzanie w pętli od aktualnej godziny jest znacznie lepsze, ale też nie daje gwarancji zagrzania wody w najcieplejszym momencie dnia. Nie lepiej bazować na trendach z ostatnich lat ? Najcieplejsze godziny to z reguły 13 -15 , nawet jak nie zawsze się uda wstrzelić to w 90% na pewno.

w różnych miesiącach jest róznie, a szczególnie 02, 03, 04, 05, 10, 11, 12
Moja Pompa Ciepła powyżej 8st C znacznie zmniejsza zużycie prądu, a wachania w ciąga dnia potrafią być różne
obraz
obraz
czasem max jest o 11stej, czasem o 13stej, różnie się zdarza w okresach poza letnich, mają na to wpływ bardziej masy powietrza jak pory dnia czy słońce

Mi problem rozwiazala taryfa G12. Grzeje nad ranem oraz 13…15 gdy mam obnizona stawke. A G12W, sklonila aby w sobotę realizować wygrzewanie legionelli do 65C. Zaczyna od 10.00 i trwa ze 2h. W ciagu dnia bo mam PV wiec autokonsumpcja.

1 polubienie

Cześć, Pierwsze szkice już mam, flow inicjuje czujnik temp zewnętrznej i za każdym razem robi porównanie pomiędzy prognozą a aktualną temperaturą, jak si zbliża do 2st to wtedy uruchamia PC. Więc zmiana prognozy pogody w tym czasie sama się uwzględnia.
flows.json (3,4 KB)

Mam problem, bo czas mam podany ze strefą +00:00 z encji. Jak to przekonwertować na nasz czas? chciałem rano wysłać sobie plan uruchomienia na telefon, ale godzinę mam złą.
@marcingebus, powiedz proszę ile energii zużywasz na zagrzanie wody do 65st i jaka to ilość wody. Jestem ciekawe pracy czystej grzałki

Jako uczeń podstawówki odpowiedziałbym tak. Do obliczenia potrzebnej ilości energii do ogrzania 100 litrów wody z 50 stopni Celsjusza do 65 stopni Celsjusza należy użyć wzoru:

Q = m * c * ΔT wtedy Q = 62 790 J więc jeśli mamy np. grzałkę o mocy 600 watt to czas takiej operacji t = Q / P , t = 62 790 J / 600 W
t = 104,65 s , więc nieco ponad minutę :slight_smile: Też mnie ciekawi odpowiedź @marcingebus

Mam Pompę Ciepła, więc grzałka się włącza gdy pompa nie może wytworzyć odpowiedniej temperatury. Wyniki z ShellyCloud są to TOTAL, czyli sprężarka jest na jednej fazie i dwie grzałki na pozostałych, poniżej suma wszystkich 3 faz (licznik obejmuje tylko pompę ciepła), ale jest tutaj też pompa obiegowa, cyrkulacja i grzanie domu jeśli się przełączało wówczas.:

  • 08/04/2023 08:00,“2642.8500000000004”
  • 08/04/2023 09:00,“679.65”
  • 08/04/2023 10:00,“8520.23”
  • 08/04/2023 11:00,“5802.3099999999995”
  • 08/04/2023 12:00,“683.39”
  • 08/04/2023 13:00,“692.72”
  • 08/04/2023 14:00,“699.26”
  • 08/04/2023 15:00,“345.46”
  • 08/04/2023 16:00,“37.76”

Można więc przyjąć, że zużycie, to 8520+5802, dochodzi do tego jeszcze utrzymanie temperatury przez 2h, więc można coś tam dodać poza tymi dwoma PIKAMI. Przy czym temperatura w mojej PC, to chyba maksimum 60C, a nie 65C. Mógłbym dogrzać grzałką elektryczną do 65C (sterowaną z poza pompy ciepła), ale aż tak mi nie zależy. Zbiornik 300l, utrzymywana temperatura to około 40C.

Wyniki z innych dni jeśli się komuś chce analizować. Jednoznacznej informacji nie ma ale stawiam, że są to Wh:

01/04/2023 07:00,“679.97”
01/04/2023 08:00,“578.62”
01/04/2023 09:00,“37.72”
01/04/2023 10:00,“8136.390000000001”
01/04/2023 11:00,“7124.33”
01/04/2023 12:00,“756.12”
01/04/2023 13:00,“37.57”
01/04/2023 14:00,“37.64”

25/03/2023 07:00,“68.52”
25/03/2023 08:00,“837.78”
25/03/2023 09:00,“757.53”
25/03/2023 10:00,“8455.86”
25/03/2023 11:00,“4527.24”
25/03/2023 12:00,“39.4”
25/03/2023 13:00,“37.44”
25/03/2023 14:00,“37.82”

18/03/2023 06:00,“842.72”
18/03/2023 07:00,“1366.63”
18/03/2023 08:00,“684.27”
18/03/2023 09:00,“691.41”
18/03/2023 10:00,“8286.82”
18/03/2023 11:00,“5231.09”
18/03/2023 12:00,“615.92”
18/03/2023 13:00,“37.69”
18/03/2023 14:00,“37.67”
18/03/2023 15:00,“93.36”

11/03/2023 07:00,“901.07”
11/03/2023 08:00,“955.35”
11/03/2023 09:00,“680.34”
11/03/2023 10:00,“7047.73”
11/03/2023 11:00,“5928.849999999999”
11/03/2023 12:00,“998.08”
11/03/2023 13:00,“690.46”
11/03/2023 14:00,“1018.38”
11/03/2023 15:00,“694.75”

Czy otrzymany parametr nie ma związku z czasem rzeczywistym, a jedynie oznacza iterację pętli w której znaleziono pierwszą najwyższą temperaturę ?
1
2

Jeśli mnie pytasz, to nie wiem co i jak zwraca integracja. Moim zadaniem było znaleść max :wink:
Tak patrząc teraz na działanie to wygląda na to, że godz oznacza “za x godzin będzie max”

godz = i; zwraca numer tablicy :slight_smile: co oznacza w której tablicy znalazł pierwszą najwyższa prognozowaną temperaturę.

PS. zmieniłem trochę ten kod aby podawał info o której godzinie spodziewana jest ta najwyższa temperatura

var temp_max = -50;
var temp_h;
var tab = -1;
var i;

for (i = 0; i <= 23; i++) {
    temp_h = msg.data.attributes.forecast[i].temperature;
    if (temp_h > temp_max) {
        temp_max = temp_h;
        tab = i;
    }
}

msg.temp_max = temp_max;
msg.tab = tab;
msg.godz = new Date(msg.data.attributes.forecast[tab].datetime).getHours();

return msg;

11

Spoko to działa, ale pojawił się problem. Jak najwyższa temperatura jest około 17stej i zbliżamy się do tej godziny, to może wystąpić, że kolejnego dnia wyższa temp będzie o 11stej i wtedy wskaże tą wartość, bo prognoza jest na 24h i ten zakres uwzględnia tablica. Skrypt musiał by uwzględniać przeszukanie tablicy tylko z dniem dzisiejszym, albo pozostaje przeszukać z rana i odczekiwać określony czas.

Tez to wczoraj zauważyłem, jest też inny problem, kiedy obecna temperatura teraz (już rano) jest wyższa niż prognozowana max dla danego dnia :slight_smile:

PS. Jest ok, zapomiałem przestawic czujnik na właściwe miejsce po wczorajszej zabawie i mierzył w garażu a nie na zewnątrz.

Dlatego bawiąc się staram się wykluczać wyniki dla przyszłych dat

var temp_max = -50;
var temp_h;
var tab = -1;
var i;

for (i = 0; i <= 23; i++) {
    temp_h = msg.data.attributes.forecast[i].temperature;
    if (temp_h > temp_max) {
        temp_max = temp_h;
        tab = i;
    }
}

msg.temp_max = temp_max;
msg.tab = tab;
msg.godz = new Date(msg.data.attributes.forecast[tab].datetime).getHours();

// Ustaw typ dnia
const currentDate = new Date();
const forecastDate = new Date(msg.data.attributes.forecast[tab].datetime);
let dzien_typ = '';

const currentHour = new Date().getHours();
if (forecastDate > currentDate && msg.godz < currentHour) {
    dzien_typ = 'jutro';
} else {
    dzien_typ = 'dziś';
}

msg.dzien_typ = dzien_typ;

return msg;

1 polubienie

Zrobiłem proces ciut inaczej, otóż, sprawdzam tylko raz pogodę o 7:00 i definiuje odpowiednie odliczanie, wtedy nie ma tematu, że przerzuci temp max z jutra, pozostało tylko mi wyeliminować, pogody słoneczne z prognozy, gdyż woda wtedy sama mi się nagrzeje.


flows.json (7,4 KB)

Nie lepiej to zrobić tak? Robi dokładnie to samo.


flows (47).json (4,7 KB)

Bez używania jakiś dodatkowych obcych nodów, które przy kolejnej aktualizacji mogą przestać działać.

Skoro sprawdzasz raz o 7, to ogranicz przeszukiwanie tylko do pierwszych 10 elementów.
Można by to jeszcze trochę wyczyścić … ale już mi się nie chciało.
Dodałem możliwość resetowania, gdybyś z jakiegoś powodu się rozmyślił.

1 polubienie