Mercedes Me Component

Danke sehr.

1 Like

Any idea how to fix the following error:

This error originated from a custom integration.

Logger: custom_components.mbapi2020
Source: custom_components/mbapi2020/init.py:64
integration: MercedesME 2020 (documentation, issues)
First occurred: 11:57:25 (1 occurrences)
Last logged: 11:57:25

Authentication failed. Please reauthenticate.

This error originated from a custom integration.

Logger: custom_components.mbapi2020.oauth
Source: custom_components/mbapi2020/oauth.py:312
integration: MercedesME 2020 (documentation, issues)
First occurred: 11:41:16 (1 occurrences)
Last logged: 11:41:16

Error requesting: https://id.mercedes-benz.com/as/token.oauth2 - 0 - {“error_description”:“unknown, invalid, or expired refresh token”,“error”:“invalid_grant”}

Hi @mental4vray,

whenever you are on the latest version and the reauth procedure is not working, please delete the integration from HA. Restart HA. Add the integration again. (A deletion from HACS is not needed.)

I’m still trying to fix/reproduce the reauth problems.

1 Like

Just update the componenet and HA to latest version, and all entities show as ‘unavailable’
Log grab from what may be relevant:

2024-04-11 11:47:07.781 DEBUG (MainThread) [custom_components.mbapi2020] VIN not found in masterdata. Used FIN WDD20XXXXXXXX4636 instead.
2024-04-11 11:47:07.781 DEBUG (MainThread) [custom_components.mbapi2020.coordinator] Finished fetching mbapi2020 data in 0.000 seconds (success: True)
2024-04-11 11:47:07.793 DEBUG (MainThread) [custom_components.mbapi2020.websocket] _start_websocket_handler: aafebf53878335ed06c36d7dff0f92b4
2024-04-11 11:47:07.793 DEBUG (MainThread) [custom_components.mbapi2020.oauth] Start async_get_cached_token()
2024-04-11 11:47:07.793 INFO (MainThread) [custom_components.mbapi2020.websocket] Connecting to wss://websocket.emea-prod.mobilesdk.mercedes-benz.com/v2/ws
2024-04-11 11:47:07.948 INFO (MainThread) [custom_components.mbapi2020.websocket] Connected to mercedes websocket at wss://websocket.emea-prod.mobilesdk.mercedes-benz.com/v2/ws
2024-04-11 11:47:07.953 DEBUG (MainThread) [custom_components.mbapi2020.websocket] Got notification: debugMessage
2024-04-11 11:47:07.953 DEBUG (MainThread) [custom_components.mbapi2020.client] debugMessage - Data: Registering User with ciamID: <redacted> and App-UUID: <redacted>
2024-04-11 11:47:07.954 DEBUG (MainThread) [custom_components.mbapi2020.websocket] Got notification: debugMessage
2024-04-11 11:47:07.954 DEBUG (MainThread) [custom_components.mbapi2020.client] debugMessage - Data: app twin actor was initialized
2024-04-11 11:47:07.993 DEBUG (MainThread) [custom_components.mbapi2020.websocket] Got notification: assigned_vehicles
2024-04-11 11:47:07.994 DEBUG (MainThread) [custom_components.mbapi2020.client] Start _process_assigned_vehicles
2024-04-11 11:47:07.994 INFO (MainThread) [custom_components.mbapi2020.coordinator] Car Load complete - start sensor creation
2024-04-11 11:47:08.014 DEBUG (MainThread) [custom_components.mbapi2020.websocket] Got notification: apptwin_pending_command_request
2024-04-11 11:47:08.048 DEBUG (MainThread) [custom_components.mbapi2020.websocket] Got notification: vepUpdates
2024-04-11 11:47:08.049 DEBUG (MainThread) [custom_components.mbapi2020.client] Start _process_vep_updates
2024-04-11 11:47:08.093 DEBUG (MainThread) [custom_components.mbapi2020.client] vepUpdates Sequence: 0
2024-04-11 11:47:10.760 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker
2024-04-11 11:47:10.784 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker
2024-04-11 11:47:14.031 INFO (MainThread) [homeassistant.components.remote] Setting up androidtv_remote.remote
2024-04-11 11:47:14.078 INFO (MainThread) [custom_components.mbapi2020] No Cars found.
2024-04-11 11:47:14.110 INFO (MainThread) [custom_components.mbapi2020] No Cars found.
2024-04-11 11:47:14.121 INFO (MainThread) [custom_components.mbapi2020] No Cars found.
2024-04-11 11:47:14.130 INFO (MainThread) [custom_components.mbapi2020] No Cars found.
2024-04-11 11:47:14.144 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mbapi2020.device_tracker
2024-04-11 11:47:14.145 INFO (MainThread) [custom_components.mbapi2020.device_tracker] No Cars found.
2024-04-11 11:47:14.154 INFO (MainThread) [custom_components.mbapi2020] No Cars found.

