Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Integrere Høiax Connected varmtvannsbereder i Home Assistant


Anbefalte innlegg

Tenkte å dele hvordan jeg har integrert vår Høiax Connected varmtvannsbereder i Home Assistant.

Det er dessverre ikke lokalt, men går gjennom skyen (myuplink).

 

Vi har en 300 liter bereder som har to varmelementer (1750W og 1250W). Det er mulig å redusere effekten eller slå av varmtvannsberederen dersom man ser at man kommer over grensen for neste nettleietrinn. Det krever selvføgelig at man har en amsmåler.

 

Det er også mulig å integrere berederen i Energy dashboard osv.

 

Jeg har integrert berederen gjennom restful integrasjonen i Home Assistant.

 

For å kunne bruke myuplink APIen trenger man en token. Den er gyldig i 1 time. For å få den må man autorisere seg med client_id og client_secret. Disse får man ved å registrere seg på dev.myuplink.com. Der setter man opp en application.

 

Sensoren som oppdaterer token ser slik ut:

 

sensor:

  - platform: rest
    name: myuplink_token
    resource: https://api.myuplink.com/oauth/token
    method: POST 
    headers:
      Content-Type: application/x-www-form-urlencoded
    payload: grant_type=client_credentials&client_id=[client_id]&client_secret=[client_secret]
    scan_interval: 1800
    json_attributes:
      - access_token
      - token_type #optional
      - expires_in #optional
    value_template: "ok"

 

Token er en attribute fordi den er for lang til å være en vanlig value.

 

Info fra varmtvannsberederen får man slik:

 


rest:
  - scan_interval: 30
    method: GET
    resource: https://api.myuplink.com/v2/devices/[device_id]/points
    headers:
      Authorization: >
        Bearer {{ states.sensor.myuplink_token.attributes["access_token"] }}
    sensor:
      - name: " Myuplink Power Waterheater"
        unique_id: "myuplink_power_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='400')]"
        value_template: "OK"
        json_attributes:
          - value
      - name: "Myuplink Fill level Waterheater"
        unique_id: "myuplink_fill_level_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='404')]"
        value_template: "OK"
        json_attributes:
          - value
      - name: "Myuplink Element 1 Status Waterheater"
        unique_id: "myuplink_element_1_status_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='506')]"
        value_template: "OK"
        json_attributes:
          - value
      - name: "Myuplink Element 2 Status Waterheater"
        unique_id: "myuplink_element_2_status_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='505')]"
        value_template: "OK"
        json_attributes:
          - value
      - name: "Myuplink Powermode Waterheater"
        unique_id: "myuplink_powermode_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='517')]"
        value_template: "OK"
        json_attributes:
          - value  
      - name: "Myuplink Setpoint Waterheater"
        unique_id: "myuplink_setpoint_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='527')]"
        value_template: "OK"
        json_attributes:
          - value
      - name: "Myuplink Temperature Waterheater"
        unique_id: "myuplink_temperature_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='528')]"
        value_template: "OK"
        json_attributes:
          - value                                                        
      - name: "Myuplink number expensive hours Waterheater"
        unique_id: "myuplink_expensive_hours_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='545')]"
        value_template: "OK"
        json_attributes:
          - value 
      - name: "Myuplink number cheap hours Waterheater"
        unique_id: "myuplink_cheap_hours_waterheater"
        json_attributes_path: "$.[?(@.parameterId=='547')]"
        value_template: "OK"
        json_attributes:
          - value           

 

Device_ID og de ulike parameterid kan man lett få ved å logge inn på dev.myuplink.com velge Documentation og Swagger. Så klikker dere på Authorize og bruker client_id og client_secret. Da kan man teste APIen og se hele JSON svaret fra APIen på alt som er mulig med APIen. Det er mange flere sensorer som kan settes opp.

 

Jeg har så laget en rest_command som styrer hvilke elementer som er på i berederen. Da kan man velge å kun varme med 1250W eller 1750W når strømforbruket i huset er høy.

 

