Skip to content

Commit

Permalink
v4.0.38-beta
Browse files Browse the repository at this point in the history
  • Loading branch information
jemu75 committed Apr 21, 2024
1 parent ffd9638 commit a3a5a69
Show file tree
Hide file tree
Showing 20 changed files with 206 additions and 52 deletions.
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ Ersetzungen bieten die Möglichkeit, Werte innerhalb von Element-Definitionen zu
|Ersetzung|Beschreibung|
|---|---|
|%t(on)|gibt die Übersetzung für die Variable `on` an. (siehe auch [Sprachen](#sprachen))|
|%v|liefert den aktuellen Wert von Slidern
|%v|liefert den aktuellen Wert von Slidern oder Menüeinträgen
|\\:|wird zur Ausgabe von `:` innerhalb von Element-Definitionen verwendet|

|Beispiel|Reading|Ausgabe|Hinweis|
Expand Down Expand Up @@ -483,19 +483,21 @@ Zeigt einen Button an, der beim Klicken ein DropDown-Menü öffnet. Wenn dieses
### Level Element Menu menu
Definiert die Menüeinträge, die beim Öffnen des DropDown-Menü angezeigt werden. Bei Klick auf einen Menüpunkt wird der hinterlegte Befehl an FHEM gesendet. Im Gegensatz zu normalen Definitionen, werden zur Anzeige der Menüpunkte **alle** Definitionen verwendet, deren Bedingungen zutreffen.

Menüeinträge können auch von FHEM übergeben werden. Dafür muss der Inhalt des FHEM *readings* oder *attributes* folgender Form entsprechen: `Name1:cmd1,Name2:cmd2,...`
Menüeinträge können auch dynamisch von FHEM übergeben werden. Der Rückgabewert vom FHEM Befehl *get* bzw. dem *reading* oder *attribute* muss dabei durch einen der folgenden Zeichen (`,` `|` `\n`) getrennt werden. Bei dynamisch erzeugten Menüeinträgen muss der FHEM *get-Befehl* oder *%s* bei Verwendung eines *reading* bzw. *attribute* in den Parameter `name` eingetragen werden. Im Parameter `cmd` kann dann die Ersetzung **%v** verwendet werden um den aktuellen Menüeinträge über einen *set-Befehl* an FHEM zu übergeben.

|Parameter|Default|Beschreibung|
|---|---|---|
|reading||siehe Parameter [reading](#konfiguration-der-elemente)|
|value||siehe Parameter [value](#konfiguration-der-elemente)|
|name||Name der im DropDown-Menü angezeiugt wird [string]|
|cmd||FHEM Befehl, der beim Klick auf den Menüpunkt an FHEM gesendet wird. [string]|
|name||Name der im DropDown-Menü angezeiugt wird. Alternativ FHEM *get-Befehl* [string]|
|cmd||FHEM Befehl, der beim Klick auf den Menüpunkt an FHEM gesendet wird. Bei dynamisch erzeugten Menüeinträgen kann die [Ersetzung](#ersetzungen) **%v** verwendet werden. [string]|
|convert||**regExp** [string] Relevant bei Verwendung dynamisch erzeugter Menüeinträge. Der anstelle von **%v** verwendete Wert wird in einen regulären Ausdruck umgewandelt. Relevant bei SONOS Playern|

|Beispiel|Beschreibung|
|---|---|
|`::30 Minuten:set switch on-for-timer 1800`|Zeigt im Menü den Menüpunkt `30 Minuten` an und sendet bei Klick den Befehl `set switch on-for-timer 1800` an FHEM. Dabei wird im Panel unter dem [Element devices](#element-devices) nach dem Schlüssel `switch` gesucht und falls vorhanden, durch den Name des FHEM Devices ersetzt.|
|`switch-a-dropdown::%s:%s`|übernimmt die Definition der Menüeinträge aus dem FHEM Attribut `dropdown` vom Device `switch`. Dabei wird im Panel unter dem [Element devices](#element-devices) nach dem Schlüssel `switch` gesucht und falls vorhanden, durch den Name des FHEM Devices ersetzt.|
|`::get dev scenes:set dev scene %v`|ermittelt für ein FHEM **lightScene** Device mit dem Devicekey `dev` alle Szenen und generiert dynamische Menüeinträge|
|`player-FavouritesListAlias::%s:set player StartFavourite %v:regExp`|ermittelt für ein FHEM **SONOSplayer** Device alle Favouriten und generiert dynamische Menüeinträge. Über die Konvertierung **regExp** werden die Namen der Favouriten in reguläre Ausdrücke in den *set-Befehlen* umgewandelt.|
### Level Element Info text
Zeigt bis zu 3 Texte (text, text2, text3) an. Dabei wird `text` immer über `text2` und `text3` angezeigt. Weiterhin wird `text2` immer links neben `text3` angezeigt.

Expand Down Expand Up @@ -663,6 +665,7 @@ Mit **FHEMApp** werden verschiedene Standardvorlagen bereitgestellt, die den Ein
|Name: *thermostat* <br>Devicekeys: *thermo, valve*<br>Readings: *alias, **room**,<br> group, sortby, measured-temp,<br> **desired-temp**, humidity,<br> R-dayTemp, R-nightTemp,<br> tempState, controlMode,<br> state (valve), pct (valve)* <br><br>Einsatz: Heizungsthermostate<br>JSON: [thermostat](./public/templates/thermostat.json)|![](./docs/media/template_thermostat.png)|
|Name: *temperatur* <br>Devicekeys: *temp*<br>Readings: *alias, **room**, group, sortby, **temperature**, humidity* <br><br>Einsatz: Temperatursensoren<br>JSON: [temperatur](./public/templates/temperatur.json)|![](./docs/media/template_temperatur.png)|
|Name: *smokedetector* <br>Devicekeys: *smoke*<br>Readings: *alias, **room**, group, sortby, **level*** <br><br>Einsatz: Rauchmelder<br>JSON: [smokedetector](./public/templates/smokedetector.json)|![](./docs/media/template_smokedetector.png)|
|Name: *motiondetector* <br>Devicekeys: *sensor*<br>Readings: *alias, **room**, group, sortby, **motion*** <br><br>Einsatz: Bewegungsmeldung<br>JSON: [motiondetector](./public/templates/motiondetector.json)|![](./docs/media/template_motiondetector.png)|
|Name: *motiondetector* <br>Devicekeys: *sensor*<br>Readings: *alias, **room**, group, sortby, **motion*** <br><br>Einsatz: Bewegungsmelder<br>JSON: [motiondetector](./public/templates/motiondetector.json)|![](./docs/media/template_motiondetector.png)|
|Name: *lightscene* <br>Devicekeys: *lightscene*<br>Readings: *alias, **room**, group, sortby, **scene*** <br><br>Einsatz: Szenarien<br>JSON: [lightscene](./public/templates/lightscene.json)|![](./docs/media/template_lightscene.png)|
|Name: *sonosplayer* <br>Devicekeys: *player*<br>Readings: *alias, **room**, group, sortby,<br>and other readings...* <br><br>Einsatz: SONOS Player<br>JSON: [sonosplayer](./public/templates/sonosplayer.json)|![](./docs/media/template_sonosplayer.png)|
|Name: *proplanta* <br>Devicekeys: *weather*<br>Readings: *alias, **room**, group, sortby,<br>and other readings...* <br><br>Einsatz: Wettervorhersage (Proplanta)<br>JSON: [proplanta](./public/templates/proplanta.json)|![](./docs/media/template_proplanta.png)|
Binary file added docs/media/template_lightscene.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions public/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# v4.0.38-beta (21.04.2024)
## Panel
- status now uses the colour variable *primary* analogous to the header of **FHEMApp**
## Panel menu
- add new function for handling FHEM get command
## Settings
- bugfix for adding new languages
## App
- adding default template lightscene
# v4.0.37-beta (20.04.2024)
## Settings
- Selection of FHEM devices optimised
## App
- adding default templates
## Core
- load all default templates on inizialising FHEMApp
- show header after config is loaded
# v4.0.36-beta (17.04.2024)
## App
- providing default templates
Expand Down
58 changes: 58 additions & 0 deletions public/templates/lightscene.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"name": "lightscene",
"author": "jemu",
"date": "2024-04-16",
"panel": {
"devicekeys": [
"lightscene:FHEM lightScene device"
],
"navigation": [
"lightscene-a-room::Räume->%s",
"lightscene-a-group::Gruppen->%s"
],
"sortby": [
"lightscene-a-sortby::%s"
]
},
"status": {
"title": [
"lightscene-a-alias:^.+$:%s",
"lightscene-i-NAME::%s"
],
"imageUrl": [
"::images/header_01.png"
],
"bar": [
"::100"
]
},
"main": [
{
"level": {
"mid": "info",
"right1": "menu"
},
"mid": {
"text": [
"lightscene-state:unknown:individuell",
"lightscene-state::%s"
],
"divider": ["::true"],
"size": ["::9"]
},
"right1": {
"btn": [
"::mdi-dots-vertical"
],
"menu": [
"::get lightscene scenes:set lightscene scene %v"
]
}
}
],
"info": {
"left1": [
":::mdi-movie-open"
]
}
}
2 changes: 1 addition & 1 deletion public/templates/templates.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[
"switch", "light", "dimmer", "contact", "blind", "thermostat", "temperatur", "smokedetector", "motiondetector", "sonosplayer", "proplanta"
"switch", "light", "dimmer", "contact", "blind", "thermostat", "temperatur", "smokedetector", "motiondetector", "sonosplayer", "proplanta", "lightscene"
]
4 changes: 2 additions & 2 deletions src/components/PanelCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
function levelClick(init) {
let opts = levelOpts.value,
idx
if(init) {
opts.activeLevels = levelsActive(item.panel.main)
} else {
Expand Down Expand Up @@ -141,7 +141,7 @@
</v-col>
</v-row>

<v-sheet color="secondary">
<v-sheet color="primary">
<v-img :src="img.url" :gradient="img.url ? fhem.app.header.imageGradient : ''" height="48" cover>
<v-card-title>
<v-row no-gutters>
Expand Down
46 changes: 30 additions & 16 deletions src/components/PanelMainMenu.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup>
import { computed } from 'vue'
import { computed, watch, ref } from 'vue'
import { useFhemStore } from '@/stores/fhem'
const props = defineProps({
Expand All @@ -11,6 +11,12 @@
const fhem = useFhemStore()
const menuItems = ref([])
watch(props.el, (newVal) => {
loadMenu(newVal)
})
const btn = computed(() => {
let res = fhem.handleDefs(props.el.btn, ['icon', 'disabled', 'color', 'variant'], ['mdi-dots-vertical', false, '', 'text'])
Expand All @@ -19,24 +25,30 @@
return res
})
const menu = computed(() => {
let res = [],
defs = fhem.handleDefs(props.el.menu, ['name', 'cmd'], ['',''], true, ','),
item = {}
async function loadMenu() {
let defs = fhem.handleDefs(props.el.menu, ['name', 'cmd', 'convert'], ['','', null], true, ','),
vals,
divider,
re
for(const def of defs) {
item = {
name: /:/.test(def.name) ? def.name.split(':')[0] : def.name,
cmd: /:/.test(def.cmd) ? def.cmd.split(':')[1] : def.cmd
}
vals = /^get/.test(def.name) ? await doCmd(def.name) : def.name
for(const el of [',','|','\n']) if(RegExp(el).test(vals)) divider = el
res.push(item)
}
for(const val of vals.split(divider)) {
if(val) {
re = val
return res
})
if(/%v/.test(def.cmd) && def.convert === 'regExp') re = RegExp(val.replace(/[^a-z,^A-Z]/g, '.'))
menuItems.value.push({ name: val, cmd: def.cmd.replace(/%v/g, re) })
}
}
}
}
function doCmd(cmd) {
async function doCmd(cmd) {
let defParts = []
for(const device of props.devices) {
Expand All @@ -46,6 +58,8 @@
return fhem.request('text', cmd)
}
loadMenu()
</script>

<template>
Expand All @@ -55,7 +69,7 @@
v-bind="props"
icon
:variant="btn.variant"
:disabled="btn.disabled || menu.length < 1"
:disabled="btn.disabled || menuItems.length < 1"
:color="btn.color"
class="my-2">
<v-icon size="large">
Expand All @@ -64,7 +78,7 @@
</v-btn>
</template>
<v-list>
<v-list-item v-for="(item, idx) of menu" :key="idx" :value="idx" @click="doCmd(item.cmd)">
<v-list-item v-for="(item, idx) of menuItems" :key="idx" :value="idx" @click="doCmd(item.cmd)">
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item>
</v-list>
Expand Down
2 changes: 1 addition & 1 deletion src/components/SettingsContent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
<v-col cols="12" md="6">
<v-form v-model="settings.isLangValid">
<v-text-field
v-model="settings.newlang"
v-model="settings.newLang"
:label="$t(preLang + 'newLang')"
:rules="[rules.iso639code, rules.uniqueLang]"
single-line
Expand Down
2 changes: 1 addition & 1 deletion src/components/SettingsPropsMain.vue
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
],
menu: [
{ type: 'defs', required: false, prop: 'btn', def: 'reading:value:icon:disabled:color:variant', help: 'level-element-menu-btn', assist: 'props' },
{ type: 'defs', required: false, prop: 'menu', def: 'reading:value:name:cmd', help: 'level-element-menu-menu', assist: 'props' },
{ type: 'defs', required: false, prop: 'menu', def: 'reading:value:name:cmd:convert', help: 'level-element-menu-menu', assist: 'props' },
{ type: 'defs', required: false, prop: 'divider', def: 'reading:value:divider', help: 'level-element-divider', assist: 'props' },
{ type: 'defs', required: false, prop: 'size', def: 'reading:value:size', help: 'level-element-size', assist: 'props' }
],
Expand Down
10 changes: 10 additions & 0 deletions www/fhemapp4/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# v4.0.38-beta (21.04.2024)
## Panel
- status now uses the colour variable *primary* analogous to the header of **FHEMApp**
## Panel menu
- add new function for handling FHEM get command
## Settings
- bugfix for adding new languages
## App
- adding default template lightscene
# v4.0.37-beta (20.04.2024)
## Settings
- Selection of FHEM devices optimised
## App
- adding default templates
## Core
- load all default templates on inizialising FHEMApp
- show header after config is loaded
# v4.0.36-beta (17.04.2024)
## App
- providing default templates
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a3a5a69

Please sign in to comment.