VIN and PIN are added to integration config

Adding the VIN in the config will exclude the car. Please remove the VIN from the options and reload the component.

This option should be used if you want to exclude a car.

sorry, my fault
all working now

Picture Elements card - aka MercedesMe clone

Hi,

After some tinkering (and help from Rene for the individual window opening/closing), I’m done for now with my picture elements card for a Mercedes EQS using Rene’s integration.
Clear inspiration was from the MercedesMe app, as you can readily see.

picture element

The stand-in for the card is a Mercedes EQS, which can open and close individual windows. Adjust for you car’s capabilities.

Requirements

In order to drive the picture elements, we have to define some custom sensors (basically extracting some attributes, and combining sensors).
It will make sense later on.

Images

The baseline image, as well as the individual states you can get directly from Mercedes using the steps outlined by Rene some time ago:
https://community.home-assistant.io/t/mercedes-me-component/41911/597
EDIT: Things changed on Rene’s and Mercedes’ end, use the new service call mbapi2020.download_images from version v0.14.0-beta.1 or later.

This picture set comprises of the base image of your car type, and individual “warning” (red) sub images for states that need attention: Open or unlocked doors, open windows or trunk, tyre etc. Same as the overview image in your MercedesMe app.

The windows icon are screengrabs (reduced in size) from the (iOS) MercedesMe App, with the “vent” icon desatured (to be used as the “moving” image). Again, this will make sense later one.
The filename of these are:

  • window_right_open.png
  • window_right_vent.png
  • window_right_closed.png, and
  • window_right_moving.png.

window_right_open window_right_vent window_right_closed window_right_moving

The same for the left windows (window_left_*.png)
window_left_open window_left_vent window_left_closed window_left_moving

I put all images in the www/eqs/ folder in HA.

Sensors

Please substitute your own sensor name, the XXX is just a placeholder for the name of your car. Also, put everything under the sensor: tag.

Lets start with the definition of the door. These are: Locked (no warning sub-image), Unlocked, and Open. These are all in the lock sensor.

# Codes for open/unlocked/venting of doors and sunroof (sensor.XXX_lock):
# doorlockstatus*: true: unlocked, false: locked
# doorstatus*: true: open, false: closed
# sunroofstatus: 0: closed, 1: open, 2: vent, 7: opening, 8: closing, 11: open vent, 12: closing vent
# Codes for open/venting of windows (binary_sensor.XXX_windows_closed):
# windowstatus*: 1: open, 2: closed, 4: vent, 5: moving
- platform: template
  sensors:
    eqs_door_frontleft:
      friendly_name: "Front Left Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusfrontleft') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "frontleft" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_frontright:
      friendly_name: "Front Right Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusfrontright') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "frontright" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_rearleft:
      friendly_name: "Rear Left Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusrearleft') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "rearleft" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_rearright:
      friendly_name: "Rear Right Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusrearright') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "rearright" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

