State auf attribut prüfen - Aktuelle Rollladenposition auslesen

Hallo liebes Forum,

ich habe eine Markise, die ich bei zu starkem Wind einfahren möchte. Ich möchte aber nur den Fahrbefehl senden, wenn die Markise ausgefahren ist.
Ich sehe zwei Möglichkeiten, weiß aber nicht wie.

  1. Es gibt das Attribut “cover.markise.attribut.current_position”
  2. Es gibt den Zustand "cover.mark.original_state: “open”
    Die Markise hat den State: open, bis diese vollständig geschlossen/ausgefahren ist, somit fällt das heraus.
    Ich bekomme es aber nicht hin, dass ich als Ergebnis die “cover.markise.attribut.current_position” als Zahlenwert 100 für komplett eingefahren bzw. einen anderen erhalte:
[
    {
        "id": "45d34181a9f9c49a",
        "type": "api-current-state",
        "z": "22530f6a046f733c",
        "name": "Prüfung, ob Markise Position 100 ist?",
        "server": "9a63205d.785ca",
        "version": 3,
        "outputs": 2,
        "halt_if": "$number($entities('cover.markise.current_position').state)",
        "halt_if_type": "jsonata",
        "halt_if_compare": "lt",
        "entity_id": "cover.markise",
        "state_type": "num",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            },
            {
                "property": "a",
                "propertyType": "global",
                "value": "cover.markise.attributes.current_position'",
                "valueType": "jsonata"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 370,
        "y": 140,
        "wires": [
            [
                "69fab9246a541cee"
            ],
            [
                "fecd2877a7ab505b"
            ]
        ]
    },
    {
        "id": "9a63205d.785ca",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    }
]

Vielen Dank für Eure Hilfe

Ausgefahren = geschlossen?
Wenn es “open” gibt, gibt es dann nicht evtl. auch closed bzw. not_open?

Frage 1 warum willst du den Befehl nur senden wenn Sie ausgefahren ist? Schadet tut es nicht und macht deine Automation einfacher.

Ansonsten sollte der Status closed oder open doch für den Fall reichen.

Solange ein Cover, in dem Fall die Markise nicht vollständig geschlossen ist, liegt der Zustand open vor

condition:
  - condition: state
    entity_id: cover.markise
    state: open

Verwende ich so als Bedingung für das automatisches Einfahren der Markise bei Regen oder Windböen.

Gruß
Osorkon

1 „Gefällt mir“

Jup würde ich auch so machen, aber nochmal ist die Bedingung notwendig? Wenn eh schon Status closed, passiert beim Service Aufruf doch nichts mehr oder?

Vorteil wäre, dass es auch bei den Zwischenstände gehen würde und/oder wenn der Cover mal kurzzeitig unknown oder einen falsch stand widerspiegelt. Unknown habe ich bei Rolläden ab und zu mal kurz, wenn die Shelly discover machen. Aber ist nur wenige Sekunden, aber bei der Markise unpraktisch.

Zum einen wird unnötig geschwätzt.
Zum anderen habe ich als Aktion eine Benachrichtigung, die mich benachrichtigt, diese brauche ich nicht, wenn die Markise bereits geschlossen ist.

Gruß
Osorkon

1 „Gefällt mir“

Das ist meine Frage, macht das wirklich was aus?

Benachrichtigung, ja klar da will man keine unnötigen Nachrichten.

Wie hast du es mit den Zwischenstände gelöst? Wenn du die Markise z.B. gerade ausfährst oder ist der Fall eher theoretisch?

Wenn du den aktuellen Wert benötigst, dann eventuell so:

Wenn einem der Zustand offen oder geschlossen nicht ausreicht.
Die Postion ist ein Attribut der Cover Entität.
Lässt sich direkt als Numerischer Zustand oder Zustand in einer Automatisierung verwenden.

Als Template sieht es dann so aus.

{{ state_attr('cover.markise', 'current_position') }}

Theoretisch hasst Du recht. Praktisch, hat bei mir die Automatisierung noch nie gegriffen, in dem Moment wo ich die Markise ausfahre.

Man könnte dann als Bedingung, "ist nicht geschlossen“ verwenden

condition:
  - condition: not
    conditions:
      - condition: state
        entity_id: cover.markise
        state: closed

Gruß
Osorkon

1 „Gefällt mir“

Hallo silberfuxx,
“open” ist so lange, bis nicht vollständig ausgefahren also von Position 0-99%. Da theoretisch auch Zwischenpositionen möglich sind, reicht nur “open” oder “close” nicht als Zustand.

