Shelly 3EM via MQTT in HA einbinden!

Liebe Community,

ich möchte den Shelly 3EM von meinem Gartenhaus via MQTT in meine HA einbinden.
Es ist mir so weit gelungen das ich die Shelly Daten in meinem Mosquitto Broker via MQTT-Explorer angezeigt bekomme.
Hier ein Topic : shellies/shellyem3-485519D787C4/emeter/0/power - als Beispiel.

Was muss ich jetzt tun um den Shelly als Gerät mit seinen Entitäten in HA angezeigt zu bekomme?

Danke und Liebe Grüße

Herzlich Willkommen. Warum nimmst du nicht die shelly Intigration?

Mit der Integration ist es mir nicht gelungen da der Shelly 3EM in einem anderen entfernten Netzwerk (Gartenhaus) verbaut ist.
Oder gibts für so was auch eine Möglichkeit ?

Liebe Grüße

Achso. Ja dann macht mqtt sinn. Leider gibt es noch keine richtige Lösung für die Shelly Cloud.

Mqtt sollte dir die Entitäten selbst anlegen. Hast du unter Entwicklerwerzeuge → Zustände mal gesucht nach Shelly?

…und wie willst Du dann über MQTT zugreifen?

Hab es hinbekommen über die Cloud den Watt wert von mein Shelly Plus Plug S auszulesen der Aktuell nicht in mein Netzwerk ist. Sag mir welche werte du brauchst und ich bastel da was fertig.

Ich dachte auch das die Entitäten selbst angelegt werden da ja die Daten bereits im Moquitto Broker zu sehen sind.
In den Zuständen ist nix zu finden.
Danke für dein raschesFeedback.

Das ist ja super, brauche nur die Leistungswerte der drei Phasen.

Der Shelly 3EM bietet MQTT als zusätzliche Datenübertragung an.
Einfach deine Adresse von dem HA Broker eintragen und schon bekommst du die Daten geliefert.

Leider nicht in HA als Gerät oder Entität.

Aber wahrscheinlich hab ich was übersehen. :slightly_smiling_face:

Danke für dein Feedback

:crayon:by HarryP: Zusammenführung Mehrfachposting.

Du hast Glück das ich ein 3em habe.

Also fangen wir mal an:

Füge folgendes in der configuration.yaml ein:

rest:
  - resource: "https://shelly-X-eu.shelly.cloud/device/status?id=YYYYYYYYY&auth_key=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
    method: POST
    scan_interval: 5
    headers:
      User-Agent: Home Assistant
      Content-Type: application/x-www-form-urlencoded
    sensor:
      - name: 3em-power1
        value_template: "{{ value_json.data.device_status.emeters[0].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power
        
      - name: 3em-power2
        value_template: "{{ value_json.data.device_status.emeters[1].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power

      - name: 3em-power3
        value_template: "{{ value_json.data.device_status.emeters[2].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power

Damit das ganze geht brauchen wir den Auth Key sowie die Device ID des Gerätes und die Api URL. Dafür loggen wir uns da ein: https://home.shelly.cloud/

Dann gehen wir oben Rechts auf das Bürger Menü → Benutzereinstellungen → Cloud-Autorisierungs-Schlüssel da klicken wir auf Schlüssel anfordern. Neben Server steht unsere URL wir benötigen nur die Zahl diese tragen wir unter Resource ein anstelle des X. Der Key befindet sich über die Server url in der Box dieser gehört an der stelle wo die ZZZZZZZ stehen. Jetzt fehlt nur noch die Device ID diese findet ihr wenn ihr oben Links auf zurück geht. Und jetzt in den Raum von den Gerät und klickt auf den Gerät dann seht ihr oben in Browser neben device/ die id die gehört unter YYYYYYYY jetzt speichern wir die configuration.yaml ab und gehen unter Entwicklerwerkzeuge → und klicken da auf Alle YAML Konfigurationen. Wenn das durchgelaufen ist könnt ihr unter den Entwicklerwerkzeuge → Zustände nach 3em suchen da sollten jetzt 3 neue Entitäten vorhanden sein.

Vielen Dank für dein rasches Feedback. Bin echt beeindruck ! Werd mich mal durch deine Anleitung kämpfen. Geb dir bescheid wies gelaufen ist. nochmals Danke!

1 „Gefällt mir“

Sensoren, etc. aus MQTT werden in Home Assistant nur automatisch angelegt, wenn sie der Home Assistant Nomenklatur entsprechend konfiguriert sind und die Bauanleitung mitschicken → MQTT - Home Assistant.