Next we look into the states of the windows. These can be: Closed, Open, Vent, or Moving:

    eqs_window_frontleft:
      friendly_name: "Front Left Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "frontleft" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_frontright:
      friendly_name: "Front Right Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "frontright" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_rearleft:
      friendly_name: "Rear Left Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "rearleft" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_rearright:
      friendly_name: "Rear Right Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "rearright" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

And last, we have to integrate the sunroof, and the trunk. The image set has a warning image of an opened hood, but my EQS does not report the hood status, so thats not used. Maybe your car is different?

    eqs_sunroof:
      friendly_name: "Sunroof"
      icon_template: mdi:car-door
      value_template: >
        {% if is_state_attr('sensor.XXX_lock', 'sunroofstatus', "2") %}
          vent
        {% elif is_state_attr('sensor.XXX_lock', 'sunroofstatus', "1") %}
          open
        {% elif is_state_attr('sensor.XXX_lock', 'sunroofstatus', "0") %}
          closed
        {% else %}
          moving
        {% endif %}

    eqs_trunk:
      friendly_name: "Trunk"
      icon_template: mdi:car-door
      value_template: >
        {% if state_attr('sensor.XXX_lock', 'doorlockstatusdecklid') %}
          unlocked
        {% elif state_attr('sensor.XXX_lock', 'decklidstatus') %}
          open
        {% else %}
          closed
        {% endif %}

Now all thats missing is the tyre warning, these are straight foreward, albeit I did have to guess, as I didn’t have a tyre warning in my car yet.

    eqs_tire_image_frontleft:
      friendly_name: "Tire Warning Front Left"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerFrontLeft', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_frontright:
      friendly_name: "Tire Warning Front Right"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerFrontRight', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_rearleft:
      friendly_name: "Tire Warning Rear Left"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerRearLeft', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_rearright:
      friendly_name: "Tire Warning Rear Right"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerRearRight', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

Picture Element card

Now to the meat of the whole excercise: The Picture Element card that ties it all together.

As you can see I implemented window control on the window icons. Feel free to change those if your car does not offer them. Replace the VIN number to the one of your car in the service calls.

Also replace all the 297100 in the filenames to your filenames of the downloaded zip from earlier.

