Sterowanie grzałką elektryczną CWU

Cześć, dopiero zaczynam przygodę z płynnym sterowaniem mocy grzałki CWU. Zakupiłem gotowca na ali od robotdyn. Specyfikacja 24A 600V.

Jestem po testach z grzałką 2200W i wszystko jest ok (wymieniłem tylko radiator na większy). Jednak mam problem z “okodowaniem” tego w node red. Czy ktoś z forum może sie podzielić rozwiązaniem jak steruje takim układme? Dzięki

1 polubienie

Daj link.
Chętnie też zamówię i spróbuję coś podziałać. :slightly_smiling_face:

24A

Cześć, Poniżej link do aukcji. Dostawa bardzo szybka - 8 dni i było na miejscu.
16/24A 600V
@Kraszewsky znasz sie troszkę na Node-Red? Może coś podpowiesz?
Aktualnie udało mi sie zrobić sumę z przepływu 3 faz i według tych obliczeń ustawiam odpowiednia moc grzałki. Nie wiem jak zrobić sterowanie po załaczeniu grzałki aby dodawać aktualną moc grzałki do obliczeń.

1 polubienie

Wydaje mi sie, że dużo prostrze rozwiązanie to dążenie do określonego przeływu ( np. - 300W) i zwiększanie/zmniejszanie mocy grzałki o określone %. Tak aby wynik dażył do - 300W. Jednak moja wiedza nie opanuje tego :slight_smile: Liczę na Waszą pomoc, może ktoś podpowie jakieś sprawdzone rozwiązanie.

Panowie mały UPDATE. Udało sie rozwiązać problem. Dodałem odczyt brightness, następnie przerabiam odczyt na moc grzałki i odejmuje od wyniku sumy 3 faz. Jutro testy.

1 polubienie

Nie wiem jak częsty masz odczyt z faz, ale sugerowałbym Ci użyć noda node-red-node-smooth (node) - Node-RED

Dzięki temu regulator nie będzie szaleć jak będą chmury z prześwitami

U mnie gdy jest włączona grzałka sprawdza w którym zakresie jest zapas mocy co 15 sekund
image
i dodaje albo odejmuje po jednym poziomie na dimerze
image

no musisz testować i kombinować :slight_smile:

1 polubienie

@bartolomeo jak sprawdza się układ projektowany dla Ciebie?

Jak to z prototypami bywa, siadł pierwszego dnia po uruchomieniu. :slight_smile:. Ale okazało się, że tam jakiś rezystor był źle dobrany i po poprawkach po prostu działa od około 2 miesięcy. Temperatura na radiatorze max. 50 stopni, lekko grzałka (lub jej układ) buczy przy regulacji innej niż 100%. Pewnie kilka rzeczy bym na tej płytce też lekko dopracował, bo gniazda stosunkowo małe jak na przewody, które chciałem zastosować. Dorobiłem do tego odpowiadająca mi logikę w NR i teraz grzeję wodę tylko nadwyżkami z PV a jeśli ich nie ma to utrzymuję minimalną zadaną.

1 polubienie

Dasz namiar na wykonawcę? Jakie koszty?
Zamówiłem moduł AC dimmer podobny do Robotdyn, jeżeli on nie zda egzaminu to spróbuję Twojego rozwiązania.
PS. podzielisz się skryptem lub chociaż logiką sterowania w NR?

Elektronek.pl
Z wysyłką zapłaciłem chyba 160zł. Dodatkowo we własnym zakresie obudowa, radiator itd. Osobiście bym wprowadził kilka modyfikacji na tej płytce, ale to moja wina, bo nie wnikałem w projekt (mocniejsze przekaźniki, większe gniazda, może odwrócone w drugą stronę dla mniejszej plątaniny), ale ogólnie nieźle i dość kontaktowo. Pewnie kolejne wersje będą ulepszone.

A co do logiki to dośc prosto:

