MichelFR
(Michel R.)
February 22, 2024, 1:33pm
41
I happy to provide you exactly that, it creates a new card for each container and shows its entities. You need card-mod and auto-entities:
type: custom:auto-entities
show_empty: true
card:
type: grid
square: false
columns: 1
card_param: cards
filter:
template: |-
{% set ns = namespace(entities=[]) %}
{% for sensor in states.sensor %}
{% if sensor.entity_id | regex_search("sensor\..*_container_name$", ignorecase=True) and sensor.state not in ['unavailable', 'unknown'] %}
{% set container_name = sensor.attributes.friendly_name | regex_replace(" Container Name", "", ignorecase=True) %}
{% set status_entity_id = sensor.entity_id | replace("_container_name", "_container_status") %}
{% set registry_entity_id = sensor.entity_id | replace("_container_name", "_docker_registry") %}
{% set image_entity_id = sensor.entity_id | replace("_container_name", "_docker_image") %}
{% set tag_entity_id = sensor.entity_id | replace("_container_name", "_docker_tag") %}
{% set ports_entity_id = sensor.entity_id | replace("_container_name", "_exposed_ports") %}
{% set status_entity = states.sensor[status_entity_id.split('.')[1]] %}
{% set registry_entity = states.sensor[registry_entity_id.split('.')[1]] %}
{% set image_entity = states.sensor[image_entity_id.split('.')[1]] %}
{% set tag_entity = states.sensor[tag_entity_id.split('.')[1]] %}
{% set ports_entity = states.sensor[ports_entity_id.split('.')[1]] %}
{% if status_entity is defined and status_entity.state not in ['unavailable', 'unknown'] %}
{% set container_info = {
'type': 'entities',
'title': container_name,
'entities': [
{'entity': status_entity_id, 'name': status_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': registry_entity_id, 'name': registry_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': image_entity_id, 'name': image_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': tag_entity_id, 'name': tag_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': ports_entity_id, 'name': ports_entity.attributes.friendly_name | replace(container_name, "")},
]
} %}
{% set ns.entities = ns.entities + [container_info] %}
{% endif %}
{% endif %}
{% endfor %} {{ ns.entities | tojson }}
2 Likes
pvh0
(pvh0)
February 22, 2024, 3:27pm
42
Thanks for the code, I added the update value in your code:
{% set update_entity_id = sensor.entity_id | replace("_container_name", "_update") %}
{% set update_entity = update_entity_id | replace("sensor", "update") %}
{'entity': update_entity, 'name': "Update"}
See below:
type: custom:auto-entities
show_empty: true
card:
type: grid
square: false
columns: 1
card_param: cards
filter:
template: |-
{% set ns = namespace(entities=[]) %}
{% for sensor in states.sensor %}
{% if sensor.entity_id | regex_search("sensor\..*_container_name.*$", ignorecase=True) and sensor.state not in ['unavailable', 'unknown'] %}
{% set container_name = sensor.attributes.friendly_name | regex_replace(" Container Name", "", ignorecase=True) %}
{% set status_entity_id = sensor.entity_id | replace("_container_name", "_container_status") %}
{% set registry_entity_id = sensor.entity_id | replace("_container_name", "_docker_registry") %}
{% set image_entity_id = sensor.entity_id | replace("_container_name", "_docker_image") %}
{% set tag_entity_id = sensor.entity_id | replace("_container_name", "_docker_tag") %}
{% set ports_entity_id = sensor.entity_id | replace("_container_name", "_exposed_ports") %}
{% set update_entity_id = sensor.entity_id | replace("_container_name", "_update") %}
{% set status_entity = states.sensor[status_entity_id.split('.')[1]] %}
{% set registry_entity = states.sensor[registry_entity_id.split('.')[1]] %}
{% set image_entity = states.sensor[image_entity_id.split('.')[1]] %}
{% set tag_entity = states.sensor[tag_entity_id.split('.')[1]] %}
{% set ports_entity = states.sensor[ports_entity_id.split('.')[1]] %}
{% set update_entity = update_entity_id | replace("sensor", "update") %}
{% if status_entity is defined and status_entity.state not in ['unavailable', 'unknown'] %}
{% set container_info = {
'type': 'entities',
'title': container_name,
'entities': [
{'entity': status_entity_id, 'name': status_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': registry_entity_id, 'name': registry_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': image_entity_id, 'name': image_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': tag_entity_id, 'name': tag_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': ports_entity_id, 'name': ports_entity.attributes.friendly_name | replace(container_name, "")},
{'entity': update_entity, 'name': "Update"}
]
} %}
{% set ns.entities = ns.entities + [container_info] %}
{% endif %}
{% endif %}
{% endfor %} {{ ns.entities | tojson }}
2 Likes
pvh0
(pvh0)
February 23, 2024, 6:16am
43
One more addition, somehow when I rebuild images they get the name with “_2” added at the end. Therefore I’ve changed your regular expression to:
regex_search("sensor\..*_container_name.*$", ignorecase=True)
B4dC4rd
(B4d C4rd)
February 23, 2024, 1:14pm
44
@pvh0 Thanks for the help
My compose editor is in Portainer and mqdocker in part of a stack.
The syntax I use for the environment part is slightly different and I wonder if that could be part of the problem?
The other docker part of the stack is running fine.
Here is my redacted code :
mqdockerup:
image: micrib/mqdockerup:latest
container_name: mqdockerup
environment:
- PUID=xxx
- PGID=xxx
- TZ=zone
- MAIN_INTERVAL:5m
- MQTT_CONNECTIONURI:mqtt://myMQTT_IP:1883
- MQTT_USERNAME:username
- MQTT_PASSWORD:password
# - ACCESSTOKENS_GITHUB: ""
volumes:
- /var/run/docker.sock:/var/run/docker.sock # This is required to access the docker API
- /volume1/docker/mqdockerup/:/app/data/ # This is required to store the data (database.db)
network_mode: xxx
restart: unless-stopped
My compose editor will not work without the - in front of the variables names or with quotes around the values as far as I can see.
To be clear the standalone version was installed on a computer and not on the NAS, so I suspect that is why it cannot connect to the docker.
In any case, I prefer to only use the docker if that is possible so I am hoping it is simply a configuration issue.
1 Like
pvh0
(pvh0)
February 23, 2024, 3:27pm
45
I’m using the same, Portainer compose editor in a stack and have shown my code. Yours is different in several ways:
Version is not defined ( environment
and content
attributes are available with Docker Compose version 2.23.1 and later.)
Your environment variables start with a "- " , not sure if that matters
I see some undocumented variables that I do not know (e.g. PUID)
your values are not between double quotes (e.g. MQTT_CONNECTIONURI)
Would recommend to start a new stack to test just running the MQdockerup image in portainer with the compose coe I provided, with you password and username etc added. See also here a link for the official compose example:
2 Likes
B4dC4rd
(B4d C4rd)
February 24, 2024, 12:45am
46
Thanks @pvh0 I think I simply went down a rabbit hole!
Launching the compose in a separate stack whilst reviewing the syntax allowed me to fix the problem.
I’m not sure why this syntax with the “-” works with my other dockers such as sonarr, radarr, etc, but not this one.
All the same I’m up and running and already loving this service. Exactly what I needed to maintain my docker within HA
2 Likes
B4dC4rd
(B4d C4rd)
March 7, 2024, 12:44pm
47
It has been working very well for me since I managed to get this running.
There are however a few containers for which I have issues.
Both tecnativa/docker-socket-proxy and plexinc/pms-docker (public tag) are reporting unknown status.
Has anybody experienced this and found a fix?
I searched but could not find references.
Cheers,
Hello,
Any news regarding restart functionality?
RHCPNG
June 30, 2024, 8:49am
49
Thanks for the great work! I’m really looking forward to the start/stop functionality, that would make your tool complete.
Hey,
Just found this and had some issues with setting up, after a while I did manage to get it running with the “-” syntax as all my other compose containers. Just wanted to let you know that it does work, you need to follow syntax though, so replace “:” with “=” and all good.
1 Like