Ja, der Zustand “open” und “closed” reicht nicht aus, da bei 99% (1% bis geschlossen) nicht geschlossen werden würde.
Wie Ihr richtig anmerkt, nutze ich das ganze für ein Einfahren bei starkem Wind. Ich mache vorher schon eine Abfrage, ob der Wind meine definierte Windstärke überschritten hat. Regen ist für mich nicht relevant, da die Markise sich unterhalb eines Glasdachs befindet.
Eine Nachricht möchte ich nicht bekommen, da bekomme ich schon genug von anderen “Schleifen”.
Mein Ansatz ist es auch, auch wenn nur theoretisch möglich, eben durch die Position ein Ausfahren zu unterbrechen indem ich dann mit einem set_cover_position x diesen unterbrechen und neu setzen werde.

@Osorkon hat dir doch die Lösung geschrieben mit allen Zwischenpositionen

Manche Dinge (Programmierer) muss man einfach nicht verstehen. Für mich, als logisch denkender Mensch, wäre offen (open) alles, was nicht komplett eingefahren ist also von >0 % (1 %) bis einschließlich 100 % und geschlossen ist exakt 0 % (offen).
Aber wenn dem so ist …

@Osorkon hat ja eine gute Lösung gepostet
oder du schaltest einen Helfer auf “on” sobald die Markise ausgefahren wird, also ein Befehl zum Ausfahren an den Markisenmotor kommt, egal wie lange der läuft.

Ich habe schon einige Helfer. Ist zwar sicherlich auch eine Möglichkeit, aber ich möchte es anders umsetzen. Ich finde die Fehlersuche dann einfacher.

Hallo @Osorkon:
Vielen Dank für Deine Antwort!
Leider bekomme ich Deinen Code nicht richtig eingebaut. Ich bekomme verschiedene Fehlermeldungen. An welcher Stelle ist das einzugeben?

Viele Grüße

Wo willst du das denn nun benutzen, in Homeassistant, oder in NR?

In NodeRed als Add-On innerhalb von Home Assistant

Hattest du dann meinen Post von gestern gesehen?

Ja, allerdings ist das Ergebnis leer. Mein Debug-Baustein gibt als Ergebnis “undefined” zurück.

Nachtrag:
So, ich habe eine Lösung gefunden, die aber aktuell noch etwas “kompliziert” ist. Bin gerne offen für Optimierung:

[
    {
        "id": "22530f6a046f733c",
        "type": "tab",
        "label": "Flow 2",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "6665ad048b8e6484",
        "type": "inject",
        "z": "22530f6a046f733c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 100,
        "y": 140,
        "wires": [
            [
                "45d34181a9f9c49a"
            ]
        ]
    },
    {
        "id": "45d34181a9f9c49a",
        "type": "api-current-state",
        "z": "22530f6a046f733c",
        "name": "Prüfung, ob Markise Position 100 ist?",
        "server": "9a63205d.785ca",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "num",
        "halt_if_compare": "lt",
        "entity_id": "cover.markise",
        "state_type": "num",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            },
            {
                "property": "a",
                "propertyType": "global",
                "value": "cover.markise.attributes.current_position'",
                "valueType": "jsonata"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 370,
        "y": 140,
        "wires": [
            [
                "d7cff30848c0cbf1"
            ]
        ]
    },
    {
        "id": "d7cff30848c0cbf1",
        "type": "change",
        "z": "22530f6a046f733c",
        "name": "Move Lightlevel to Payload",
        "rules": [
            {
                "t": "move",
                "p": "data.attributes.current_position",
                "pt": "msg",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 140,
        "wires": [
            [
                "99b564b67a51ee47",
                "b14b95d134c69c72"
            ]
        ]
    },
    {
        "id": "99b564b67a51ee47",
        "type": "debug",
        "z": "22530f6a046f733c",
        "name": "debug 235",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "true",
        "targetType": "full",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 950,
        "y": 80,
        "wires": []
    },
    {
        "id": "b14b95d134c69c72",
        "type": "switch",
        "z": "22530f6a046f733c",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "neq",
                "v": "100",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 930,
        "y": 140,
        "wires": [
            [
                "8649970fcbda1f4b"
            ]
        ]
    },
    {
        "id": "8649970fcbda1f4b",
        "type": "api-call-service",
        "z": "22530f6a046f733c",
        "name": "Windschutz Markise einfahren auf Pos. 100",
        "server": "9a63205d.785ca",
        "version": 5,
        "debugenabled": true,
        "domain": "cover",
        "service": "set_cover_position",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "cover.markise"
        ],
        "data": "{\"position\":100}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": true,
        "outputProperties": [],
        "queue": "all",
        "x": 1210,
        "y": 140,
        "wires": [
            []
        ]
    },
    {
        "id": "9a63205d.785ca",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    }
]

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Bei Home Assistant kann ich gern unterstützen.
Bei Node Red bin raus!

Gruß
Osorkon