type: picture-elements
image: local/eqs/297100_car.png
transform: translate(-50%, -50%)
elements:
  - type: image
    entity: sensor.eqs_door_frontleft
    state_image:
      Open: local/eqs/297100_door_frontleft_open.png
      Unlocked: local/eqs/297100_door_frontleft_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_window_frontleft
    state_image:
      OpenDC: local/eqs/297100_window_frontleft_opendoorclosed.png
      OpenDO: local/eqs/297100_window_frontleft_opendooropened.png
      VentDC: local/eqs/297100_window_frontleft_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_frontleft_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_frontright
    state_image:
      Open: local/eqs/297100_door_frontright_open.png
      Unlocked: local/eqs/297100_door_frontright_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: none
  - type: image
    entity: sensor.eqs_window_frontright
    state_image:
      OpenDC: local/eqs/297100_window_frontright_opendoorclosed.png
      OpenDO: local/eqs/297100_window_frontright_opendooropened.png
      VentDC: local/eqs/297100_window_frontright_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_frontright_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_rearleft
    state_image:
      Open: local/eqs/297100_door_rearleft_open.png
      Unlocked: local/eqs/297100_door_rearleft_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: none
  - type: image
    entity: sensor.eqs_window_rearleft
    state_image:
      OpenDC: local/eqs/297100_window_rearleft_opendoorclosed.png
      OpenDO: local/eqs/297100_window_rearleft_opendooropened.png
      VentDC: local/eqs/297100_window_rearleft_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_rearleft_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_rearright
    state_image:
      Open: local/eqs/297100_door_rearright_open.png
      Unlocked: local/eqs/297100_door_rearright_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: none
  - type: image
    entity: sensor.eqs_window_rearright
    state_image:
      OpenDC: local/eqs/297100_window_rearright_opendoorclosed.png
      OpenDO: local/eqs/297100_window_rearright_opendooropened.png
      VentDC: local/eqs/297100_window_rearright_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_rearright_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_sunroof
    state_image:
      open: local/eqs/297100_sunroof_open.png
      vent: local/eqs/297100_sunroof_ventilate.png
      closed: null
      moving: local/eqs/297100_sunroof_open.png
    style:
      top: 0%
      left: 0%
      transform: none
  - type: image
    entity: sensor.eqs_trunk
    state_image:
      open: local/eqs/297100_trunk_open.png
      unlocked: local/eqs/297100_trunk_unlock.png
      closed: null
    style:
      top: 0%
      left: 0%
      transform: none
  - type: image
    entity: sensor.eqs_window_frontleft
    title: Front Left
    state_image:
      OpenDC: local/eqs/window_left_open.png
      OpenDO: local/eqs/window_left_open.png
      VentDC: local/eqs/window_left_vent.png
      VentDO: local/eqs/window_left_vent.png
      Closed: local/eqs/window_left_closed.png
      Moving: local/eqs/window_left_moving.png
    style:
      top: 43%
      left: 23%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '100'
  - type: image
    entity: sensor.eqs_window_frontright
    title: Front Right
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 43%
      left: 77%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '100'
  - type: image
    entity: sensor.eqs_window_rearleft
    title: Rear Left
    state_image:
      OpenDC: local/eqs/window_left_open.png
      OpenDO: local/eqs/window_left_open.png
      VentDC: local/eqs/window_left_vent.png
      VentDO: local/eqs/window_left_vent.png
      Closed: local/eqs/window_left_closed.png
      Moving: local/eqs/window_left_moving.png
    style:
      top: 61%
      left: 23%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '100'
  - type: image
    entity: sensor.eqs_window_rearright
    title: Rear Right
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 61%
      left: 77%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '100'
  - type: state-label
    entity: sensor.XXX_tire_pressure_front_left
    title: Front Left
    style:
      top: 23%
      left: 33%
      transform: translate(-100%,-50%)
  - type: image
    entity: sensor.eqs_tire_image_frontleft
    state_image:
      Warning: local/eqs/297100_tire_frontleft.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_front_right
    title: Front Right
    style:
      top: 23%
      left: 66.5%
      transform: translate(0%,-50%)
  - type: image
    entity: sensor.eqs_tire_image_frontright
    state_image:
      Warning: local/eqs/297100_tire_frontright.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_rear_left
    title: Rear Left
    style:
      top: 74%
      left: 33%
      transform: translate(-100%,-50%)
  - type: image
    entity: sensor.eqs_tire_image_rearleft
    state_image:
      Warning: local/eqs/297100_tire_rearleft.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_rear_right
    title: Rear Right
    style:
      top: 74%
      left: 66.5%
      transform: translate(0%,-50%)
  - type: image
    entity: sensor.eqs_tire_image_rearright
    state_image:
      Warning: local/eqs/297100_tire_rearright.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0)
    tap_action:
      action: none

Thats it. It may have a few bugs and inconsistentcies, nothing severe that I have noticed.

Huge Thanks to Rene for providing the windows_move service call on my request.

Thanks,

Thomas

PS
I have also a sideview version, I can elaborate if there is interest.
EDIT: See below for the sideways version.
grafik

PPS

Here is the whole sensor: thing in one big chunk:

# Codes for open/unlocked/venting of doors and sunroof (sensor.XXX_lock):
# doorlockstatus*: true: unlocked, false: locked
# doorstatus*: true: open, false: closed
# sunroofstatus: 0: closed, 1: open, 2: vent, 7: opening, 8: closing, 11: open vent, 12: closing vent
# Codes for open/venting of windows (binary_sensor.XXX_windows_closed):
# windowstatus*: 1: open, 2: closed, 4: vent, 5: moving
- platform: template
  sensors:
    eqs_door_frontleft:
      friendly_name: "Front Left Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusfrontleft') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "frontleft" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_frontright:
      friendly_name: "Front Right Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusfrontright') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "frontright" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_rearleft:
      friendly_name: "Rear Left Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusrearleft') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "rearleft" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_door_rearright:
      friendly_name: "Rear Right Door"
      icon_template: >
        {% if not state_attr('sensor.XXX_lock', 'doorlockstatusrearright') %} {# door locked #}
          mdi:car-door-lock
        {% else %} {# door unlocked #}
          mdi:car-door-lock-open
        {% endif %}
      value_template: >
        {% set door = "rearright" %}
        {% if not state_attr('sensor.XXX_lock', 'doorstatus'+door) %} {# door closed #}
          {% if not state_attr('sensor.XXX_lock', 'doorlockstatus'+door) %} {# door locked #}
            Locked
          {% else %} {# door unlocked #}
            Unlocked
          {% endif %}
        {% else %} {# door open #}
          Open
        {% endif %}

    eqs_window_frontleft:
      friendly_name: "Front Left Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "frontleft" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_frontright:
      friendly_name: "Front Right Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "frontright" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_rearleft:
      friendly_name: "Rear Left Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "rearleft" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_window_rearright:
      friendly_name: "Rear Right Window"
      icon_template: mdi:car-door
      value_template: >
        {% set window = "rearright" %}
        {% if is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "2") %} {# window closed #}
          Closed
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "4") %} {# window vent #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            VentDC
          {% else %} {# door open #}
            VentDO
          {% endif %}
        {% elif is_state_attr('binary_sensor.XXX_windows_closed', 'windowstatus'+window, "1") %} {# window open #}
          {% if not state_attr('sensor.XXX_lock', 'doorstatus'+window) %} {# door closed #}
            OpenDC
          {% else %} {# door open #}
            OpenDO
          {% endif %}
        {% else %} {# window moving #}
          Moving
        {% endif %}

    eqs_sunroof:
      friendly_name: "Sunroof"
      icon_template: mdi:car-door
      value_template: >
        {% if is_state_attr('sensor.XXX_lock', 'sunroofstatus', "2") %}
          vent
        {% elif is_state_attr('sensor.XXX_lock', 'sunroofstatus', "1") %}
          open
        {% elif is_state_attr('sensor.XXX_lock', 'sunroofstatus', "0") %}
          closed
        {% else %}
          moving
        {% endif %}

    eqs_trunk:
      friendly_name: "Trunk"
      icon_template: mdi:car-door
      value_template: >
        {% if state_attr('sensor.XXX_lock', 'doorlockstatusdecklid') %}
          unlocked
        {% elif state_attr('sensor.XXX_lock', 'decklidstatus') %}
          open
        {% else %}
          closed
        {% endif %}

    eqs_tire_image_frontleft:
      friendly_name: "Tire Warning Front Left"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerFrontLeft', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_frontright:
      friendly_name: "Tire Warning Front Right"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerFrontRight', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_rearleft:
      friendly_name: "Tire Warning Rear Left"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerRearLeft', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}

    eqs_tire_image_rearright:
      friendly_name: "Tire Warning Rear Right"
      icon_template: mdi:car-tire-alert
      value_template: >
        {% if is_state_attr('binary_sensor.XXX_tire_warning', 'tireMarkerRearRight', "0") %}
          OK
        {% else %}
          Warning
        {% endif %}
10 Likes

Could someone with a Mercedes EQE perhaps run the command Rene shared here Mercedes Me Component - #597 by ReneNulschDE and share the files please?
I’d need to SSH into HA but the SSH addon refuses to work so I can’t run the command in the correct spot…
You would receive my eternal gratitude :slight_smile:

It seems like the access token is no longer stored in the HA config root folder.
I dimly remember a changelog about that…
Maybe @ReneNulschDE can weight in on that?

Also, you need the file, not a shell to HA. You can get files off HA either via Studio Code Server, or Samba share.

I did read that HA and ssh had changes over the year, what is currently working in my installation is the “Terminal & SSH” Add-On from the official add-on store. I do run HAOS in a VM.

1 Like

MB and I made a lot of changes since this posting and I assume its easier to have a service to download the images. I’m currently implementing this and will publish a beta later today.

In the beta you will see a new service mbapi2020.download_images. It will require the VIN. After starting the service a zip-file will be available locally.

2 Likes

Supporting the great post from @Thomas01, I have published a new beta version “v0.14.0-beta.1 - AdBlue Sensor, Images download”:

New:

  • New service “download_images”. This service will download a zip-file from the MB-servers with images (of your car of course) (to custom_components/mbapi2020/resources/vin.zip) that Thomas used in his post
  • New sensor “tankleveladblue”. Shows the level of the AdBlue tank in %.

Fixes:

  • Next try on the ReAuth issue. (I can’t reproduce it and changed the logic a little bit)
3 Likes

Thanks, updated my post above.

I am interested in the sideview car, it fits better.

Picture Element card - Sideways orientation

In my previous post, I described how to use picture elements to generate a view similar to the MercedesMe app (in an “upright” view), with the help of the images provided by Mercedes Benz.
Now to continue with a rotated, “sideview” version:
sideways view

Let’s start with the

Requirements

The set-up of the sensors is the same as with the upright version, so start there.

The difference starts with the supplied images. The CSS of the picture elements card take care of rotating the images, except for the background image (XXXXXX_car.png), which needs to be rotated using your favourite image manipulation programme (GIMP comes to mind). I called the rotated image XXX_car_rotate.png in my case.

Also, only the window_right_*.png images are used for the states of the windows.

Picture Elements card

Just as before (replace all the 297100 in the filenames to your filenames of the downloaded zip from earlier, and XXX with your car name), except that now a rotate command is added (and some coordinates change).

type: picture-elements
image: local/eqs/297100_car_rotate.png
elements:
  - type: image
    entity: sensor.eqs_door_frontleft
    state_image:
      Open: local/eqs/297100_door_frontleft_open.png
      Unlocked: local/eqs/297100_door_frontleft_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_window_frontleft
    state_image:
      OpenDC: local/eqs/297100_window_frontleft_opendoorclosed.png
      OpenDO: local/eqs/297100_window_frontleft_opendooropened.png
      VentDC: local/eqs/297100_window_frontleft_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_frontleft_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_frontright
    state_image:
      Open: local/eqs/297100_door_frontright_open.png
      Unlocked: local/eqs/297100_door_frontright_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
  - type: image
    entity: sensor.eqs_window_frontright
    state_image:
      OpenDC: local/eqs/297100_window_frontright_opendoorclosed.png
      OpenDO: local/eqs/297100_window_frontright_opendooropened.png
      VentDC: local/eqs/297100_window_frontright_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_frontright_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_rearleft
    state_image:
      Open: local/eqs/297100_door_rearleft_open.png
      Unlocked: local/eqs/297100_door_rearleft_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
  - type: image
    entity: sensor.eqs_window_rearleft
    state_image:
      OpenDC: local/eqs/297100_window_rearleft_opendoorclosed.png
      OpenDO: local/eqs/297100_window_rearleft_opendooropened.png
      VentDC: local/eqs/297100_window_rearleft_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_rearleft_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_door_rearright
    state_image:
      Open: local/eqs/297100_door_rearright_open.png
      Unlocked: local/eqs/297100_door_rearright_unlock.png
      Locked: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
  - type: image
    entity: sensor.eqs_window_rearright
    state_image:
      OpenDC: local/eqs/297100_window_rearright_opendoorclosed.png
      OpenDO: local/eqs/297100_window_rearright_opendooropened.png
      VentDC: local/eqs/297100_window_rearright_ventilatedoorclosed.png
      VentDO: local/eqs/297100_window_rearright_ventilatedooropened.png
      Closed: null
      Moving: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: image
    entity: sensor.eqs_sunroof
    state_image:
      open: local/eqs/297100_sunroof_open.png
      vent: local/eqs/297100_sunroof_ventilate.png
      closed: null
      moving: local/eqs/297100_sunroof_open.png
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
  - type: image
    entity: sensor.eqs_trunk
    state_image:
      open: local/eqs/297100_trunk_open.png
      unlocked: local/eqs/297100_trunk_unlock.png
      closed: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
  - type: image
    entity: sensor.eqs_window_frontleft
    title: Front Left
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 24%
      left: 56%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_left: '100'
  - type: image
    entity: sensor.eqs_window_frontright
    title: Front Right
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 76%
      left: 56%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        front_right: '100'
  - type: image
    entity: sensor.eqs_window_rearleft
    title: Rear Left
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 24%
      left: 39%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_left: '100'
  - type: image
    entity: sensor.eqs_window_rearright
    title: Rear Right
    state_image:
      OpenDC: local/eqs/window_right_open.png
      OpenDO: local/eqs/window_right_open.png
      VentDC: local/eqs/window_right_vent.png
      VentDO: local/eqs/window_right_vent.png
      Closed: local/eqs/window_right_closed.png
      Moving: local/eqs/window_right_moving.png
    style:
      top: 76%
      left: 39%
      transform: translate(-50%,-50%)
    tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '0'
    hold_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '10'
    double_tap_action:
      action: call-service
      service: mbapi2020.windows_move
      data:
        vin: W1KXXXXXXXXXXXXXX
        rear_right: '100'
  - type: state-label
    entity: sensor.XXX_tire_pressure_front_left
    title: Front Left
    style:
      top: 34%
      left: 77%
      transform: translate(-50%,-100%)
  - type: image
    entity: sensor.eqs_tire_image_frontleft
    state_image:
      Warning: local/eqs/297100_tire_frontleft.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_front_right
    title: Front Right
    style:
      top: 66%
      left: 77%
      transform: translate(-50%,0%)
  - type: image
    entity: sensor.eqs_tire_image_frontright
    state_image:
      Warning: local/eqs/297100_tire_frontright.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_rear_left
    title: Rear Left
    style:
      top: 34%
      left: 26%
      transform: translate(-50%,-100%)
  - type: image
    entity: sensor.eqs_tire_image_rearleft
    state_image:
      Warning: local/eqs/297100_tire_rearleft.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
  - type: state-label
    entity: sensor.XXX_tire_pressure_rear_right
    title: Rear Right
    style:
      top: 66%
      left: 26%
      transform: translate(-50%,0%)
  - type: image
    entity: sensor.eqs_tire_image_rearright
    state_image:
      Warning: local/eqs/297100_tire_rearright.png
      OK: null
    title: null
    style:
      top: 0%
      left: 0%
      transform: translate(0, 0) rotate(0.25turn)
    tap_action:
      action: none
4 Likes

Thanks @ReneNulschDE and @Thomas01 for the excellent work, ran the beta, got the images, followed Thomas’ tutorial and it all seems to be up and running (haven’t fiddled with the status of doors and windows yet, will do so another day).

1 Like

Pics!

Would love to see other peoples implementation of status/control cards. Especially if they are image based.


Here you go!
there’s another card with efficiency, range etc but that contains my license plate so I’ve kept that out.

1 Like

Nice.
What are the wiggly lines on the hood?
And the Eco Scores look a bit like the Apple fitnes rings. How did you do the rings?

Thanks!

The wiggly lines are the preconditioning of the car - rather important when my better half wants to use the car during colder days :slight_smile:
The ring graph is made with the custom apexcharts card.

I might try and play around to change the colour of the car to the actual colour of mine (black) and also redistribute the icons to make it look more ‘balanced’…

Hi All and first a big thank you to @ReneNulschDE and @Thomas01 for their combined effort! I just installed the newest beta version v0.14.0-beta.1 and tried downloading the images. Unfortunately I got this error: Given VIN/FIN is not managed by any coordinator or excluded in the integration options.

What am I doing wrong?

1 Like