@Lindtbaer
funktioniert einwandfrei, danke für dieLösung :+1:

@z-master
Danke für die Info.

:crayon:by HarryP: Zusammenführung Doppelpost.

Hallo,

ich habe oben genannte Schritte ausgeführt.
HA meckerte das keine Unique ID vergeben wurde, deshalb habe ich noch eine in der config eingefügt.

rest:
  - resource: "https://shelly-57-eu.shelly.cloud/device/status?id=xxxx&auth_key=xxxx"
    method: POST
    scan_interval: 5
    headers:
      User-Agent: Home Assistant
      Content-Type: application/x-www-form-urlencoded
    sensor:
      - name: 3em-power1
        unique_id: SteiniPower1
        value_template: "{{ value_json.data.device_status.emeters[0].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power
        
      - name: 3em-power2
        unique_id: SteiniPower2
        value_template: "{{ value_json.data.device_status.emeters[1].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power

      - name: 3em-power3
        unique_id: SteiniPower3
        value_template: "{{ value_json.data.device_status.emeters[2].power }}"
        state_class: measurement
        unit_of_measurement: W
        device_class: power

Doch leider werden keine Werte angezeigt.
Der Shelly Hyperlink funktioniert, an was könnte es noch liegen?

{"isok":true,"data":{"online":true,"device_status":{"em:0":{"id":0,"a_act_power":39.8,"a_aprt_power":91,"a_current":0.39,"a_freq":50,"a_pf":0.43,"a_voltage":233.3,"b_act_power":5.2,"b_aprt_power":41.1,"b_current":0.177,"b_freq":50,"b_pf":0.13,"b_voltage":232.4,"c_act_power":5.7,"c_aprt_power":29.3,"c_current":0.125,"c_freq":50,"c_pf":0.18,"c_voltage":234.8,"total_act_power":50.703,"total_aprt_power":161.362,"total_current":0.692,"user_calibrated_phase":[]},"emdata:0":{"id":0,"a_total_act_energy":19247.93,"a_total_act_ret_energy":0,"b_total_act_energy":3947.28,"b_total_act_ret_energy":29207.05,"c_total_act_energy":4494.93,"c_total_act_ret_energy":0,"total_act":27690.14,"total_act_ret":29207.05},"wifi":{"sta_ip":"192.168.1.107","status":"got ip","ssid":"2","rssi":-89},"code":"SPEM-003CEBEU","eth":{"ip":null},"serial":370,"cloud":{"connected":true},"ble":{},"sys":{"available_updates":{"beta":{"version":"1.4.2-beta1"}},"mac":"xxx","restart_required":false,"time":"23:20","unixtime":1723756820,"uptime":6,"ram_size":246956,"ram_free":94948,"fs_size":524288,"fs_free":180224,"cfg_rev":27,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"reset_reason":3},"bthome":{"errors":["bluetooth_disabled"]},"ts":1723757323.64,"_updated":"2024-08-15 21:28:57","mqtt":{"connected":true},"ws":{"connected":false},"modbus":{},"temperature:0":{"id":0,"tC":50.2,"tF":122.3},"id":"xxx"}}}

image

Heureka, dank ChatGPT konnte ich das Problem lösen, hiermit funktionierts

rest:          
- resource: "https://shelly-57-eu.shelly.cloud/device/status?id=xxx&auth_key=xx"
  method: GET
  scan_interval: 5
  headers:
    User-Agent: Home Assistant
    Content-Type: application/x-www-form-urlencoded
  sensor:
    - name: 3em-power1
      unique_id: SteiniPower1
      value_template: "{{ value_json.data.device_status['em:0'].a_act_power }}"
      state_class: measurement
      unit_of_measurement: W
      device_class: power
        
    - name: 3em-power2
      unique_id: SteiniPower2
      value_template: "{{ value_json.data.device_status['em:0'].b_act_power }}"
      state_class: measurement
      unit_of_measurement: W
      device_class: power
      
    - name: 3em-power3
      unique_id: SteiniPower3
      value_template: "{{ value_json.data.device_status['em:0'].c_act_power }}"
      state_class: measurement
      unit_of_measurement: W
      device_class: power

:crayon:by HarryP: Post formatiert

Was bitte hast du geädert
mfg

Guys, why are You using the cloud?
Shellies are perfect for using them local only!

Replace the resurce url host with the local ip of Your Shelly 3EM

- platform: rest
  name: grid
  json_attributes:
    - "emeters"
    - "emeter_n"
  resource: http://192.168.178.123/status
  method: GET
  scan_interval: 1
  headers:
    accept: "application/json"
  value_template: True
