diff --git a/_config.yml b/_config.yml
index 7bba34a0523..85a9abfc72a 100644
--- a/_config.yml
+++ b/_config.yml
@@ -107,8 +107,8 @@ social:
# Home Assistant release details
current_major_version: 2022
current_minor_version: 03
-current_patch_version: 6
-date_released: 2022-03-21
+current_patch_version: 7
+date_released: 2022-03-23
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
diff --git a/source/_dashboards/energy.markdown b/source/_dashboards/energy.markdown
index 0b4dc4ac0b6..c91d1ab98ee 100644
--- a/source/_dashboards/energy.markdown
+++ b/source/_dashboards/energy.markdown
@@ -108,7 +108,7 @@ type: energy-sources-table
Screenshot of the Grid neutrality gauge card.
-The grid neutrality gauge card represents your energy dependency. If it's green, it means you produced more energy than that you consumed from the grid. If it's in the red, it means that you relied on the grid for part of your home's energy consumption.
+The grid neutrality gauge card represents your energy dependency. If the needle is in the purple, you returned more energy to the grid than you consumed from it. If it's in the blue, you consumed more energy from the grid than you returned.
#### Example
```yaml
diff --git a/source/_dashboards/markdown.markdown b/source/_dashboards/markdown.markdown
index 87996efb88f..42fe092b7b2 100644
--- a/source/_dashboards/markdown.markdown
+++ b/source/_dashboards/markdown.markdown
@@ -112,7 +112,7 @@ For example:
```yaml
type: markdown
content: |
-
+
```
{% endraw %}
diff --git a/source/_dashboards/picture-elements.markdown b/source/_dashboards/picture-elements.markdown
index ffbc2c2a9de..d5fbc52029d 100644
--- a/source/_dashboards/picture-elements.markdown
+++ b/source/_dashboards/picture-elements.markdown
@@ -353,7 +353,7 @@ state_image:
type: map
filter:
required: false
- description: Default CSS filter.
+ description: "Default: `grayscale(100%)` when entity state is `off`. Set to `none` to remove this."
type: string
state_filter:
required: false
diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown
index 941404c43e9..7d72fd79f3f 100644
--- a/source/_docs/configuration/templating.markdown
+++ b/source/_docs/configuration/templating.markdown
@@ -372,6 +372,14 @@ Examples using `iif`:
{{ (states('light.kitchen') == 'on') | iif('Yes', 'No') }}
```
+
+
+The immediate if filter does not short-circuit like you might expect with a typical conditional statement. The `if_true`, `if_false` and `if_none` expressions will all be evaluated and the filter will simply return one of the resulting values. This means you cannot use this filter to prevent executing an expression which would result in an error.
+
+For example, if you wanted to select a field from `trigger` in an automation based on the platform you might go to make this template: `trigger.platform == 'event' | iif(trigger.event.data.message, trigger.to_state.state)`. This won't work because both expressions will be evaluated and one will fail since the field doesn't exist. Instead you have to do this `trigger.event.data.message if trigger.platform == 'event' else trigger.to_state.state`. This form of the expression short-circuits so if the platform is `event` the expression `trigger.to_state.state` will never be evaluated and won't cause an error.
+
+
+
{% endraw %}
diff --git a/source/_docs/energy/individual-devices.markdown b/source/_docs/energy/individual-devices.markdown
index b522c45725b..64cd33147ed 100644
--- a/source/_docs/energy/individual-devices.markdown
+++ b/source/_docs/energy/individual-devices.markdown
@@ -24,6 +24,10 @@ We recommend the Shelly brand because they have a local API that updates Home As
- [Shelly 2.5](https://shop.shelly.cloud/shelly-2.5-ce-ul-wifi-smart-home-automation?tracking=A7FsiPIfUWsFpnfKHa8SRyUYLXjr2hPq)
{% endcomment %}
+## Devices with power (W) sensors
+
+Some smart devices, such as air conditioning, boilers, and others, may provide a power sensor, measured in Watts. You can use the [Integration (Riemann sum integral) integration](/integrations/integration/#energy) to calculate the energy your device is using. You can then use the energy sensor in the Energy Dashboard, as individual devices.
+
_Disclaimer: Some links on this page are affiliate links._
diff --git a/source/_includes/asides/about.html b/source/_includes/asides/about.html
index 20cf4582788..a2b651e2043 100644
--- a/source/_includes/asides/about.html
+++ b/source/_includes/asides/about.html
@@ -6,15 +6,18 @@
Get started with Home Assistant
Try the online demo
+ Join our newsletter
-
+
+ {% endcomment %}
diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md
index 4ba6a9a7718..29f99f84598 100644
--- a/source/_includes/common-tasks/update.md
+++ b/source/_includes/common-tasks/update.md
@@ -3,7 +3,7 @@
Best practice for updating a Home Assistant installation:
1. Backup your installation{% if page.installation == "os" or page.installation == "supervised" %}, using the backup functionality Home Assistant offers{% endif %}.
-1. Check the release notes for breaking changes on [Home Assistant release notes](https://github.com/home-assistant/home-assistant/releases). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Breaking Changes**.
+1. Check the release notes for breaking changes on [Home Assistant release notes](/blog/categories/core/). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Breaking Changes**.
{% if page.installation == "os" or page.installation == "supervised" %}
1. Check your configuration using the [Check Home Assistant configuration](/addons/check_config/) add-on.
1. If the check passes, you can safely update. If not, update your configuration accordingly.
diff --git a/source/_includes/installation/core.md b/source/_includes/installation/core.md
index 79641db662a..7f4d26c4a94 100644
--- a/source/_includes/installation/core.md
+++ b/source/_includes/installation/core.md
@@ -71,7 +71,7 @@ Next up is to create and change to a virtual environment for Home Assistant Core
```bash
sudo -u homeassistant -H -s
cd /srv/homeassistant
-python{{site.installation.versions.python}} -m venv .
+python3 -m venv .
source bin/activate
```
diff --git a/source/_integrations/binary_sensor.markdown b/source/_integrations/binary_sensor.markdown
index 722be9876af..0b1dcc5bf4d 100644
--- a/source/_integrations/binary_sensor.markdown
+++ b/source/_integrations/binary_sensor.markdown
@@ -58,7 +58,7 @@ The full list of supported binary sensor device classes is below
- **moisture**: `on` means moisture detected (wet), `off` means no moisture (dry)
- **motion**: `on` means motion detected, `off` means no motion (clear)
- **moving**: `on` means moving, `off` means not moving (stopped)
-- **occupancy**: `on` means occupied, `off` means not occupied (clear)
+- **occupancy**: `on` means occupied (detected), `off` means not occupied (clear)
- **opening**: `on` means open, `off` means closed
- **plug**: `on` means device is plugged in, `off` means device is unplugged
- **power**: `on` means power detected, `off` means no power
diff --git a/source/_integrations/denonavr.markdown b/source/_integrations/denonavr.markdown
index d5216256900..71df8426065 100644
--- a/source/_integrations/denonavr.markdown
+++ b/source/_integrations/denonavr.markdown
@@ -121,7 +121,7 @@ A few notes:
Denon AVR receivers support a simple text-based network interface for sending commands to the receiver over the network. You can access this interface via the `denonavr.get_command` service. In addition, IR remote codes can also be sent to this interface.
-A list of network commands supported by the various Denon AVR receivers can be [found here](https://www.heimkinoraum.de/upload/files/product/IP_Protocol_AVR-Xx100.pdf). A list of IR codes can be [found here](https://www.heimkinoraum.de/upload/files/product/IP_Protocol_AVR-Xx100.pdf).
+A list of network commands supported by the various Denon AVR receivers can be [found here](https://www.heimkinoraum.de/upload/files/product/IP_Protocol_AVR-Xx100.pdf). A list of IR codes can be [found here](https://assets.denon.com/DocumentMaster/UK/AVR3313_IR_CODE_V01.pdf).
To use these commands, call the `denonavr.get_command` service and append the specific command to the path `/goform/formiPhoneAppDirect.xml?`:
diff --git a/source/_integrations/hikvision.markdown b/source/_integrations/hikvision.markdown
index 76c1376a723..80463513912 100644
--- a/source/_integrations/hikvision.markdown
+++ b/source/_integrations/hikvision.markdown
@@ -53,16 +53,17 @@ binary_sensor.home_line_crossing_2
This platform should work with all Hikvision cameras and nvrs,
and has been confirmed to work with the following models:
-- DS-2CD3132-I
-- DS-2CD2232-I5
- DS-2CD2032-I
- DS-2CD2042WD-I
- DS-2CD2142FWD-I
- DS-2CD2155FWD-IS
+- DS-2CD2232-I5
- DS-2CD2385G1
-- IPC-D140H(-M)
+- DS-2CD2387G2-LU
+- DS-2CD3132-I
- DS-7616NI-K2 (NVR)
- ERI-K104-PR (NVR)
+- IPC-D140H(-M)
This platform also was confirmed to work with the following Hikvison-based NVRS
diff --git a/source/_integrations/jewish_calendar.markdown b/source/_integrations/jewish_calendar.markdown
index 65e9da039b6..727706ea26a 100644
--- a/source/_integrations/jewish_calendar.markdown
+++ b/source/_integrations/jewish_calendar.markdown
@@ -91,7 +91,7 @@ Time sensor states are represented as ISO8601 formatted *UTC time*.
### Binary sensors
-- `issur_melacha_in_effect`: A boolean sensor indicating if melacha is currently not permitted. The value is true when it is currently Shabbat or Yom Tov and false otherwise.
+- `issur_melacha_in_effect`: A boolean sensor indicating if melacha is currently not permitted. The value is _on_ when it is currently Shabbat or Yom Tov and _off_ otherwise.
### Holiday sensor
diff --git a/source/_integrations/limitlessled.markdown b/source/_integrations/limitlessled.markdown
index 0b4813f97e1..9da6cd1729f 100644
--- a/source/_integrations/limitlessled.markdown
+++ b/source/_integrations/limitlessled.markdown
@@ -27,29 +27,29 @@ To add `limitlessled` to your installation, add the following to your `configura
```yaml
# Example configuration.yaml entry
light:
- platform: limitlessled
- bridges:
- - host: 192.168.1.10
- groups:
- - number: 1
- name: Bedroom
- - number: 2
- type: rgbw
- name: Bathroom
- - number: 3
- type: rgbw
- name: Kitchen
- fade: true
- - number: 4
- type: dimmer
- name: Livingroom
- - host: 192.168.1.11
- groups:
- - number: 1
- name: Living Room & Hall
- - number: 1
- type: bridge-led
- name: Bridge Light
+ - platform: limitlessled
+ bridges:
+ - host: 192.168.1.10
+ groups:
+ - number: 1
+ name: Bedroom
+ - number: 2
+ type: rgbw
+ name: Bathroom
+ - number: 3
+ type: rgbw
+ name: Kitchen
+ fade: true
+ - number: 4
+ type: dimmer
+ name: Livingroom
+ - host: 192.168.1.11
+ groups:
+ - number: 1
+ name: Living Room & Hall
+ - number: 1
+ type: bridge-led
+ name: Bridge Light
```
{% configuration %}
diff --git a/source/_integrations/litterrobot.markdown b/source/_integrations/litterrobot.markdown
index 06244b93a70..60a7308a4ae 100644
--- a/source/_integrations/litterrobot.markdown
+++ b/source/_integrations/litterrobot.markdown
@@ -80,6 +80,6 @@ target:
entity_id: vacuum.litter_robot_litter_box
data:
enabled: true
- start_time: '23:30:00'
+ start_time: "22:30:00"
```
diff --git a/source/_integrations/lock.xiaomi_aqara.markdown b/source/_integrations/lock.xiaomi_aqara.markdown
index 07ed1573f5d..eaa1c9b847c 100644
--- a/source/_integrations/lock.xiaomi_aqara.markdown
+++ b/source/_integrations/lock.xiaomi_aqara.markdown
@@ -10,10 +10,13 @@ ha_domain: xiaomi_aqara
The `xiaomi aqara` lock platform allows you to get data (`changed_by` property, `verified_wrong_times` attribute) from your [Xiaomi](https://www.mi.com/en/) Aqara locks.
-A Aqara lock cannot be controlled by Home Assistant. The property `changed_by` provides the user/key ID of the last successful unlock.
+
+An Aqara lock cannot be controlled by Home Assistant.
+
+The property `changed_by` provides the user/key ID of the last successful unlock.
If someone tries to unlock the device but fails more than 3 times the `verified_wrong_times` attribute will be incremented. The counter resets on a successful unlock.
-The requirement to use this platform is that you have set up the [Xiaomi Aqara](/integrations/xiaomi_aqara/) component.
+Use of this platform requires that you have set up the [Xiaomi Aqara](/integrations/xiaomi_aqara/) component.
diff --git a/source/_integrations/nest.markdown b/source/_integrations/nest.markdown
index 9603d92e501..95def7a6362 100644
--- a/source/_integrations/nest.markdown
+++ b/source/_integrations/nest.markdown
@@ -525,11 +525,11 @@ logger:
- It is recommended to let Home Assistant create the Pub/Sub subscription for you. However, if you would like more control you can enter a `susbcriber_id` in the configuration. See [Subscribe to Events](https://developers.google.com/nest/device-access/subscribe-to-events) for more instructions on how to manually create a subscription and use the full subscription name in the Home Assistant configuration e.g. `projects/gcp-project-name/subscriptions/subscription-id`
-# Works With Nest API (Deprecated)
+# Works With Nest API
-The [Works with Nest](https://developers.nest.com/) API is deprecated and will be removed in Home Assistant Core 2022.5.
+The Legacy [Works with Nest](https://developers.nest.com/) API is not accepting new signups.
diff --git a/source/_integrations/person.markdown b/source/_integrations/person.markdown
index f9dd56cec0e..53fa644e747 100644
--- a/source/_integrations/person.markdown
+++ b/source/_integrations/person.markdown
@@ -29,7 +29,7 @@ In short, when you're at home, your position is determined first by stationary t
**Hint**: When you use multiple device trackers together, especially stationary and GPS trackers, it's advisable to set `consider_home` for stationary trackers as low as possible see [device_tracker](/integrations/device_tracker/#configuring-a-device_tracker-platform)).
-You can manage persons via the UI from the person page inside the configuration panel or via `YAML` in your `configuration.yaml` file.
+You can manage persons {% my people title="via the UI from the person page inside the configuration panel" %} or via `YAML` in your `configuration.yaml` file.
## Configuring the `person` integration via the Home Assistant configuration panel
diff --git a/source/_integrations/prometheus.markdown b/source/_integrations/prometheus.markdown
index b75a7403fcb..a587b31d609 100644
--- a/source/_integrations/prometheus.markdown
+++ b/source/_integrations/prometheus.markdown
@@ -173,6 +173,8 @@ You can then configure Prometheus to fetch metrics from Home Assistant by adding
- targets: ['HOSTNAME:8123']
```
+Replace `your.longlived.token` with a Home Assistant [generated token](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token).
+
The format to configure the bearer token has changed in Prometheus 2.26, so if you have a newer version, you can use this configuration sample:
```yaml
diff --git a/source/_integrations/rflink.markdown b/source/_integrations/rflink.markdown
index 5f3127ac17e..4a3d1d45533 100644
--- a/source/_integrations/rflink.markdown
+++ b/source/_integrations/rflink.markdown
@@ -154,6 +154,26 @@ rflink:
This configuration will ignore the button `1` of the `newkaku` device with ID `000001`, all devices of the `digitech` protocol and all switches of the `kaku` protocol device with codewheel ID `1`.
+### Invert cover
+
+Devices can be configure to work in inverted mode by adding option in `configuration.yaml`:
+
+```yaml
+# Example configuration.yaml entry for inverted RTS cover
+cover:
+ - platform: rflink
+ devices:
+ # Rfloader created remote control which is used by Home Assistant
+ RTS_0a0a0a_1:
+ name: "Blind office"
+ aliases:
+ - rts_0f1f2f_01 # ID of the remote control (Somfy smove in this case)
+ type: inverted
+ ```
+
+This configuration uses `0a0a0a` to control the inverted shutter (send UP to close and Down to open) and listen commands sent by `0f1f2f` remote control.
+
+
### Device support
Even though a lot of devices are supported by RFLink, not all have been tested/implemented. If you have a device supported by RFLink but not by this integration please consider testing and adding support yourself.
diff --git a/source/_integrations/shopping_list.markdown b/source/_integrations/shopping_list.markdown
index ba8f35524ef..220f733069b 100644
--- a/source/_integrations/shopping_list.markdown
+++ b/source/_integrations/shopping_list.markdown
@@ -58,18 +58,18 @@ Clear completed items from the shopping list.
## Using in Automations
-The simplest way use shopping list with automations (e.g., when entering a zone with shops) is to create a notification that can be clicked to open the shopping list.
-This is tested to work with the Android companion app.
+The simplest way to use the shopping list with automations (e.g., when entering a zone with shops) is to create a notification that can be clicked to open the shopping list.
{% raw %}
```yaml
-service: notify.notify
-title: "Time to shop?"
-message: 'Click to open the shopping list'
-data:
- clickAction: "/shopping-list"
- url: "/shopping-list"
+- service: notify.notify
+ data:
+ title: "Time to shop?"
+ message: "Click to open the shopping list"
+ data:
+ clickAction: "/shopping-list"
+ url: "/shopping-list"
```
{% endraw %}
diff --git a/source/_integrations/zwave_me.markdown b/source/_integrations/zwave_me.markdown
index 49c33e61783..965488e8c38 100644
--- a/source/_integrations/zwave_me.markdown
+++ b/source/_integrations/zwave_me.markdown
@@ -38,11 +38,55 @@ This integration allows you to control a Z-Wave network via the [Z-Wave.Me Z-Way
{% include integrations/config_flow.md %}
-Note: You can use Z-Wave.Me UI with its enhanced diagnostics tools together with the Home Assistant UI.
+{% configuration_basic %}
+
+URL:
+ description: The IP address with the port of the Z-Way server. The IP address can be prefixed with wss:// if HTTPS should be used instead of HTTP (when using find.z-wave.me remote access service or public IP with SSL).
+ required: true
+ type: string
+API Token:
+ description: Z-Way API access token of the Z-Way server. To get the token go to the Z-Way user interface Smart Home UI > Menu > Settings > Users > Administrator > API token.
+ required: true
+ type: string
+
+{% endconfiguration_basic %}
+
+When connecting via find.z-wave.me remote access service you need to use a token with a global scope (log-in to Z-Way via [find.z-wave.me](https://find.z-wave.me) for this).
+
+Example of connecting to Z-Way in the local network:
+ - URL: 192.168.1.39:8083
+ - API Token: /112f7a4a-0051-cc2b-3b61-1898181b9950
+
+Example of connecting to Z-Way via remote access find.z-wave.me:
+ - URL: wss://find.z-wave.me
+ - API Token: 0481effe8a5c6f757b455babb678dc0e764feae279/112f7a4a-0051-cc2b-3b61-1898181b9950
+
+ Example of connecting to Z-Way with a static public IP address:
+ - URL: wss://87.250.250.242:8083
+ - API Token: /112f7a4a-0051-cc2b-3b61-1898181b9950
+
+
+
+
+ To grant access only to certain devices, create a new user and select the necessary devices from the list. Then use the API token of that user. It is suggested **not to use the API token of the admin**.
+
+
+
+
+
+
+ You can use Z-Wave.Me UI with its enhanced Z-Wave network diagnostics tools together with the Home Assistant UI.
+
+
## Hardware requirements
-Z-Wave.Me Z-Way requires Z-Wave.Me RaZberry, RaZberry7, UZB1, Hub1 or any other Z-Wave.Me based controller.
+Z-Wave.Me Z-Way requires Z-Wave.Me hardware:
+ - [RaZberry 7](https://z-wave.me/products/razberry/) and [RaZberry 7 Pro](https://z-wave.me/products/razberry/)
+ - [RaZberry](https://z-wave.me/products/razberry-old/)
+ - [UZB1](https://z-wave.me/products/uzb/ )
+ - [Hub1](https://z-wave.me/products/hub/)
+ - or any other Z-Wave.Me based controller.
## Installing Z-Way
diff --git a/source/_posts/2022-03-02-release-20223.markdown b/source/_posts/2022-03-02-release-20223.markdown
index 09160e7c05e..f96bd305fe4 100644
--- a/source/_posts/2022-03-02-release-20223.markdown
+++ b/source/_posts/2022-03-02-release-20223.markdown
@@ -54,6 +54,7 @@ Enjoy the release!
- [Release 2022.3.4 - March 11](#release-202234---march-11)
- [Release 2022.3.5 - March 15](#release-202235---march-15)
- [Release 2022.3.6 - March 21](#release-202236---march-21)
+- [Release 2022.3.7 - March 23](#release-202237---march-23)
- [Need help? Join the community!](#need-help-join-the-community)
- [Breaking Changes](#breaking-changes)
- [Updates for custom integration developers](#updates-for-custom-integration-developers)
@@ -601,6 +602,41 @@ The following integrations are now available via the Home Assistant UI:
[tplink docs]: /integrations/tplink/
[velbus docs]: /integrations/velbus/
+## Release 2022.3.7 - March 23
+
+- Fix targeting all or none entities in service calls ([@emontnemery] - [#68513])
+- Add support for general API exception in Sense integration ([@kbickar] - [#68517]) ([sense docs]) ([emulated_kasa docs])
+- Add cooldown timer before Sonos resubscriptions ([@jjlawren] - [#68521]) ([sonos docs])
+- Hue handle HTTP errors ([@balloob] - [#68396]) ([hue docs])
+- Simplify Hue error handling a bit ([@marcelveldt] - [#68529]) ([hue docs])
+- Filter IPv6 addresses from AppleTV zeroconf discovery ([@bdraco] - [#68530]) ([apple_tv docs])
+- Bump aiohue to 4.4.0 ([@marcelveldt] - [#68556]) ([hue docs])
+- Bump aiohue to version 4.4.1 ([@marcelveldt] - [#68579]) ([hue docs])
+- Bump py-synologydsm-api to 1.0.7 ([@mib1185] - [#68584]) ([synology_dsm docs])
+
+[#68396]: https://github.com/home-assistant/core/pull/68396
+[#68513]: https://github.com/home-assistant/core/pull/68513
+[#68517]: https://github.com/home-assistant/core/pull/68517
+[#68521]: https://github.com/home-assistant/core/pull/68521
+[#68529]: https://github.com/home-assistant/core/pull/68529
+[#68530]: https://github.com/home-assistant/core/pull/68530
+[#68556]: https://github.com/home-assistant/core/pull/68556
+[#68579]: https://github.com/home-assistant/core/pull/68579
+[#68584]: https://github.com/home-assistant/core/pull/68584
+[@balloob]: https://github.com/balloob
+[@bdraco]: https://github.com/bdraco
+[@emontnemery]: https://github.com/emontnemery
+[@jjlawren]: https://github.com/jjlawren
+[@kbickar]: https://github.com/kbickar
+[@marcelveldt]: https://github.com/marcelveldt
+[@mib1185]: https://github.com/mib1185
+[apple_tv docs]: /integrations/apple_tv/
+[emulated_kasa docs]: /integrations/emulated_kasa/
+[hue docs]: /integrations/hue/
+[sense docs]: /integrations/sense/
+[sonos docs]: /integrations/sonos/
+[synology_dsm docs]: /integrations/synology_dsm/
+
## Need help? Join the community!
Home Assistant has a great community of users who are all more than willing
@@ -1103,6 +1139,14 @@ The stale restored sensor can be safely removed.
{% enddetails %}
+{% details "Workday" %}
+
+Workday now requires a 2-character [ISO 3166-1] country code instead of the country's name. States, provinces and constituent countries must now be listed using the `province` setting. Please see the [documentation](/integrations/workday) for examples.
+
+[ISO 3166-1]: https://en.wikipedia.org/wiki/ISO_3166-1
+
+{% enddetails %}
+
{% details "XBee" %}
The Xbee integration has been disabled due to the third-party library
diff --git a/source/images/dashboards/energy/grid-neutrality-gauge.png b/source/images/dashboards/energy/grid-neutrality-gauge.png
index 88153c29c05..a25f1c9778f 100644
Binary files a/source/images/dashboards/energy/grid-neutrality-gauge.png and b/source/images/dashboards/energy/grid-neutrality-gauge.png differ