Den ser sånn ut:

 

rest_command:
  waterheater_powermode_change:
    url: https://api.myuplink.com/v2/devices/[device_id]/points
    method: patch
    headers:
      Authorization: >
        Bearer {{ states.sensor.myuplink_token.attributes["access_token"] }}
    content_type: "application/json-patch+json"
    payload: >
          {% if  states('input_select.waterheater_powermode') == "3000W"   %}
            { "517": "3", }
          {% elif  states('input_select.waterheater_powermode') == "1250W"   %}
            { "517": "1", }
          {% elif  states('input_select.waterheater_powermode') == "1750W"   %}
            { "517": "2", }                         
          {% else %}
            { "517": "3", }
          {% endif %}

 

Samme metode kan brukes til å endre temperaturinnstilling, bytte mellom ulike modus, endre antall dyre timer osv.

 

Håper dette kan hjelpe noen.

 

  • Like 4
Lenke til kommentar
Del på andre sider

  • 2 uker senere...

Ja, det kan jeg 🙂

 

Først må man logge seg inn på dev.myuplink.com. Så velger man Documentation-Swagger.

Man må så autorisere tilgangen med Authorize og skriver inn client_id og client_secret. Så velger man både READSYSTEM og WRITESYSTEM.

 

Gå så helt ned til Systems og klikk på GET /v2/systems/me Get user systems.

Så klikker du på Try it out og Execute.

 

Man får så en slik response:

 

{
  "page": 1,
  "itemsPerPage": 10,
  "numItems": 1,
  "systems": [
    {
      "systemId": "xxxxxxxxxxxxxxxxxxxxxxxxx",
      "name": "xxx",
      "securityLevel": "admin",
      "hasAlarm": false,
      "country": "Norway",
      "devices": [
        {
          "id": "HOIAX_98++++",
          "connectionState": "Connected",
          "currentFwVersion": "1.6.6",
          "product": {
            "serialNumber": "xxxxxx",
            "name": "xxxxx"
          }
        }
      ]
    }
  ]
}

 

DeviceID er den med HOIAX_.

 

 

 

Så gjør du det samme med DevicePoints i Swagger. Bruk GET /v2/devices/{deviceId}/points  Get data points for device.

Try it out og lim inn device_id.

 

Man får så en slik response:

 