Wyzwalaczem jest encja “grid usage”. Jeśli oddaję do sieci to przyjmuje wartość ujemną. Jeśli pobieram to dodatnią. Sprawdzam czy jest noc (nocą między 2:00 a 5:00 nikt się nie kąpie, więc nigdy nie grzeję - tak z zasady), później sprawdzam jaka jest delta między zadaną temperaturą a docelową i na tej podstawie ustawiam konkretną obliczoną w funkcji moc grzałki, lub 100% mocy lub ją wyłączam. Jeśli nie ma nadprodukcji a temperatura boilera spada za bardzo to uruchamiam grzałkę na 100%, tak by nie pozbawić się ciepłej wody. Podrzucam screen dla orientacji. Jak ktoś będzie chciał dokładniej to proszę się odezwać.

Jako zabezpieczenie dla całości oczywiście jest oryginalny termostat boilera ustawiony na jakieś 60 stopni, więc w górę mi nie przegrzeje w razie czego.

1 polubienie

Proszę napisz jak sprawuje się ten sterownik, właśnie go zamówiłem i czekam na dostawę, może jakieś wskazówki do uruchomienia, jaki radiator, jaka grzałka, czym jest sterowany. Jeżeli tym co jest na screenie to czy jest możliwość podesłania kodu

Proszę. Wklejam zanonimizowany kod do Node-red. Jako, że mój zasobnik c.w.u. jest hybrydowy, to rozbudowałem ten flow niedawno o sprawdzanie temperatury na piecu. Jeśli piec grzeje, to ma priorytet nad grzaniem z paneli. Jeśli go po sezonie wyłączę, lub byłaby jakas awaria, to woda nagrzeje się elektrycznie.

[
    {
        "id": "node_1",
        "type": "server-state-changed",
        "z": "main_flow",
        "name": "gridUsage",
        "server": "home_assistant_server",
        "version": 6,
        "outputs": 1,
        "entities": {
            "entity": ["sensor.grid_usage"],
            "substring": [],
            "regex": []
        },
        "outputInitially": false,
        "stateType": "str",
        "ifState": "",
        "ifStateType": "str",
        "ifStateOperator": "is",
        "outputOnlyOnStateChange": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "gridUsage",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 120,
        "y": 280,
        "wires": [["node_2"]]
    },
    {
        "id": "node_3",
        "type": "api-current-state",
        "z": "main_flow",
        "name": "HeaterControl",
        "server": "home_assistant_server",
        "version": 3,
        "outputs": 1,
        "entity_id": "water_heater.heater_control",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "heaterTemp",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "x": 700,
        "y": 320,
        "wires": [["node_4"]]
    },
    {
        "id": "node_5",
        "type": "function",
        "z": "main_flow",
        "name": "Calculate Brightness",
        "func": "const gridUsage = parseFloat(msg.gridUsage);\nconst nominalHeaterPower = 2.0;\nconst maxGrid = 0.1;\nlet brightness = 0;\nif (-gridUsage > nominalHeaterPower) {\n    brightness = 255;\n} else {\n    const excessToGive = Math.max(-gridUsage - maxGrid, 0);\n    brightness = Math.min(Math.max(0, Math.round(255 * excessToGive / nominalHeaterPower)), 255);\n}\nreturn { payload: brightness };",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "x": 880,
        "y": 420,
        "wires": [["node_6"]]
    },
    {
        "id": "node_6",
        "type": "switch",
        "z": "main_flow",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            { "t": "lte", "v": "25", "vt": "str" },
            { "t": "gt", "v": "25", "vt": "str" }
        ],
        "outputs": 2,
        "x": 1030,
        "y": 420,
        "wires": [["node_off"], ["node_on"]]
    },
    {
        "id": "node_off",
        "type": "api-call-service",
        "z": "main_flow",
        "name": "Turn Heater Off",
        "server": "home_assistant_server",
        "version": 7,
        "action": "light.turn_off",
        "entityId": ["light.heater_brightness"],
        "x": 1250,
        "y": 300,
        "wires": []
    },
    {
        "id": "node_on",
        "type": "api-call-service",
        "z": "main_flow",
        "name": "Turn Heater On + Brightness",
        "server": "home_assistant_server",
        "version": 7,
        "action": "light.turn_on",
        "entityId": ["light.heater_brightness"],
        "data": "{\"brightness\":msg.payload}",
        "dataType": "jsonata",
        "x": 1250,
        "y": 480,
        "wires": []
    },
    {
        "id": "node_4",
        "type": "function",
        "z": "main_flow",
        "name": "Temperature Delta",
        "func": "const data = msg.data;\nconst targetTempHigh = data.attributes.target_temp_high;\nconst currentTemp = data.attributes.current_temperature;\nconst difference = targetTempHigh - currentTemp;\nreturn { payload: difference };",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "x": 250,
        "y": 420,
        "wires": [["node_7"]]
    },
    {
        "id": "node_7",
        "type": "switch",
        "z": "main_flow",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            { "t": "lt", "v": "1", "vt": "str" },
            { "t": "btwn", "v": "1", "vt": "num", "v2": "8", "v2t": "num" },
            { "t": "gt", "v": "8", "vt": "num" }
        ],
        "outputs": 3,
        "x": 430,
        "y": 420,
        "wires": [["node_off"], ["node_8"], ["node_max_brightness"]]
    },
    {
        "id": "node_max_brightness",
        "type": "api-call-service",
        "z": "main_flow",
        "name": "Turn Heater On + Max Brightness",
        "server": "home_assistant_server",
        "version": 7,
        "action": "light.turn_on",
        "entityId": ["light.heater_brightness"],
        "data": "{\"brightness\":255}",
        "dataType": "jsonata",
        "x": 1280,
        "y": 580,
        "wires": []
    },
    {
        "id": "node_8",
        "type": "api-current-state",
        "z": "main_flow",
        "name": "Check Grid Usage",
        "server": "home_assistant_server",
        "version": 3,
        "outputs": 1,
        "entity_id": "sensor.grid_usage",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            { "property": "gridUsage", "propertyType": "msg", "value": "", "valueType": "entityState" },
            { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" }
        ],
        "x": 670,
        "y": 420,
        "wires": [["node_5"]]
    },
    {
        "id": "home_assistant_server",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true
    }
]

