Planformat¶
Der Plan ist ein JSON-Objekt, das in .storage/fns_floorplan gespeichert wird. Der Editor liest und schreibt es; du kannst es auch mit fns_floorplan/plan/get lesen und mit fns_floorplan/plan/save ersetzen (Websocket-API).
- Koordinaten sind in Metern,
xnach rechts,znach unten. revist der Revisionszähler, von der Integration verwaltet; setze ihn nicht von Hand.- Räume und Elemente der ersten Etage tragen kein
level.
Oberste Ebene¶
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
rev |
integer | 0 | Revision, wird bei jedem Speichern erhöht |
levels |
list | eine Etage | Etagen [{id, name}]. Ohne sie hat der Plan eine Etage |
rooms |
list | [] |
Räume |
openings |
list | [] |
Türen und Fenster |
furniture |
list | [] |
Möbel und Lichter |
sensors |
list | [] |
Binärsensoren |
devices |
list | [] |
Geräte |
texts |
list | [] |
Textelemente |
labels |
object | {} |
{room_id: [x, z]}: manuelle Position einer Raumbeschriftung |
outdoor |
string | keiner | ID des Raums, dessen Temperatur als Außentemperatur angezeigt wird |
backgrounds |
object | {} |
Vorlagenbild pro Etage {level_id: {url, left, top, width, opacity}}, nur im Editor |
vacuum |
object | keiner | Veraltet: entity, room_sensor; wird vom Editor in eine Station umgewandelt |
style |
object | {} |
Farben des Plans aus dem Tab Aussehen des Editors, siehe Aussehen |
Stil¶
Farben des Plans aus dem Tab Aussehen des Editors. Jeder Schlüssel ist optional und enthält "#rrggbb"; ein nicht gesetzter Schlüssel behält seinen Standard.
| Schlüssel | Was er einfärbt | Standard |
|---|---|---|
wall_day / wall_night |
Wände (Tag / Nacht) | Primärfarbe des Designs |
floor_day / floor_night |
Boden (Tag / Nacht) | weiß / dunkelblau |
text_day / text_night |
Raumbeschriftungen und Texte (Tag / Nacht) | dunkel / hell |
accent |
Akzent von Schaltflächen und Hervorhebungen | Primärfarbe des Designs |
lamp |
Ein Licht, das keine eigene Farbe meldet | die Designfarbe eines aktiven Lichts, aufgehellt |
open |
Offene Tür oder Fenster, entsperrtes Schloss, ausstehender Alarm | die Designfarbe eines aktiven Binärsensors, sonst Orange |
alarm |
Ausgelöster Alarm | die Designfarbe eines ausgelösten Alarms, sonst Rot |
blind |
Rollläden | die Designfarbe einer geschlossenen Abdeckung, sonst der Akzent |
cold / hot |
Kalte und warme Temperatur auf Raumbeschriftungen | blau / orange |
Etagen¶
| Schlüssel | Typ | Beschreibung |
|---|---|---|
id |
string | ID der Etage |
name |
string | In den Tabs angezeigter Name |
Räume, Möbel, Geräte, Sensoren und Texte nehmen level mit der Etagen-ID; ohne sie gehören sie zur ersten Etage. Öffnungen folgen ihrem Raum.
Räume¶
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
id |
string | Eindeutige ID | |
name |
string | Name | |
points |
list of [x, z] |
Ecken des Polygons, mindestens 3 | |
level |
string | erste Etage | Etagen-ID |
icon |
string | keines | mdi:-Symbol für die Kopfzeile des Raum-Panels |
temperature |
entity | null | Temperatursensor |
humidity |
entity | null | Feuchtigkeitssensor |
sheet_extra |
list of entities | [] |
Zusätzliche Entitäten für das Raum-Panel; ein Eintrag kann eine Vorlage sein, die Entitäts-IDs ausgibt (Räume) |
label_info |
list | temperature, humidity |
Was die Beschriftung zeigt: temperature, humidity, Entitäts-IDs oder Vorlagen |
label_name |
boolean | true |
false blendet den Namen aus |
label_hidden |
boolean | false |
true blendet die Beschriftung aus |
label_rotation |
number | 0 | Drehung der Beschriftung in Grad |
label_size |
string | m |
Größe der Beschriftung: xs, s, m, l, xl, xxl |
rules |
list | [] |
Regeln |
Öffnungen (Türen und Fenster)¶
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
id |
string | Eindeutige ID | |
room_id |
string | Der Raum, an dessen Wand sie sitzt | |
edge |
integer | Index der Wand: von points[edge] zum nächsten Punkt |
|
offset |
number | Mitte der Öffnung, Meter ab Wandanfang | |
width |
number | Breite in Metern | |
type |
door / window |
||
style |
string | normal | passage = nur eine Öffnung (Türen) |
hinge |
left / right |
Vom Raum aus gesehen | |
swing |
in / out |
||
contact |
entity | null | Kontaktsensor. Ohne ihn ist eine Tür um 45 Grad angelehnt, ein Fenster geschlossen |
lock |
entity | null | Eine lock-Entität, die an der Tür angezeigt wird |
lock_size |
size | s |
Größe des Schloss-Badges |
blind |
entity | null | Eine cover-Entität, die am Fenster entlang gezeichnet wird |
blind_side |
in / out |
in |
out = außerhalb der Wand |
blind_invert |
boolean | false |
Die Entität meldet für geschlossen 100 |
tap_action, double_tap_action, hold_action |
action | Kontaktdetails | Aktionen |
sheet_hide |
boolean | false |
Im Raum-Panel weglassen |
Möbel¶
Möbel, Lichter und die Station des Roboters teilen sich diese Liste.
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
id |
string | Eindeutige ID | |
type |
string | Möbeltyp (Liste), Lichttyp (lamp_ceiling, lamp_pendant, lamp_panel, lamp_spot, lamp_table, lamp_wall, led_strip) oder robot_vacuum |
|
x, z |
number | Mitte in Metern | |
rotation |
number | 0 | Grad; 0 = rechts, 90 = unten |
w, d |
number | Breite und Tiefe in Metern | |
level |
string | erste Etage | Etagen-ID |
entity |
entity | null | Lichtentität (Lichter), Mediaplayer (tv_wall), Staubsauger (Station) |
room_light |
number / false | Anteil | Anteil am Raumleuchten eines Lichts, 1 = 100 %, false = fast nichts |
beam |
number | 40 | lamp_spot: Kegelbreite in Grad |
glow_side |
1 / -1 |
rundum | led_strip: strahlt zu einer Seite |
color |
colour | Standardfarbe von Möbeln (eine Regel hat Vorrang) | |
icon, size, layer |
Gemeinsame Elementfelder | ||
group |
string | Gruppen-ID (gesetzt durch die Schaltfläche Gruppieren) | |
room_sensor, room_map, battery |
Station: siehe Saugroboter | ||
color_on, fx, progress, progress_total |
Station: Aussehen beim Saugen | ||
rules, tap_action, double_tap_action, hold_action, sheet_hide |
Sensoren¶
| Schlüssel | Typ | Beschreibung |
|---|---|---|
entity |
entity | Ein Binärsensor; motion, occupancy, presence = Wellen, moisture = roter Puls |
x, z |
number | Position |
layer |
integer | Reihenfolge unter Sensoren und Möbeln im Editor |
level |
string | Etagen-ID |
Geräte¶
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
id |
string | Eindeutige ID | |
kind |
string | fan, purifier, dehumidifier, dishwasher, dryer, boiler, radiator, alarm, media, aquarium, camera, fridge, fireplace, lock, generic |
|
name |
string | Name (Tooltip) | |
entity |
entity | Die Entität | |
x, z |
number | Position | |
level |
string | erste Etage | Etagen-ID |
active |
list / {"above": n} |
nach Art / Domain | Zustände, die als „läuft“ zählen |
text |
string | Text unter dem Symbol, immer; kann eine Vorlage sein | |
text_on |
string | Text, solange es läuft; kann eine Vorlage sein, {left:timer.x} = Restzeit dieser Entität, {left} = des Countdowns |
|
label_position |
string | bottom |
Position der Beschriftung: bottom (Standard), top, left, right |
label_vertical |
bool | false |
Dreht die Beschriftung um 90 Grad (von unten nach oben lesbar) |
color, color_on |
colour | Zustandsfarbe | Farbe im Ruhezustand / beim Laufen |
fx |
string | nach Art | Ringanimation |
pipe |
list | Nur Heizkörper (auch Möbel type: radiator, das nach animate einer Regel fließt): Ecken [[x, z], …] des Heizungsrohrs zwischen dem Kessel des Stockwerks und dem Heizkörper ([] = gerade). Fließt, wenn Kessel und Heizkörper beide laufen, in der Farbe wave |
|
progress, progress_total |
entity / minutes | Quelle des Countdowns | |
cover |
boolean | true |
media: false schaltet das Cover aus |
battery |
entity | Gerätebatterie | Staubsaugergeräte |
icon, size, layer |
Gemeinsame Elementfelder | ||
rules, tap_action, double_tap_action, hold_action, sheet_hide |
Texte¶
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
id |
string | Eindeutige ID | |
entity |
entity | Ihr Zustand wird angezeigt | |
text |
string | Fester Text oder eine {{ }}-Vorlage |
|
x, z |
number | Position | |
rotation |
number | 0 | Grad |
size |
size | m |
xs bis xxl |
color |
colour | Textfarbe | |
background |
string | Badge-Stil | none = kein Hintergrund |
level |
string | erste Etage | Etagen-ID |
rules, actions |
Gemeinsame Elementfelder¶
| Schlüssel | Typ | Beschreibung |
|---|---|---|
icon |
string | Jedes mdi:-Symbol; none für kein Symbol |
size |
string | xs, s, m, l, xl, xxl |
layer |
integer | Stapelreihenfolge innerhalb der Art |
sheet_hide |
boolean | Im Raum-Panel weglassen |
tap_action, double_tap_action, hold_action |
object | action: toggle, more-info, perform-action (perform_action, data), navigate (navigation_path), url (url_path), none |
Regeln¶
Eine geordnete Liste bei Räumen, Möbeln, Geräten, Texten und Lichtern. Pro Ausgabefeld gewinnt die erste passende Regel; siehe Regeln.
| Schlüssel | Typ | Beschreibung |
|---|---|---|
if |
list | Bedingungen (alle müssen zutreffen); eine Regel ohne if ist der Standard |
color, glow, animate, wave, text, tint, opacity, hide, icon, background |
Ausgaben | |
fx, progress, progress_total |
Ringanimation und Countdown |
Eine Bedingung hat eine dieser Formen:
| Form | Beschreibung |
|---|---|
{entity, attribute?, state} |
state darf eine Liste sein |
{entity, attribute?, state_not} |
Negation, darf eine Liste sein |
{entity, attribute?, above} / below |
Numerischer Vergleich |
{template: "{{ ... }}"} |
Jinja, wahr bei true, on, yes, 1, Zahlen ungleich null |
{any: [conditions]} |
ODER |
Vollständiges Beispiel¶
Eine kleine Wohnung mit drei Räumen.
{
"levels": [{"id": "0", "name": "Erdgeschoss"}],
"outdoor": "balcony",
"rooms": [
{"id": "living_room", "name": "Wohnzimmer", "icon": "mdi:sofa",
"points": [[0, 0], [5, 0], [5, 4], [0, 4]],
"temperature": "sensor.living_room_temperature", "humidity": "sensor.living_room_humidity",
"sheet_extra": ["media_player.tv"]},
{"id": "kitchen", "name": "Küche",
"points": [[5, 0], [8, 0], [8, 4], [5, 4]],
"temperature": "sensor.kitchen_temperature",
"rules": [{"if": [{"entity": "binary_sensor.kitchen_leak", "state": "on"}], "tint": "red", "opacity": 0.3}]},
{"id": "bedroom", "name": "Schlafzimmer",
"points": [[0, 4], [5, 4], [5, 7], [0, 7]],
"temperature": "sensor.bedroom_temperature"}
],
"openings": [
{"id": "d_front", "room_id": "living_room", "edge": 3, "offset": 2.0, "width": 0.9, "type": "door",
"hinge": "left", "swing": "in", "contact": "binary_sensor.front_door", "lock": "lock.front_door"},
{"id": "d_kitchen", "room_id": "living_room", "edge": 1, "offset": 2.0, "width": 0.8, "type": "door",
"style": "passage"},
{"id": "d_bedroom", "room_id": "living_room", "edge": 2, "offset": 2.5, "width": 0.8, "type": "door",
"hinge": "right", "swing": "in"},
{"id": "w_living", "room_id": "living_room", "edge": 0, "offset": 2.5, "width": 1.6, "type": "window",
"contact": "binary_sensor.living_room_window", "blind": "cover.living_room_blind"}
],
"furniture": [
{"id": "f_sofa", "type": "sofa", "x": 2.5, "z": 3.1, "rotation": 0, "w": 2.0, "d": 0.9},
{"id": "f_tv", "type": "tv_wall", "x": 2.5, "z": 0.1, "rotation": 0, "w": 1.4, "d": 0.1, "entity": "media_player.tv"},
{"id": "f_bed", "type": "bed", "x": 2.5, "z": 5.6, "rotation": 0, "w": 1.8, "d": 2.0},
{"id": "l_living", "type": "lamp_ceiling", "x": 2.5, "z": 2.0, "entity": "light.living_room", "room_light": 1},
{"id": "l_strip", "type": "led_strip", "x": 2.5, "z": 3.9, "w": 3.0, "d": 0.05, "entity": "light.living_room_strip"},
{"id": "dock", "type": "robot_vacuum", "x": 0.4, "z": 3.4, "entity": "vacuum.robot",
"room_sensor": "sensor.robot_current_room", "room_map": {"Wohnzimmer": "living_room"}}
],
"sensors": [
{"id": "s_motion", "entity": "binary_sensor.living_room_motion", "x": 4.6, "z": 0.4}
],
"devices": [
{"id": "dev_radiator", "kind": "radiator", "entity": "climate.living_room", "x": 4.7, "z": 2.0},
{"id": "dev_dishwasher", "kind": "dishwasher", "name": "Geschirrspüler", "entity": "sensor.dishwasher_state",
"x": 7.4, "z": 0.8, "active": ["run"], "text_on": "{{ states('sensor.dishwasher_remaining') }} min"}
],
"texts": [
{"id": "t_out", "text": "{{ states('sensor.outdoor_temperature') }} °C", "x": 6.5, "z": 5.0, "background": "none"}
],
"labels": {"kitchen": [6.5, 3.4]}
}