[
  {
    "category": "xxx",
    "parameterId": "100",
    "parameterName": "Expected ambient temperature",
    "parameterUnit": "°C",
    "writable": true,
    "timestamp": "2023-01-31T11:51:38+00:00",
    "value": 20,
    "strVal": "20°C",
    "smartHomeCategories": [],
    "minValue": 1000,
    "maxValue": 3500,
    "enumValues": [],
    "scaleValue": "0.01",
    "zoneId": null
  },
  {
    "category": "xx",
    "parameterId": "101",
    "parameterName": "Expected inlet water temperature",
    "parameterUnit": "°C",
    "writable": true,
    "timestamp": "2023-01-31T11:51:38+00:00",
    "value": 5,
    "strVal": "5°C",
    "smartHomeCategories": [],
    "minValue": 400,
    "maxValue": 2000,
    "enumValues": [],
    "scaleValue": "0.01",
    "zoneId": null
  },
  {
    "category": "xx",
    "parameterId": "102",
    "parameterName": "Default eco setpoint",
    "parameterUnit": "°C",
    "writable": false,
    "timestamp": "2023-01-31T11:51:38+00:00",
    "value": 56,
    "strVal": "56°C",
    "smartHomeCategories": [],
    "minValue": null,
    "maxValue": null,
    "enumValues": [],
    "scaleValue": "0.01",
    "zoneId": null
  },
  {

 

Svaret er mye lengre enn det jeg har limt inn her. parameterId er det du bruker i HomeAssistant (Se min første post). Hvis det er "writeable", kan du også endre ting med en rest_command.

 

  • Like 2
Lenke til kommentar
Del på andre sider

On 01/02/2023 at 13:23, opticip said:

Beste forklaring jeg har funnet så langt, meget bra. Spørmål fra nybegynner, hvor plasserer jeg disse filene ?

 

 

 

Filene er yaml filer. Alt som jeg skrev om, kan egentlig limes inn i configuration.yaml filen. 

 

Det er imidlertid mye ryddigere å bruke packages. Da deler du opp på en måte opp configuration.yaml filen i flere filer.

Jeg har feks en fil som heter varmtvann.yaml hvor alt ligger som gjelder varmtvannsberederen.

 

Se her for mer info:

https://www.home-assistant.io/docs/configuration/packages/

 

 

  • Like 1
Lenke til kommentar
Del på andre sider

On 04/02/2023 at 23:07, opticip said:

Beste forklaring jeg har funnet så langt, meget bra. Spørmål fra nybegynner, hvor plasserer jeg disse filene ?

 

Får kun opp OK, på alle 🙂 ingen verdier,, har du et eksempel på et config oppsett 🙂

 

 

Det er riktig at verdiene er "ok". Selve verdiene fra skyen ligger i attributes.

Jeg har brukt template sensorer for å få disse attributes som verdier om ønsket.

 

template:
  - sensor:
      - name: "Powermode Waterheater"
        unique_id: powermode waterheater
        state: >
          {% if  state_attr('sensor.myuplink_powermode_waterheater', 'value') == 3   %}
            3000
          {% elif  state_attr('sensor.myuplink_powermode_waterheater', 'value') == 1   %}
            1250
          {% elif  state_attr('sensor.myuplink_powermode_waterheater', 'value') == 2   %}
            1750                          
          {% else %}
            0
          {% endif %}        
        unit_of_measurement: "W"
        
  - trigger:
    - platform: time_pattern
      hours: '*'
      minutes: '*'
      seconds: 1        
  - sensor:      
      - name: "Power Waterheater"
        unique_id: power_waterheater
        state: "{{ state_attr('sensor.myuplink_power_waterheater', 'value') }}"
        unit_of_measurement: "W" 

 

Disse to template sensorer tar verdiene fra attributes og bruker de som "hovedverdi".

 

Den første ser på powermode av varmtvannsberederen. 3 betyr 3000W effekt, 2 betyr 1750 og 1 betyr 1250.

Siste sensor  oppdaterer seg hvert sekund (det er triggeren) og sjekker om attribute på aktuell strømbruk har endret seg. Den viser da alltid hvor mange W berederen bruker akkurat nå.

 

Håper det hjelper. 🙂

Lenke til kommentar
Del på andre sider

  • 1 måned senere...

Hei. Jeg var inne her tidligere da jeg leitet etter en integrasjon, og ville bare nevne at jeg har funnet en.

 

https://github.com/jaroschek/home-assistant-myuplink

 

Det går ikke an å endre writables ennå, men om noen føler seg kyndige nok i python, kan det nok implementeres ganske raskt. 

Implementert 🙂

Endret av 7rst1
Lenke til kommentar
Del på andre sider

  • 3 måneder senere...

Takk for god instruksjon. Jeg har gjort dette litt anderledes, forslaget til @SaGe betyr at alle sensorene har status "ok" og verdien ligger i en attribute, jeg har lagt inn følgende som gir meg verdiene rett i entity:

 

rest:
  - scan_interval: 30
    method: GET
    resource: https://api.myuplink.com/v2/devices/HOIAX_[bytt_meg_ut]/points
    headers:
      Authorization: >
        Bearer {{ states.sensor.myuplink_token.attributes["access_token"] }}
    sensor:
      - name: "myUplink Stored Energy"
        unique_id: "myuplink_stored_energy"
        json_attributes_path: "$.[?(@.parameterId=='302')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','302')|map(attribute='value')|first }}"
        unit_of_measurement: "kWh"
      - name: "myUplink Total energy used"
        unique_id: "myuplink_total_energy_used"
        json_attributes_path: "$.[?(@.parameterId=='303')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','303')|map(attribute='value')|first }}"
        unit_of_measurement: "kWh"
      - name: "myUplink Estimated Power"
        unique_id: "myuplink_estimated_power"
        json_attributes_path: "$.[?(@.parameterId=='400')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','400')|map(attribute='value')|first }}"
        unit_of_measurement: "W"
      - name: "myUplink Fill Level"
        unique_id: "myuplink_fill_level"
        json_attributes_path: "$.[?(@.parameterId=='404')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','404')|map(attribute='value')|first }}"
        unit_of_measurement: "%"
      - name: "myUplink Current Program"
        unique_id: "myuplink_current_program"
        json_attributes_path: "$.[?(@.parameterId=='406')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','406')|map(attribute='strVal')|first }}"
      - name: "myUplink Element 2 Power"
        unique_id: "myuplink_element_2_power"
        json_attributes_path: "$.[?(@.parameterId=='503')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','503')|map(attribute='value')|first }}"
        unit_of_measurement: "W"
      - name: "myUplink Element 1 Power"
        unique_id: "myuplink_element_1_power"
        json_attributes_path: "$.[?(@.parameterId=='504')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','504')|map(attribute='value')|first }}"
        unit_of_measurement: "W"
      - name: "myUplink Element 2 Status"
        unique_id: "myuplink_element_2_status"
        json_attributes_path: "$.[?(@.parameterId=='505')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','505')|map(attribute='strVal')|first }}"
      - name: "myUplink Element 1 Status"
        unique_id: "myuplink_element_1_status"
        json_attributes_path: "$.[?(@.parameterId=='506')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','506')|map(attribute='strVal')|first }}"
      - name: "myUplink Time since last legionella prevention"
        unique_id: "myuplink_time_since_legionella_prevention"
        json_attributes_path: "$.[?(@.parameterId=='509')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','503')|map(attribute='value')|first }}"
        unit_of_measurement: "h"
      - name: "myUplink Next legionella prevention"
        unique_id: "myuplink_next_legionella_prevention"
        json_attributes_path: "$.[?(@.parameterId=='514')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','514')|map(attribute='value')|first }}"
        unit_of_measurement: "h"
      - name: "myUplink Selected Power"
        unique_id: "myuplink_selected_power"
        json_attributes_path: "$.[?(@.parameterId=='517')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','517')|map(attribute='strVal')|first }}"
      - name: "myUplink Setpoint"
        unique_id: "myuplink_setpoint"
        json_attributes_path: "$.[?(@.parameterId=='527')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','527')|map(attribute='value')|first }}"
        unit_of_measurement: "°C"
      - name: "myUplink Temperature"
        unique_id: "myuplink_temperature"
        json_attributes_path: "$.[?(@.parameterId=='528')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','528')|map(attribute='value')|first }}"
        unit_of_measurement: "°C"
      - name: "myUplink Nordpool Price Region"
        unique_id: "myuplink_nordpool_price_region"
        json_attributes_path: "$.[?(@.parameterId=='544')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','544')|map(attribute='strVal')|first }}"
      - name: "myUplink Current Price type"
        unique_id: "myuplink_current_price_type"
        json_attributes_path: "$.[?(@.parameterId=='549')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','549')|map(attribute='strVal')|first }}"
      - name: "myUplink Current Target Temperature"
        unique_id: "myuplink_current_target_temperature"
        json_attributes_path: "$.[?(@.parameterId=='551')]"
        value_template: "{{ value_json|selectattr('parameterId','eq','551')|map(attribute='value')|first }}"
        unit_of_measurement: "°C"

 

Fra Swagger fant jeg ut om jeg ville benytte "value" eller "StrVal", sistnevnte er vennlig navn, f.eks. på element status.

Dette er kun les fra APIet, men fungerer bra for meg.

Jeg har slengt alt i en grid

image.thumb.png.c0cfbaa13796a3113b64ca0d59bf80a8.png

  • Like 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.