1 polubienie

Witam.
Mam prośbę bo nie mogę sobie poradzić z automatyzacją. Zrobiłem sterownik, który ma sterować pompą obiegową co. Chciałbym aby sterownik załączył pompę jeżeli temperatura osiągnie 70, a gdy spadnie do 45 ma się wyłączyć. Moim sterownikiem jest sonoff z wgranym Tasmota .
pozdr.

Witam.
Dziękuje za podpowiedź. Automatyzacja zrobiona i dodana. Jak na razie w fazie testów ze sterownikiem działa prawidłowo.
pozdrawiam

Jest też możliwość utworzenia pomocnika sensor progowy.

Witam.
Sensor progowy? nie bardzo wiem…o co chodzi.

1 polubienie

Ok. Zobaczę jak to zadziała. Ale bardziej myślę o histerezie dolnej i górnej. Coś pokombinuję. Chyba, że masz jakiś pomysł?

mój kod:

  • id: ‘1730548293071’
    alias: pompa bufora CO załącz
    description: załącz pompę obiegową bufora CO
    triggers:
    • type: temperature
      device_id: 6b6a27afdf2ae6e43ee014967be96e01
      entity_id: 252adae6a2becf83b7cb13b7a2d5fbfa
      domain: sensor
      trigger: device
      above: 30
      conditions:
      actions:
    • type: turn_on
      device_id: 6b6a27afdf2ae6e43ee014967be96e01
      entity_id: aac46026c725ce0d61b52f71c730fe3f
      domain: switch
      mode: single
  • id: ‘1730549251534’
    alias: Pompa bufora CO wyłącz
    description: wyłącz pompę obiegową bufora CO
    triggers:
    • type: temperature
      device_id: 6b6a27afdf2ae6e43ee014967be96e01
      entity_id: 252adae6a2becf83b7cb13b7a2d5fbfa
      domain: sensor
      trigger: device
      below: 24
      conditions:
      actions:
    • type: turn_off
      device_id: 6b6a27afdf2ae6e43ee014967be96e01
      entity_id: aac46026c725ce0d61b52f71c730fe3f
      domain: switch
      mode: single

gdzie dopisać histereze dla tych dwóch temperatur, jakieś 2 stopinie. Oczywiście te temperatury będą inne 70 i 45.