- platform: template
  sensors:
    grid_voltage_a:
      friendly_name: "L1 Spannung"
      device_class: voltage
      unit_of_measurement: 'V'
      value_template: '{{ state_attr("sensor.grid", "emeters")[0]["voltage"] }}'
    grid_current_a:
      friendly_name: "L1 Strom"
      device_class: current
      unit_of_measurement: 'A'
      value_template: '{{ state_attr("sensor.grid", "emeters")[0]["current"] }}'
    grid_power_a:
      friendly_name: "L1 Leistung"
      device_class: power
      unit_of_measurement: 'W'
      value_template: '{{ state_attr("sensor.grid", "emeters")[0]["power"] }}'
    grid_importenergy_a:
      friendly_name: "L1 Bezug"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[0]["total"] }}'
    grid_exportenergy_a:
      friendly_name: "L1 Einspeisung"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[0]["total_returned"] }}'
    grid_voltage_b:
      friendly_name: "L2 Spannung"
      device_class: voltage
      unit_of_measurement: 'V'
      value_template: '{{ state_attr("sensor.grid", "emeters")[1]["voltage"] }}'
    grid_current_b:
      friendly_name: "L2 Strom"
      device_class: current
      unit_of_measurement: 'A'
      value_template: '{{ state_attr("sensor.grid", "emeters")[1]["current"] }}'
    grid_power_b:
      friendly_name: "L2 Leistung"
      device_class: power
      unit_of_measurement: 'W'
      value_template: '{{ state_attr("sensor.grid", "emeters")[1]["power"] }}'
    grid_importenergy_b:
      friendly_name: "L2 Bezug"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[1]["total"] }}'
    grid_exportenergy_b:
      friendly_name: "L2 Einspeisung"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[1]["total_returned"] }}'
    grid_voltage_c:
      friendly_name: "L3 Spannung"
      device_class: voltage
      unit_of_measurement: 'V'
      value_template: '{{ state_attr("sensor.grid", "emeters")[2]["voltage"] }}'
    grid_current_c:
      friendly_name: "L3 Strom"
      device_class: current
      unit_of_measurement: 'A'
      value_template: '{{ state_attr("sensor.grid", "emeters")[2]["current"] }}'
    grid_power_c:
      friendly_name: "L3 Leistung"
      device_class: power
      unit_of_measurement: 'W'
      value_template: '{{ state_attr("sensor.grid", "emeters")[2]["power"] }}'
    grid_importenergy_c:
      friendly_name: "L3 Bezug"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[2]["total"] }}'
    grid_exportenergy_c:
      friendly_name: "L3 Einspeisung"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: '{{ state_attr("sensor.grid", "emeters")[2]["total_returned"] }}'
    grid_power:
      unit_of_measurement: 'W'
      device_class: power
      value_template: >-
        {{ states('sensor.grid_power_a')|float(default=0.0)
         + states('sensor.grid_power_b')|float(default=0.0)
         + states('sensor.grid_power_c')|float(default=0.0) }}
    grid_current:
      unit_of_measurement: 'A'
      device_class: current
      value_template: >-
        {{ states('sensor.grid_current_a')|float(default=0.0)
         + states('sensor.grid_current_b')|float(default=0.0)
         + states('sensor.grid_current_c')|float(default=0.0) }}
    grid_current_n:
      friendly_name: "N Strom"
      device_class: current
      unit_of_measurement: 'A'
      value_template: '{{ state_attr("sensor.grid", "emeter_n")["current"] }}'
    grid_current_pe:
      friendly_name: "Fehlerstrom"
      device_class: current
      unit_of_measurement: 'A'
      value_template: >-
        {{ state_attr("sensor.grid", "emeter_n")["ixsum"]
         - state_attr("sensor.grid", "emeter_n")["current"] }}
    exported_energy:
      friendly_name: "Netz Einspeisung"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: >-
        {{ states('sensor.grid_exportenergy_a')
         + states('sensor.grid_exportenergy_b')
         + states('sensor.grid_exportenergy_c') }}
    yield_energy:
      friendly_name: "Netz Bezug"
      device_class: energy
      unit_of_measurement: 'Wh'
      value_template: >-
        {{ states('sensor.grid_importenergy_a')
         + states('sensor.grid_importenergy_b')
         + states('sensor.grid_importenergy_c') }}

Storing the emeters object into sensor.grid allows for more flexibility when using it elsewhere. This makes shure Your automations don’t break if shelly decides to switch off their cloud services, change TOS or Your internet service provider seizes to function.
I mean it’s THE buying point for shelly. Works without internet access out of the box.